diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/doctrees/changelog.doctree b/doctrees/changelog.doctree new file mode 100644 index 00000000..6932afa2 Binary files /dev/null and b/doctrees/changelog.doctree differ diff --git a/doctrees/citing.doctree b/doctrees/citing.doctree new file mode 100644 index 00000000..182972f9 Binary files /dev/null and b/doctrees/citing.doctree differ diff --git a/doctrees/environment.pickle b/doctrees/environment.pickle new file mode 100644 index 00000000..cf781ee9 Binary files /dev/null and b/doctrees/environment.pickle differ diff --git a/doctrees/index.doctree b/doctrees/index.doctree new file mode 100644 index 00000000..80cb0cee Binary files /dev/null and b/doctrees/index.doctree differ diff --git a/doctrees/installation/configuration.doctree b/doctrees/installation/configuration.doctree new file mode 100644 index 00000000..47bcc6d5 Binary files /dev/null and b/doctrees/installation/configuration.doctree differ diff --git a/doctrees/installation/dependencies.doctree b/doctrees/installation/dependencies.doctree new file mode 100644 index 00000000..2b03ec5f Binary files /dev/null and b/doctrees/installation/dependencies.doctree differ diff --git a/doctrees/installation/index.doctree b/doctrees/installation/index.doctree new file mode 100644 index 00000000..434150d1 Binary files /dev/null and b/doctrees/installation/index.doctree differ diff --git a/doctrees/installation/test.doctree b/doctrees/installation/test.doctree new file mode 100644 index 00000000..163c7f16 Binary files /dev/null and b/doctrees/installation/test.doctree differ diff --git a/doctrees/keywords.doctree b/doctrees/keywords.doctree new file mode 100644 index 00000000..a564b5ab Binary files /dev/null and b/doctrees/keywords.doctree differ diff --git a/doctrees/license.doctree b/doctrees/license.doctree new file mode 100644 index 00000000..4dd56130 Binary files /dev/null and b/doctrees/license.doctree differ diff --git a/doctrees/mispr.common.doctree b/doctrees/mispr.common.doctree new file mode 100644 index 00000000..8366f451 Binary files /dev/null and b/doctrees/mispr.common.doctree differ diff --git a/doctrees/mispr.doctree b/doctrees/mispr.doctree new file mode 100644 index 00000000..4c45f249 Binary files /dev/null and b/doctrees/mispr.doctree differ diff --git a/doctrees/mispr.gaussian.doctree b/doctrees/mispr.gaussian.doctree new file mode 100644 index 00000000..0bde6820 Binary files /dev/null and b/doctrees/mispr.gaussian.doctree differ diff --git a/doctrees/mispr.gaussian.firetasks.doctree b/doctrees/mispr.gaussian.firetasks.doctree new file mode 100644 index 00000000..b0e7689c Binary files /dev/null and b/doctrees/mispr.gaussian.firetasks.doctree differ diff --git a/doctrees/mispr.gaussian.fireworks.doctree b/doctrees/mispr.gaussian.fireworks.doctree new file mode 100644 index 00000000..07fab70f Binary files /dev/null and b/doctrees/mispr.gaussian.fireworks.doctree differ diff --git a/doctrees/mispr.gaussian.utilities.doctree b/doctrees/mispr.gaussian.utilities.doctree new file mode 100644 index 00000000..c358fb0c Binary files /dev/null and b/doctrees/mispr.gaussian.utilities.doctree differ diff --git a/doctrees/mispr.gaussian.workflows.base.doctree b/doctrees/mispr.gaussian.workflows.base.doctree new file mode 100644 index 00000000..dd19ae35 Binary files /dev/null and b/doctrees/mispr.gaussian.workflows.base.doctree differ diff --git a/doctrees/mispr.gaussian.workflows.doctree b/doctrees/mispr.gaussian.workflows.doctree new file mode 100644 index 00000000..ce6ae330 Binary files /dev/null and b/doctrees/mispr.gaussian.workflows.doctree differ diff --git a/doctrees/mispr.hybrid.doctree b/doctrees/mispr.hybrid.doctree new file mode 100644 index 00000000..2dcb38f2 Binary files /dev/null and b/doctrees/mispr.hybrid.doctree differ diff --git a/doctrees/mispr.hybrid.firetasks.doctree b/doctrees/mispr.hybrid.firetasks.doctree new file mode 100644 index 00000000..b4ee6163 Binary files /dev/null and b/doctrees/mispr.hybrid.firetasks.doctree differ diff --git a/doctrees/mispr.hybrid.workflows.doctree b/doctrees/mispr.hybrid.workflows.doctree new file mode 100644 index 00000000..716189c0 Binary files /dev/null and b/doctrees/mispr.hybrid.workflows.doctree differ diff --git a/doctrees/mispr.lammps.doctree b/doctrees/mispr.lammps.doctree new file mode 100644 index 00000000..b8c706f3 Binary files /dev/null and b/doctrees/mispr.lammps.doctree differ diff --git a/doctrees/mispr.lammps.firetasks.doctree b/doctrees/mispr.lammps.firetasks.doctree new file mode 100644 index 00000000..2b9a5b3e Binary files /dev/null and b/doctrees/mispr.lammps.firetasks.doctree differ diff --git a/doctrees/mispr.lammps.fireworks.doctree b/doctrees/mispr.lammps.fireworks.doctree new file mode 100644 index 00000000..b000de45 Binary files /dev/null and b/doctrees/mispr.lammps.fireworks.doctree differ diff --git a/doctrees/mispr.lammps.tests.doctree b/doctrees/mispr.lammps.tests.doctree new file mode 100644 index 00000000..801dbf96 Binary files /dev/null and b/doctrees/mispr.lammps.tests.doctree differ diff --git a/doctrees/mispr.lammps.utilities.doctree b/doctrees/mispr.lammps.utilities.doctree new file mode 100644 index 00000000..d24df0e1 Binary files /dev/null and b/doctrees/mispr.lammps.utilities.doctree differ diff --git a/doctrees/mispr.lammps.workflows.doctree b/doctrees/mispr.lammps.workflows.doctree new file mode 100644 index 00000000..20898a63 Binary files /dev/null and b/doctrees/mispr.lammps.workflows.doctree differ diff --git a/doctrees/modules.doctree b/doctrees/modules.doctree new file mode 100644 index 00000000..8e30b6de Binary files /dev/null and b/doctrees/modules.doctree differ diff --git a/doctrees/overview.doctree b/doctrees/overview.doctree new file mode 100644 index 00000000..8f1cbd8b Binary files /dev/null and b/doctrees/overview.doctree differ diff --git a/doctrees/resources/faq.doctree b/doctrees/resources/faq.doctree new file mode 100644 index 00000000..e407c858 Binary files /dev/null and b/doctrees/resources/faq.doctree differ diff --git a/doctrees/resources/resources.doctree b/doctrees/resources/resources.doctree new file mode 100644 index 00000000..c0a4c0c0 Binary files /dev/null and b/doctrees/resources/resources.doctree differ diff --git a/doctrees/workflows/basics.doctree b/doctrees/workflows/basics.doctree new file mode 100644 index 00000000..785cc6ae Binary files /dev/null and b/doctrees/workflows/basics.doctree differ diff --git a/doctrees/workflows/custom.doctree b/doctrees/workflows/custom.doctree new file mode 100644 index 00000000..db747459 Binary files /dev/null and b/doctrees/workflows/custom.doctree differ diff --git a/doctrees/workflows/supported.doctree b/doctrees/workflows/supported.doctree new file mode 100644 index 00000000..e81c5455 Binary files /dev/null and b/doctrees/workflows/supported.doctree differ diff --git a/doctrees/workflows/tutorials.doctree b/doctrees/workflows/tutorials.doctree new file mode 100644 index 00000000..8e413367 Binary files /dev/null and b/doctrees/workflows/tutorials.doctree differ diff --git a/html/.buildinfo b/html/.buildinfo new file mode 100644 index 00000000..dfa58080 --- /dev/null +++ b/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 53aa0c497316ff79c248f7e4f876c526 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib b/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib new file mode 100644 index 00000000..af6f0ea5 --- /dev/null +++ b/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib @@ -0,0 +1,10 @@ +@article{atwi2022automated, + title={An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions}, + author={Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi}, + journal={Nature Computational Science}, + volume={2}, + number={2}, + pages={112--122}, + year={2022}, + publisher={Nature Publishing Group} +} diff --git a/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py b/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py new file mode 100644 index 00000000..3ab646df --- /dev/null +++ b/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py @@ -0,0 +1,16 @@ +from fireworks import LaunchPad + +from mispr.gaussian.workflows.base.esp import get_esp_charges + +lpad = LaunchPad.auto_load() + +wf, _ = get_esp_charges( + mol_operation_type="get_from_pubchem", # (1)! + mol="monoglyme", + format_chk=True, + save_to_db=True, + save_to_file=True, + additional_prop_doc_fields={"name": "monoglyme"}, + tag="mispr_tutorial", +) +lpad.add_wf(wf) # (2)! diff --git a/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib b/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib new file mode 100644 index 00000000..3d60a500 --- /dev/null +++ b/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib @@ -0,0 +1,5 @@ +@article{atwi2022mispr, + title={MISPR: An automated infrastructure for high-throughput DFT and MD simulations}, + author={Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi}, + year={2022} +} diff --git a/html/_images/analysis.png b/html/_images/analysis.png new file mode 100644 index 00000000..2c8fa034 Binary files /dev/null and b/html/_images/analysis.png differ diff --git a/html/_images/convergence.png b/html/_images/convergence.png new file mode 100644 index 00000000..a0abc66c Binary files /dev/null and b/html/_images/convergence.png differ diff --git a/html/_images/document.png b/html/_images/document.png new file mode 100644 index 00000000..4a59e8ef Binary files /dev/null and b/html/_images/document.png differ diff --git a/html/_images/overview.png b/html/_images/overview.png new file mode 100644 index 00000000..da7be327 Binary files /dev/null and b/html/_images/overview.png differ diff --git a/html/_images/summary.jpeg b/html/_images/summary.jpeg new file mode 100644 index 00000000..e4ae3800 Binary files /dev/null and b/html/_images/summary.jpeg differ diff --git a/html/_images/workflow.png b/html/_images/workflow.png new file mode 100644 index 00000000..e124bfdb Binary files /dev/null and b/html/_images/workflow.png differ diff --git a/html/_modules/index.html b/html/_modules/index.html new file mode 100644 index 00000000..c539eaa3 --- /dev/null +++ b/html/_modules/index.html @@ -0,0 +1,737 @@ + + + + + + + + + + + + + + + + Overview: module code - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_modules/mispr/gaussian/utilities/dbdoc.html b/html/_modules/mispr/gaussian/utilities/dbdoc.html new file mode 100644 index 00000000..d035e5da --- /dev/null +++ b/html/_modules/mispr/gaussian/utilities/dbdoc.html @@ -0,0 +1,907 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities.dbdoc - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Source code for mispr.gaussian.utilities.dbdoc

+"""Define functions for cleaning up JSON documents."""
+
+import os
+import logging
+
+from pymatgen.io.gaussian import GaussianInput
+from pymatgen.core.structure import Molecule
+
+from mispr.gaussian.defaults import JOB_TYPES, SCRF_MODELS
+from mispr.gaussian.utilities.metadata import get_chem_schema
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+def _job_types(gin):
+    """
+    Determine the type of the Gaussian job (e.g. opt, freq, etc.) from a Gaussian input
+    dictionary.
+
+    Args:
+        gin (dict): Gaussian input dictionary.
+
+    Returns:
+        list: List of Gaussian job types.
+    """
+    return sorted(
+        list(
+            filter(
+                lambda x: x
+                in {k.lower(): v for k, v in gin["route_parameters"].items()},
+                JOB_TYPES,
+            )
+        )
+    )
+
+
+def _modify_gout(gout):
+    """
+    Modify the Gaussian output dictionary by removing unnecessary keys and restructuring
+    its format to match the schema of the db.
+
+    Args:
+        gout (dict): Gaussian output dictionary.
+
+    Returns:
+        dict: Modified Gaussian output dictionary.
+    """
+    gout["input"]["charge"] = gout["charge"]
+    gout["input"]["spin_multiplicity"] = gout["spin_multiplicity"]
+    del_keys_out = (
+        "nsites",
+        "unit_cell_formula",
+        "reduced_cell_formula",
+        "pretty_formula",
+        "elements",
+        "nelements",
+        "charge",
+        "spin_multiplicity",
+    )
+    [gout.pop(k, None) for k in del_keys_out]
+    return gout
+
+
+def _create_gin(gout, working_dir, input_file):
+    """
+    Create a Gaussian input dictionary to be used for creating Gaussian documents in
+    the db; if an input_file is provided, content of the dictionary is mostly taken from
+    it; otherwise, uses the gout to create the dictionary.
+
+    Args:
+        gout (dict): Gaussian output dictionary.
+        working_dir (str): Working directory of the Gaussian input_file.
+        input_file (str): Relative or absolute path to the input_file.
+
+    Returns:
+        dict: Gaussian input dictionary.
+    """
+    if input_file:
+        if not os.path.isabs(input_file):
+            input_path = os.path.join(working_dir, input_file)
+        else:
+            input_path = input_file
+        gin = GaussianInput.from_file(input_path).as_dict()
+        gin["nbasisfunctions"] = gout["input"]["nbasisfunctions"]
+        gin["pcm_parameters"] = gout["input"]["pcm_parameters"]
+        return gin
+    else:
+        gin = gout["input"]
+        gin["input_parameters"] = None
+        gin["@class"] = "GaussianInput"
+        gin["@module"] = "pymatgen.io.gaussian"
+        logger.info(
+            "input parameters at the end of the Gaussian input "
+            "section will not be saved to the database due to "
+            "a missing input file"
+        )
+        return gin
+
+
+def _cleanup_gout(gout, working_dir, input_file):
+    """
+    Clean up the Gaussian dictionary to be saved in the database.
+
+    Args:
+        gout (dict): Gaussian output dictionary.
+        working_dir (str): Working directory of the Gaussian input_file.
+        input_file (str): Relative or absolute path to the input_file.
+
+    Returns:
+        dict: Cleaned up Gaussian dictionary.
+    """
+    gout = _modify_gout(gout)
+    gin = _create_gin(gout, working_dir, input_file)
+    del gout["input"]
+    gauss_version = gout["output"]["gauss_version"]
+    del gout["output"]["gauss_version"]
+    job_types = _job_types(gin)
+    mol = Molecule.from_dict(gout["output"]["molecule"])
+    gout_dict = {
+        "input": gin,
+        "output": gout,
+        "functional": gin["functional"],
+        "basis": gin["basis_set"],
+        "phase": "solution" if gout["is_pcm"] else "gas",
+        "type": ";".join(job_types),
+        **get_chem_schema(mol),
+        "gauss_version": gauss_version,
+    }
+    gout_dict = {
+        i: j
+        for i, j in gout_dict.items()
+        if i not in ["sites", "@module", "@class", "charge", "spin_multiplicity"]
+    }
+    return gout_dict
+
+
+
[docs]def add_solvent_to_prop_dict(prop_dict, solvent_gaussian_inputs, solvent_properties): + """ + Add solvent properties to a property dictionary (e.g. BDE, BE, etc.). + + Args: + prop_dict (dict): Property dictionary. + solvent_gaussian_inputs (str): Gaussian input parameters corresponding to the + implicit solvent model used in the Gaussian calculations, e.g. + "(Solvent=TetraHydroFuran)". + solvent_properties (dict): Additional solvent input parameters used in the + Gaussian calculations; e.g., {"EPS":12}. + + Returns: + dict: Property dictionary with solvent properties added. + """ + if not solvent_gaussian_inputs: + solvent = "water" + solvent_model = "pcm" + else: + solvent_inputs = [ + i.lower() for i in solvent_gaussian_inputs.strip("()").split(",") + ] + solvent = [ + string.split("=")[1] for string in solvent_inputs if "solvent" in string + ] or ["water"] + solvent_model = list( + filter(lambda x: x in {i for i in solvent_inputs}, SCRF_MODELS) + ) or ["pcm"] + prop_dict["solvent"] = "".join(solvent) + prop_dict["solvent_model"] = "".join(solvent_model) + prop_dict["solvent_properties"] = solvent_properties + return prop_dict
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_modules/mispr/gaussian/utilities/files.html b/html/_modules/mispr/gaussian/utilities/files.html new file mode 100644 index 00000000..18812dcc --- /dev/null +++ b/html/_modules/mispr/gaussian/utilities/files.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities.files - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Source code for mispr.gaussian.utilities.files

+"""Define utility functions for handling files and paths."""
+
+import os
+import logging
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def bibtex_parser(bib_file, working_dir): + """ + Parse a bibtex file and returns a dictionary of the entries. + + Args: + bib_file (str): Relative or absolute path to the bibtex file. + working_dir (str): Name of the working directory where the bibtex file is + located if bib_file path is relative; else None. + + Returns: + dict: Dictionary of the entries in the bibtex file. + """ + try: + import bibtexparser + except ModuleNotFoundError: + raise ImportError( + "Defining standard electrode potential " + "references requires bibtexparser to be " + "installed." + ) + bib_file = recursive_relative_to_absolute_path(bib_file, working_dir) + print(bib_file) + with open(bib_file) as bibfile: + bp = bibtexparser.load(bibfile) + entry = bp.entries[0] + return entry
+ + +
[docs]def recursive_relative_to_absolute_path(operand, working_dir): + """ + Convert recursively relative paths to absolute paths. + + Args: + operand (str, list, dict): File, list of files, or a dictionary where the values + are the files; the file(s) path can be relative or absolute. + working_dir (str): Name of the working directory where the file(s) is/are + located if operand path is relative; else None. + + Returns: + str or list or dict: File, list of files, or dict where the values are the + absolute paths. + """ + if isinstance(operand, str): + if os.path.isabs(operand): + return operand + elif os.path.exists(operand): + return os.path.join(os.getcwd(), operand) + else: + full_path = os.path.join(working_dir, operand) + if os.path.exists(full_path): + return full_path + else: + return operand + elif isinstance(operand, dict): + return { + i: recursive_relative_to_absolute_path(j, working_dir) + for i, j in operand.items() + } + elif isinstance(operand, list): + return [recursive_relative_to_absolute_path(i, working_dir) for i in operand] + else: + return operand
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_modules/mispr/gaussian/utilities/inputs.html b/html/_modules/mispr/gaussian/utilities/inputs.html new file mode 100644 index 00000000..7621f141 --- /dev/null +++ b/html/_modules/mispr/gaussian/utilities/inputs.html @@ -0,0 +1,956 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities.inputs - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Source code for mispr.gaussian.utilities.inputs

+"""Define functions for handling gaussian inputs."""
+
+import logging
+
+from copy import deepcopy
+
+from mispr.gaussian.defaults import STANDARD_OPT_GUASSIAN_INPUT
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+def _add_solvent_inputs(
+    gaussian_inputs, solvent_gaussian_inputs, solvent_properties=None
+):
+    """
+    Add solvent inputs to the gaussian_inputs dict. The input parameters relevant to
+    implicit solvation are required to be provided separate from the gaussian_inputs
+    dict to the Gaussian workflows. This is done in order to easily save the solvent
+    properties to the database or to the json files generated from the workflows.
+
+    Args:
+        gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs for one
+            or more Gaussian job type, e.g.
+
+            .. code-block:: python
+
+                {"opt": {
+                    "functional": "B3LYP",
+                    "basis_set": "6-31G",
+                    "route_parameters": {
+                        "Opt": "(calcfc, tight)",
+                        "test": None},
+                        }
+                }
+
+        solvent_gaussian_inputs (str): String of Gaussian inputs for the solvent, e.g.
+            "(Solvent=Generic, Read)".
+        solvent_properties (dict, optional): Dictionary of solvent properties, e.g.
+            {"Eps": 4.33, "EpsInf": 1.69}.
+
+    Returns:
+        dict: Dictionary of dictionaries of Gaussian inputs with solvent inputs added.
+    """
+    if "generic" in solvent_gaussian_inputs.lower() and not solvent_properties:
+        raise Exception(
+            "A generic solvent is provided as an input without "
+            "specifying its parameters."
+        )
+    for key, value in gaussian_inputs.items():
+        if "route_parameters" not in value:
+            gaussian_inputs[key]["route_parameters"] = {}
+        gaussian_inputs[key]["route_parameters"]["SCRF"] = solvent_gaussian_inputs
+        if solvent_properties:
+            if "input_parameters" not in gaussian_inputs[key]:
+                gaussian_inputs[key]["input_parameters"] = {}
+            gaussian_inputs[key]["input_parameters"].update(solvent_properties)
+    return gaussian_inputs
+
+
+def _check_solvent_inputs(gaussian_inputs):
+    """
+    Ensure that implicit solvent parameters are not included in the Gaussian input
+    dictionaries, since those should be provided separately.
+
+    Args:
+        gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs for one
+            or more Gaussian job type, e.g.
+
+            .. code-block:: python
+                {"opt": {
+                    "functional": "B3LYP",
+                    "basis_set": "6-31G",
+                    "route_parameters": {
+                        "Opt": "(calcfc, tight)",
+                        "test": None},
+                        }
+                }
+    """
+    route_params = {}
+    for key, value in gaussian_inputs.items():
+        if value:
+            route_params.update(value.get("route_parameters", {}))
+    assert "scrf" not in [i.lower() for i in route_params], (
+        "solvent inputs should be provided as separate inputs via "
+        "solvent_gaussian_inputs and solvent_properties"
+    )
+
+
+def _get_gaussian_inputs(gaussian_inputs, supported_jobs=None):
+    """
+    This function is meant to be used in workflows in which multiple Gaussian jobs are
+    performed and the jobs share similar Gaussian keywords; used to handle situations
+    in which the user is not explicitly defining every single job input dictionary.
+
+    Args:
+        gaussian_inputs (dict): Dictionary of dictionaries of Gaussian input parameters
+            for different job types in a given workflow, e.g.
+
+            .. code-block:: python
+                {"opt": {}, "freq": {}, "nmr": {}, "esp": {}, "sp": {}}
+
+        supported_jobs (dict, optional): Dictionary of dictionaries of supported job
+            types and their main inputs, e.g.
+
+            .. code-block:: python
+                {"opt": {"Opt": None}, "nmr": {"NMR": "GIAO"}}
+
+    Returns:
+        dict: Dictionary of dictionaries of Gaussian input parameters.
+    """
+    supported_jobs = supported_jobs or {}
+    supported_jobs = {
+        **{
+            "freq": {"Freq": None},
+            "nmr": {"NMR": "GIAO"},
+            "esp": {"pop": "MK", "iop(6/50=1)": None},
+            "sp": {"SP": None},
+        },
+        **{k.lower(): v for k, v in supported_jobs.items()},
+    }
+
+    gaussian_inputs = {
+        k.lower(): v if v is not None else {} for k, v in gaussian_inputs.items()
+    }
+
+    if "opt" not in gaussian_inputs:
+        gaussian_inputs["opt"] = {}
+    gaussian_inputs["opt"] = {**STANDARD_OPT_GUASSIAN_INPUT, **gaussian_inputs["opt"]}
+    if "opt" not in [i.lower() for i in gaussian_inputs["opt"]["route_parameters"]]:
+        gaussian_inputs["opt"]["route_parameters"].update({"Opt": None})
+
+    for job in gaussian_inputs:
+        if job in supported_jobs and job != "opt":
+            gaussian_inputs[job] = _update_gaussian_inputs(
+                deepcopy(gaussian_inputs["opt"]),
+                gaussian_inputs[job],
+                supported_jobs[job],
+            )
+        elif job == "opt":
+            pass
+        else:
+            logger.error(
+                "keyword for {} is not known. Please add keyword to "
+                "the supported_jobs dict.".format(job)
+            )
+    return gaussian_inputs
+
+
+def _update_gaussian_inputs(opt_gaussian_inputs, other_gaussian_inputs, main_keyword):
+    """
+    Use the fully defined optimization input parameters to fill in the input parameters
+    for other job types in a given workflow. Done to avoid having to define every single
+    job input dictionary.
+
+    Args:
+        opt_gaussian_inputs (dict): Dictionary of Gaussian input parameters for the
+            optimization step of a given workflow.
+        other_gaussian_inputs (dict): Dictionary of Gaussian inputs other than the
+            route_parameters (e.g. input_parameters) for a job other than optimization
+            in a given workflow.
+        main_keyword (dict): Simple dictionary containing the main Gaussian
+            route_parameters for the job type, e.g. {"Freq": None} for a frequency
+            analysis.
+
+    Returns:
+        dict: Dictionary of Gaussian input parameters for a job other than optimization.
+    """
+    gaussian_inputs = {**opt_gaussian_inputs, **other_gaussian_inputs}
+    if list(main_keyword.keys())[0].lower() not in [
+        i.lower() for i in gaussian_inputs["route_parameters"]
+    ]:
+        gaussian_inputs["route_parameters"].update(main_keyword)
+    for i in gaussian_inputs["route_parameters"]:
+        if i.lower() == "opt":
+            del gaussian_inputs["route_parameters"][i]
+            break
+    return gaussian_inputs
+
+
+
[docs]def handle_gaussian_inputs( + gaussian_inputs, solvent_gaussian_inputs=None, solvent_properties=None +): + """ + Wrapper function to cleanup/modify the Gaussian input parameters for one or more + job in a workflow. Checks for implicit solvent parameters and adds missing keywords + for a given job. + + Args: + gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs, e.g. + + .. code-block:: python + + {"opt": {opt_gaussian_inputs}, "freq": {freq_gaussian_inputs}} + + solvent_gaussian_inputs (str, optional): String of Gaussian inputs for the + solvent, e.g. + + .. code-block:: python + + "(Solvent=Generic, Read)" + + solvent_properties (dict, optional): Dictionary of solvent properties, e.g. + + .. code-block:: python + + {"Eps": 4.33, "EpsInf": 1.69} + + Returns: + dict: Dictionary of dictionaries of reformatted Gaussian inputs. + """ + gaussian_inputs = _get_gaussian_inputs(gaussian_inputs) + _check_solvent_inputs(gaussian_inputs) + if solvent_gaussian_inputs: + gaussian_inputs = _add_solvent_inputs( + gaussian_inputs, solvent_gaussian_inputs, solvent_properties + ) + return gaussian_inputs
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_modules/mispr/gaussian/utilities/metadata.html b/html/_modules/mispr/gaussian/utilities/metadata.html new file mode 100644 index 00000000..749d0bf3 --- /dev/null +++ b/html/_modules/mispr/gaussian/utilities/metadata.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities.metadata - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Source code for mispr.gaussian.utilities.metadata

+"""Define functions for creating db schema."""
+
+import logging
+
+from openbabel import pybel as pb
+
+from pymatgen.io.babel import BabelMolAdaptor
+from pymatgen.core.structure import Molecule
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def get_chem_schema(mol): + """ + Return a dictionary of chemical schema for a given molecule to use in building db + documents or json file. + + Args: + mol (Molecule): Molecule object. + + Returns: + dict: Chemical schema. + """ + mol_dict = mol.as_dict() + comp = mol.composition + a = BabelMolAdaptor(mol) + pm = pb.Molecule(a.openbabel_mol) + # svg = pm.write('svg') + mol_dict.update( + { + "smiles": pm.write("smi").strip(), + "inchi": pm.write("inchi").strip("\n"), + "formula": comp.formula, + "formula_pretty": comp.reduced_formula, + "formula_anonymous": comp.anonymized_formula, + "formula_alphabetical": comp.alphabetical_formula, + "chemsys": comp.chemical_system, + "nsites": mol.num_sites, + "nelements": len(comp.chemical_system.replace("-", " ").split(" ")), + "is_ordered": mol.is_ordered, + "is_valid": mol.is_valid(), + } + ) + return mol_dict
+ + +
[docs]def get_mol_formula(mol): + """ + Get the alphabetical molecular formula for a molecule. + + Args: + mol (Molecule): Molecule object + + Returns: + str: Alphabetical molecular formula. + """ + mol_schema = get_chem_schema(mol) + return mol_schema["formula_alphabetical"].replace(" ", "")
+ + +
[docs]def get_job_name(mol, name): + """ + Append a molecule label to the name of a workflow for easy monitoring and + identification. + + Args: + mol (Molecule or str): If a Molecule is provided, the appended label will be + the molecular formula; otherwise the label will be the provided string. + name (str): Original name of the workflow. + + Returns: + str: Job name with molecule label. + """ + if not isinstance(mol, Molecule): + job_name = "{}_{}".format(mol, name) + else: + mol_formula = get_mol_formula(mol) + job_name = "{}_{}".format(mol_formula, name) + return job_name
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_modules/mispr/gaussian/utilities/misc.html b/html/_modules/mispr/gaussian/utilities/misc.html new file mode 100644 index 00000000..7a6d59eb --- /dev/null +++ b/html/_modules/mispr/gaussian/utilities/misc.html @@ -0,0 +1,828 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities.misc - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Source code for mispr.gaussian.utilities.misc

+"""Define miscellaneous functions useful in many of the mispr levels."""
+
+import logging
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def pass_gout_dict(fw_spec, key): + """ + Helper function used in the Gaussian Fireworks to pass Gaussian output dictionaries + from one task to the other, while checking that the criteria for starting the + following task are met (e.g. normal termination of the previous job, lack of + imaginary frequencies, etc.). + + Args: + fw_spec (dict): Firework spec dictionary. + key (str): Unique key for the Gaussian output dictionary in fw_spec. + + Returns: + dict: Gaussian output dictionary. + """ + gout_dict = fw_spec.get("gaussian_output", {}).get(key) + proceed_keys = fw_spec.get("proceed", {}) + for k, v in proceed_keys.items(): + if gout_dict["output"].get(k, gout_dict["output"]["output"].get(k)) != v: + raise ValueError(f"The condition for {k} is not met, Terminating") + return gout_dict
+ + +
[docs]def recursive_signature_remove(d): + """ + Remove Recursively the signature "@" from a dictionary (e.g. those in the name of + a module). Used when processing Gaussian runs before saving them to the db. + + Args: + d (dict): Dictionary to remove the signature from. + + Returns: + dict: Dictionary with the signature removed. + """ + # TODO: check if this is no longer an issue with MongoDB 5.0 + if isinstance(d, dict): + return { + i: recursive_signature_remove(j) + for i, j in d.items() + if not i.startswith("@") + } + else: + return d
+ + +
[docs]def recursive_compare_dicts(dict1, dict2, dict1_name, dict2_name, path=""): + """ + Compare recursively two dictionaries and returns the differences. + + Args: + dict1 (dict): First dictionary to compare. + dict2 (dict): Second dictionary to compare. + dict1_name (str): Name of the first dictionary (for messages on the differences). + dict2_name (str): Name of the second dictionary (for messages on the differences). + path (str, optional): Used internally to keep track of the keys in nested dicts, + meant to be "" for the top level + + Returns: + str: Differences between the two dictionaries (if any). + """ + error = "" + old_path = path + for key in dict1.keys(): + path = f"{old_path}[{key}]" + if key not in dict2.keys(): + error += f"Key {dict1_name}{path} not in {dict2_name}\n" + else: + if isinstance(dict1[key], dict) and isinstance(dict2[key], dict): + error += recursive_compare_dicts( + dict1[key], dict2[key], "d1", "d2", path + ) + else: + if dict1[key] != dict2[key]: + error += ( + f"Value of {dict1_name}{path} ({dict1[key]}) " + f"not same as {dict2_name}{path} ({dict2[key]})\n" + ) + + for key in dict2.keys(): + path = f"{old_path}[{key}]" + if key not in dict1.keys(): + error += f"Key {dict2_name}{path} not in {dict1_name}\n" + return error
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/_sources/changelog.rst.txt b/html/_sources/changelog.rst.txt new file mode 100644 index 00000000..04e530a4 --- /dev/null +++ b/html/_sources/changelog.rst.txt @@ -0,0 +1,15 @@ +========= +Changelog +========= + +**v0.0.1** + +* Initial release (R. Atwi and M. Bliss) + +**v0.0.4** + +* Support for retrieving molecules from pubchem directly and using them in the workflows +* Support for OPLS 2005 ff by running Maestro in the backend +* Option for charge scaling of ionic species when preparing the lammps data file +* Automatic identification of system element types when creating dump files in lammps simulations +* Addition of MDPropTools package for analysis of MD trajectories as dependency \ No newline at end of file diff --git a/html/_sources/citing.rst.txt b/html/_sources/citing.rst.txt new file mode 100644 index 00000000..62f5ed50 --- /dev/null +++ b/html/_sources/citing.rst.txt @@ -0,0 +1,33 @@ +=============================== +Citing MISPR +=============================== +If you find MISPR useful in your research, please consider citing the following papers: + +**Paper 1 (MISPR):** + +.. code-block:: bibtex + + @article{atwi2022mispr, + title = {MISPR: An automated infrastructure for high-throughput DFT and MD simulations}, + author = {Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi}, + year = {2022} + } + +Download as :download:`BibTeX <_static/mispr_citation.bib>` + +**Paper 2 (Hybrid NMR Workflow):** + +.. code-block:: bibtex + + @article{atwi2022automated, + title = {An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions}, + author = {Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi}, + journal = {Nature Computational Science}, + volume = {2}, + number = {2}, + pages = {112--122}, + year = {2022}, + publisher = {Nature Publishing Group} + } + +Download as :download:`BibTeX <_static/nmr_citation.bib>` \ No newline at end of file diff --git a/html/_sources/index.rst.txt b/html/_sources/index.rst.txt new file mode 100644 index 00000000..75c74c72 --- /dev/null +++ b/html/_sources/index.rst.txt @@ -0,0 +1,149 @@ +:orphan: + +.. title:: MISPR documentation + +.. module:: mispr + +.. toctree:: + :hidden: + + overview + keywords + +.. toctree:: + :caption: Installation πŸ”§ + :hidden: + :titlesonly: + + Overview + Prerequisites + Configuration Files + Running a Test Workflow + +.. toctree:: + :caption: Workflows πŸ”€ + :hidden: + + workflows/basics + workflows/supported + workflows/tutorials + workflows/custom + +.. toctree:: + :caption: Resources πŸ–‡οΈ + :hidden: + + resources/faq + resources/resources + +.. toctree:: + :caption: Code Documentation πŸ“š + :hidden: + :titlesonly: + + mispr + +.. toctree:: + :caption: Development πŸ’» + :hidden: + + changelog + citing + license + +################################## +MISPR |release| Documentation +################################## + +MISPR is a Python library for computational materials science and contains +preset workflows for running complex hierarchical density functional +theory (DFT) and classical molecular dynamics (MD) simulations to compute +properties of materials. + +.. figure:: _static/summary.jpeg + :scale: 70% + + +************* +Installation +************* + +.. grid:: 1 1 2 2 + + .. grid-item:: + + Install using `pip `__: + + .. code-block:: bash + + pip install mispr + +.. important:: + Before you can start using MISPR, there are additional steps you need to follow. + Please refer to the :doc:`installation guide ` for complete setup instructions, + including any dependencies or configuration files required. + + +******************* +Learning Resources +******************* + +.. grid:: 1 1 2 2 + + .. grid-item-card:: + :padding: 2 + + About MISPR + ^^^ + + - :doc:`Overview ` + - :doc:`Dependencies and prerequisites ` + + .. grid-item-card:: + :padding: 2 + + Workflows + ^^^ + + - :doc:`Workflow basics ` + - :doc:`Supported workflows ` + - :doc:`External learning resources ` + + .. grid-item-card:: + :padding: 2 + + How-tos + ^^^ + + - :doc:`Tutorials ` + - :doc:`MISPR FAQ ` + + .. grid-item-card:: + :padding: 2 + + Code documentation + ^^^ + - :doc:`Subpackages ` + +************************************ +Contributing / Reporting / Support +************************************ +Contirbuting to MISPR can be in the form of: + +* Requesting or adding new workflows and features +* Reporting or fixing bugs and issues +* Contributing to the documentation and/or examples + +If you want to add or change something in the code, you can do this by +forking `MISPR on GitHub `_ and +submitting a pull request. + +If you submit a bug report, we will review it and move it to GitHub issues, +where its progress can be tracked. + +For other inquiries, please contact us at rasha.atwi@stonybrook.edu. + + + + + diff --git a/html/_sources/installation/configuration.rst.txt b/html/_sources/installation/configuration.rst.txt new file mode 100644 index 00000000..1a837086 --- /dev/null +++ b/html/_sources/installation/configuration.rst.txt @@ -0,0 +1,259 @@ +=============================== +Configuration Files +=============================== +After setting up the environment and installing the software, you will +need to configure the software to work with your system. This is done by +creating the following set of configuration files. + +.. note:: + This page is intended to help you get set-up for the first time using + FireWorks and MISPR so you can learn how these software work. Please + refer to the `FireWorks `__ + documentation for more information on these files and how FireWorks works. + Here, we will only discuss the basic configuration options which are + sufficient for using MISPR as in this tutorial. + + +Writing the Configuration Files +------------------------------------ + +.. tab-set:: + + .. tab-item:: db.json + + This file contains the basic MongoDB information like the + credentials required to connect to the database where the + calculation outputs will be stored. Note that + JSON strings require double quotes except for the value of + "port" which is an integer. + + .. code-block:: json + + { + "admin_user": "|ADMIN_USERNAME|", + "admin_password": "|ADMIN_PASSWORD|", + "aliases": {}, + "collection": "|COLLECTION|", + "database": "|DB_NAME|", + "host": "|HOSTNAME|", + "port": |PORT|, + } + + .. tab-item:: my_fworker.yaml + + This file stores your FireWorker's credentials. In + the `FireWorks `__, a + FireWorker can be as simple as the workstation used to host the + LaunchPad or complicated like a supercomputing center with a + queueing system. + + .. code-block:: yaml + + name: |WORKER_NAME| + category: '' + query: '{}' + env: + db_file: |CODES_DIR|/config/db.json + scratch_dir: null + + The following parameters are defined in the file: + + * ``name``: the name of the worker where your job will be run; + this is helpful when you have multiple workers; see + `FireWorks documentation on controlling the Worker `_ + if you need more information on setting up this file if you are + using more than one worker. + + * ``category`` and ``queue``: these parameters can control which + calculations are run on which worker; the default settings will + allow all calculations to be run + + * ``env``: defines worker-specific settings like the path to the + db file and the scratch directory for fast disk access + + .. tab-item:: my_launchpad.yaml + + This is the FireWorks LaunchPad file that contains the MongoDB + credentials required to connect to the database for storing + and managing workflows within FireWorks. Note that the ``db.json`` + file we created earlier is used to connect to the database + where the results are stored and is used by MISPR while + ``my_launchpad.yaml`` is used by FireWorks. The two databases + can be the same or different databases. If they are the same databases, + then the information here will be mostly the same as that in the + ``db.json`` file. + + .. code-block:: yaml + + host: |HOSTNAME| + port: |PORT| + name: |LAUNCHPAD_NAME| + username: |ADMIN_USERNAME| + password: |ADMIN_PASSWORD| + logdir: null + strm_lvl: INFO + user_indices: [] + wf_user_indices: [] + authsource: null + uri_mode: |URI_MODE| + mongoclient_kwargs: {} + + The following parameters need to be defined in the file: + + * ``host``: the hostname of the MongoDB server + + * ``port``: the port number of the MongoDB server + + * ``name``: the name of the MongoDB server + + * ``username``: the username to connect to the MongoDB server + + * ``password``: the password to connect to the MongoDB server + + Note that if the ``uri_mode`` is set to true, the ``host`` + should be the full `URI string `_. + In this case, the ``username`` and ``password`` are not used. + + If you want to pass other custom keyword arguments + (e.g., SSL/TLS arguments) to the MongoClient connection, you + can do that via ``mongoclient_kwargs``. See + `pymongo documentation `_ + for more details. + + .. tab-item:: my_qadapter.yaml + + This is the queue adapter file required by FireWorks to + automatically communicate with the queueing system. + The example provided here is for SLURM machines and does not + include a full list of possible parameters, but you can + check the rest of the parameters or parameters that can be + specified for other queue systems (e.g., PBS, SGE, etc.) + `here `_. + + .. code-block:: yaml + + _fw_name: CommonAdapter + _fw_q_type: SLURM + rocket_launch: rlaunch -w |CODES_DIR|/config singleshot + nodes: 1 + walltime: 24:00:00 + queue: null + account: null + job_name: null + pre_rocket: null + post_rocket: null + logdir: |CODES_DIR|/logs + + The following parameters are defined in the file: + + * ``_fw_name``: ``CommonAdapter`` means that the queue is one of + the built-in queue systems + + * ``_fw_q_type``: the queue system type (e.g., SLURM, PBS, SGE, etc.) + + * ``rocket_launch``: the method to use for launching Rockets + + * ``nodes``, ``walltime``, ``queue``, ``account``, ``job_name``: + parameters you normally specify in your SLURM script for + allocating resources + + * ``pre_rocket`` and ``post_rocket``: the commands to run + before and after launching the Rocket (e.g., module load + packages) + + * ``logdir``: path to the log directory + + .. note:: + Specifying singleshot in the file will limit each + reserved job to running only one firework at a time even if other + fireworks are waiting to be run. This can be changed to rapidfire + to run all fireworks in parallel. You can go over the FireWorks + documentation to learn the difference between these launching modes. + + .. tab-item:: config.ini + + This file contains the commands to run Gaussian, LAMMPS, and AmberTools. + These commands are specific to your computing resources you are + running on. The example provided here is meant to show how these + commands should be defined, but you need to change them to match your + system. + + .. code-block:: yaml + + [RunCalc] + gcmd: g16 < "$input_path$" > "$output_path$" + formchkcmd: formchk "$input_path$" "$output_path$" + + [LammpsRunCalc] + lcmd: mpirun -np $SLURM_NTASKS lmp_mpi -in $control_path$ + lammps_gpu_cmd: null + + [AmbertoolsRunCalc] + acmd: antechamber -i $input_file$ -fi $input_type$ -o $output_file$ -fo $output_type$ -c $charge_method$ -s 2 + pcmd: parmchk2 -i $input_file$ -f mol2 -o $output_file$ + tcmd: tleap -f $input_file$ + + [MaestroCalc] + mae_cmd: $SCHRODINGER/utilities/structconvert $input_file$ $output_file$ + ffld_cmd: $SCHRODINGER/utilities/ffld_server -imae $input_file$ -version 14 -print_parameters -out_file $output_file$ + + The following commands are defined in the file: + + * ``gcmd``: the command to run Gaussian + * ``formchkcmd``: the command to run Gaussian formchk to convert + a Gaussian checkpoint file into formatted forms + * ``lcmd``: the command to run LAMMPS + * ``lammps_gpu_cmd``: the command to run LAMMPS on a GPU + * ``acmd``: the command to run Antechamber + * ``pcmd``: the command to run Parmchk2 + * ``tcmd``: the command to run tleap + + .. note:: + Anything between two dollar signs ($ $) is a placeholder for + a variable and should not be changed. + + Anything between the square brackets ([]), e.g., [RunCalc], + or before the colons (:), e.g., gmcd, should not be changed + since these are used to point MISPR to the commands to run. + + .. tab-item:: FW_config.yaml + + This is the master FireWorks configuration file that controls + FireWorks settings and points to the location of the other + configuration files. + + .. code-block:: yaml + + CONFIG_FILE_DIR: |CODES_DIR|/config + + The ``CONFIG_FILE_DIR`` is expected to contain the + other configuration files. For a list of control settings that + can be added to this file, check + `FireWorks documentation on modifying the FW config `_. + +Configuring Bash Profile +------------------------------ +After creating the above six configuration files and replacing the +placeholders with your specific settings, create a directory in +your ``|CODES_DIR|`` (see :doc:`Definition <../keywords>`) called ``config`` +and move the above configuration files into it. The ``|CODES_DIR|/config`` +should look like: + +:: + + config + β”œβ”€β”€ config.ini + β”œβ”€β”€ db.json + β”œβ”€β”€ FW_config.yaml + β”œβ”€β”€ my_fworker.yaml + β”œβ”€β”€ my_launchpad.yaml + └── my_qadapter.yaml + +Now, append the following lines to your ``.bash_profile`` or ``.bashrc`` +file in order to set an environment variable that tells FireWorks where +to find the ``FW_config.yaml`` file, which will in turn tell FireWorks +where the rest of the configuration files are: + +.. code-block:: bash + + export FW_CONFIG_FILE=|CODES_DIR|/config/FW_config.yaml \ No newline at end of file diff --git a/html/_sources/installation/dependencies.rst.txt b/html/_sources/installation/dependencies.rst.txt new file mode 100644 index 00000000..7cc079e1 --- /dev/null +++ b/html/_sources/installation/dependencies.rst.txt @@ -0,0 +1,176 @@ +=============================== +Prerequisites +=============================== + +Virtual python environment +------------------------------ +MISPR depends on a number of third party Python packages, and usually on +specific versions of those packages. In order not to interfere with third +party packages needed by other software on your machine or cluster, we +strongly recommend isolating MISPR in a virtual python environment. In the +following, we describe how to create a virtual python environment using +the `virtualenv `_ tool, but +feel free to use your preferred environment manager +(e.g. `conda `_). + +.. tip:: + :title: Recommendation + + We recommend that you use Python version 3.7 since this is the version that we have + tested MISPR with. + +Creating the virtual environment +================================= +To create and activate a new virtual environment, go to your +``|CODES_DIR|`` (see :doc:`Definition <../keywords>`), and run the following commands:: + + pip install --user --upgrade virtualenv # install virtualenv tool + python -m virtualenv mispr_env # create "mispr_env" environment + source mispr_env/bin/activate # activate "mispr_env" environment + +This will create a directory in your ``|CODES_DIR|`` named ``mispr_env``, +where all the packages will be installed. After activation, your prompt +should have ``(mispr_env)`` in front of it, indicating that you are +working inside the virtual environment. The activation script ensures +that python programs have access only to packages installed inside the +virtualenv. +To deactivate the enviornment, simply run:: + + deactivate + +.. note:: + You may need to install ``pip`` and ``setuptools`` in your virtual + enviornment in case the system or user version of these tools is old:: + + pip install -U setuptools pip + +Computational chemistry software +--------------------------------- + +At the backend, MISPR uses: + +* `Gaussian `_ software to perform DFT calculations +* `AmberTools `_ to generate GAFF parameters +* `LAMMPS `_ to run MD simulations +* `Packmol `_ to + create initial configurations for MD simulations. To install packmol, + follow their `user guide `_ + +Ensure that you have access to the executables of these software +before using MISPR. Gaussian is a commercial software +that requires a license while AmberTools, LAMMPS, and Packmol are open source. +If Gaussian, AmberTools, and LAMMPS are already installed on supercomputing +resources, the user typically needs to load their corresponding modules +before their use. + +Materials Project base libraries +--------------------------------- +* `pymatgen `_: MISPR uses pymatgen for handling + different molecule representations and i/o operations specific to + Gaussian and LAMMPS. We have made changes to the pymatgen library to + make it compatible with our needs in MISPR. These changes have not + been merged yet with the main pymatgen library. Therefore, in order + to use MISPR, you need to install the MolMD version of pymatgen by + running the following commands in your ``|CODES_DIR|``:: + + git clone https://github.com/molmd/pymatgen.git + cd pymatgen + python setup.py install +* `FireWorks `_: MISPR + uses FireWorks to design, manage, and execute workflows. To install, + simply type:: + + pip install FireWorks + + Further details can be found in the `FireWorks documentation `_. + + .. note:: + While FireWorks is used in MISPR for managing the DFT and MD + workflows due to its many advantages, it takes some time to learn + and get used to it. + +* `custodian `_: MISPR uses + custodian for handling errors that occur during the simulations and + correcting them according to predefined rules. We have added a Gaussian + plug-in to the custodian library, but similar to the pymatgen changes, + these changes have not been merged yet with the main custodian library. + Therefore, in order to use MISPR, you need to install the MolMD version + of custodian by running the following commands in your ``|CODES_DIR|``:: + + git clone https://github.com/molmd/custodian.git + cd custodian + python setup.py install + +MongoDB +------------------------- +Following the design decisions of the Materials Project, MISPR uses +`MongoDB `__ as the backend database. +MongoDB is a NoSQL database that is designed to store and retrieve +data in a highly efficient and scalable manner. It stores data in the +form of documents represented in the JSON (JavaScript Object Notation) +format, which is similar to a Python dictionary. + +MISPR uses MongoDB to: + +* Add, remove, and search the status of workflows - feature of + `FireWorks `__ (required) +* Create computational databases of DFT and MD predicted properties - + Feature of MISPR (optional but strongly recommended) + +Setting up MongoDB +============================ +Options for getting MongoDB are: + +* Install it yourself locally by following the instructions at + `MongoDB `__. + This is pretty simple and typically works well if you are starting out + with MISPR and want to learn how to use a database. However, with this + option, you are limited with the storage space on your local machine and + you do not have the option to share the database with other users. You + also need to have the necessary privileges to install mongo on your machine. +* Set up an account using a commercial service, which is typically + the simplest and easiest to use but is not free of charge for databases + with large size. Examples of such services include Atlas and MongoDB Atlas, + which offer 500 MB databases for free. This is typically enough to get + started for small projects. +* Self-host a MongoDB server or ask your supercomputing center to offer + MongoDB hosting. This is more complicated than the other options and + will require continuous maintenance of the server. + +After creating a new database, you need to keep record of your credentials. +These will be used later in setting up the configuration files required +by FireWorks. + +.. note:: + MongoDB must be accessible from the computers you are using to run + the workflows. + +Testing your MongoDB connection +================================ +**Establishing a Connection to MongoDB Using Pymongo:** + +You need to import MongoClient from pymongo and then create a new MongoClient instance. +This instance is used to connect to your MongoDB instance: + +.. code-block:: python + + from pymongo import MongoClient + + client = MongoClient("mongodb://localhost:27017/") + +In this example, we're connecting to a MongoDB instance that runs on the same machine +(localhost) on port 27017, which is the default port for MongoDB. + +**Testing the Connection to MongoDB:** + +We can check the connection by listing all the databases: + +.. code-block:: python + + print(client.list_database_names()) + +If the connection is successful, this command will return a list of names of the databases that are present in the +MongoDB instance. + +Remember, for you to connect to a MongoDB instance, the MongoDB server needs to be installed and running. +If it's not running on localhost:27017, you will need to provide the appropriate connection string. \ No newline at end of file diff --git a/html/_sources/installation/index.rst.txt b/html/_sources/installation/index.rst.txt new file mode 100644 index 00000000..d5b8cee4 --- /dev/null +++ b/html/_sources/installation/index.rst.txt @@ -0,0 +1,82 @@ +============= +Installation +============= +Before installing MISPR, you need to follow the steps below in order: + +1. (Optional) Create a :ref:`installation/dependencies:Virtual python environment` +2. Make sure you have access to the :ref:`installation/dependencies:Computational chemistry software` + needed to run the DFT and MD simulations +3. Install :ref:`installation/dependencies:Materials Project base libraries` +4. Set up :ref:`installation/dependencies:MongoDB` database +5. :ref:`Install MISPR and MDPropTools ` +6. Prepare the :doc:`configuration files ` +7. :doc:`Run a test workflow ` + +.. note:: + Throughout the installation instructions, it is assumed that you are + familiar with Python and with basic Linux shell commands. If not, + `Linux Journey `_ and + `Python For Beginners `_ + are some recommended starting points. + +Installing MISPR and MDPropTools +-------------------------------- +MISPR and MDPropTools can be installed either from the python package +index (good for most users) or directly from their GitHub +repositories (good for developers). + +Installation Method 1: Using pip +================================ +To install, simply type: + +.. code-block:: bash + + pip install mispr + pip install mdproptools + +Installation Method 2: Development mode +======================================= + +.. _codes-develop-mode: + +To make changes directly to the source and contribute to the development +of MISPR, you can install MISPR and MDPropTools in development mode. + +.. note:: + If you had already installed MISPR via pip or conda, you + should uninstall that first before starting the installation in + development mode. This ensures that you will not have any conflicts + resulting from two different code installations. + +The steps for installing the packages in development mode are below. + +1. Activate your conda environment or virtual environment + +2. Create a ``codes`` directory in ``|CODES_DIR|`` + +3. ``cd`` to your newly created ``|CODES_DIR|/codes`` directory + +4. Clone the packages you want to install in development mode using git:: + + git clone https://github.com/molmd/mdproptools.git + git clone https://github.com/molmd/mispr.git + + Now you should have mdproptools and mispr directories in your ``codes`` + directory. + +5. For each of these packages, ``cd`` into their folders and run + ``pip install -e .`` or use the ``conda`` equivalent. Once installed, + if you make changes to the code in these packages, the changes + will take effect immediately without having to reinstall the package. + +Post-installation +------------------------- +1. Before you go any further, confirm your package installations are correct. + First start IPython by typing ``ipython`` in your terminal, then confirm that + the commands ``import mdproptools`` and ``import mispr`` execute + without any errors + +2. To update these codes later on, execute ``git pull`` followed by + ``pip install -e .`` or the ``conda`` equivalent in the corresponding + folder if you installed in development mode. If you installed via pip, + you can simply execute ``pip install --upgrade mispr``. \ No newline at end of file diff --git a/html/_sources/installation/test.rst.txt b/html/_sources/installation/test.rst.txt new file mode 100644 index 00000000..02ace824 --- /dev/null +++ b/html/_sources/installation/test.rst.txt @@ -0,0 +1,151 @@ +=============================== +Running a Test Workflow +=============================== +After installing MISPR and its dependencies and setting up the configuration +files, it is important to make sure everything is working correctly. +Therefore, we will now run a very simple test workflow that optimizes the +structure of a molecule. Later in :doc:`Workflow Tutorials <../workflows/tutorials>`, +we will show how to run more complex workflows. + +.. note:: + ``lpad`` and ``qlaunch`` that are used in this tutorial are part of + FireWorks software. You can refer to FireWorks documentation if you + need additional information. + +Initialize the database +------------------------------ +Initialize the database by running the following command:: + + lpad reset + + + +.. warning:: + This command should only be executed one time when you are first + initializing the database set-up. If you reset your LaunchPad at a + later time, you will erase all existing entries in your FireWorks + database, which includes your fireworks, workflows, and launches + collections. + +.. note:: + Your Python environment where FireWorks is installed must be active + before you run this command. + +Running the above command will return something like this:: + + Are you sure? This will RESET 0 workflows and all data. (Y/N)y + 2022-08-15 17:04:42,224 INFO Performing db tune-up + 2022-08-15 17:04:42,683 INFO LaunchPad was RESET. + +Add a workflow +------------------------------ +The next step is to add a workflow to the database. We will run a +workflow that optimizes the geometry of a monoglyme molecule starting +from its xyz file. Note that you need to have the **monoglyme.xyz** file in +your working directory. You will need to run the following Python code +by creating a file called ``optimize_geometry.py``: + +.. code-block:: python + + from mispr.gaussian.fireworks.core import CalcFromMolFW + from fireworks import LaunchPad, Workflow + + lpad = LaunchPad.auto_load() + wf = Workflow([CalcFromMolFW("monoglyme.xyz", "get_from_file", + gaussian_input_params={"route_parameters": {"opt": None}}, + save_to_file=True, save_to_db=True)]) + lpad.add_wf(wf) + +and then running the following command in terminal:: + + python optimize_geometry.py + + +This will add a structure optimization workflow to the database. + +Verify the workflow +------------------------------ +To check the status of this workflow in the database, run the following +command in terminal:: + + lpad get_fws -s READY + +It will return something like this:: + + { + "fw_id": 1, + "created_on": "2022-08-16T20:32:54.554404", + "updated_on": "2022-08-16T20:32:54.554716", + "state": "READY", + "name": "calc_from_mol" + } + +Alternatively, you can query your ``fireworks`` collection in the MongoDB +database directly or start FireWorks' `LaunchPad `_ +web gui from your local machine (assuming you have also set up +configuration files there):: + + lpad webgui + + + +Submit the workflow +------------------------------ +To launch this job through queue, use the qlaunch command from FireWorks. +qlaunch has 3 modes: singleshot, rapidfire, and multi: + +* ``singleshot``: launches one job at a time +* ``rapidfire``: launches multiple jobs at once; you'll most likely + want to use this mode where it is important to add the ``-m`` + flag to specify how many jobs to launch at once to prevent submitting + too many jobs at once. +* ``multi``: creates one job with multiple fireworks runs + +Here is an example command for launching one job from the terminal in the +same working directory as before:: + + qlaunch singleshot + +If you are not running your jobs through a queue, replace the +``qlaunch`` command with ``rlaunch``. + +Monitor the workflow +------------------------------ +If all went well, you can determine the status of your running jobs by +using the following command in the terminal:: + + lpad get_fws -s RUNNING + +or:: + + lpad get_fws -s COMPLETED + +If your job has failed, your can rerun it using the following command +(replacing ``fw_id`` with 1, which is the id of your firework, since +you only have one firework in your launchpad at this point):: + + lpad rerun_fws -i + +Query the database for the results +-------------------------------------- +Once this workflow is completed, you will see the generated Gaussian +input and output files as well as a ``run.json`` file that contains a +summary of the job in the same working directory. + +Additionally, you can query the database for the results of your jobs +by using the InChI representation of the monoglyme molecule as a query +criteria: + +.. code-block:: python + + from mispr.gaussian.utilities.db_utilities import get_db + + db = get_db() + db.retrieve_run(inchi="InChI=1S/C4H10O2/c1-5-3-4-6-2/h3-4H2,1-2H3")[0] + +This will return a dictionary of the results as they are saved in the +database. Alternatively, you can the view the results using MongoDB +Compass, and the generated documents from the run will appear like the +following in the ``runs`` collection of the ``gaussian`` database: + +.. figure:: ../_static/document.png \ No newline at end of file diff --git a/html/_sources/keywords.rst.txt b/html/_sources/keywords.rst.txt new file mode 100644 index 00000000..28e36971 --- /dev/null +++ b/html/_sources/keywords.rst.txt @@ -0,0 +1,18 @@ +=========== +Keywords +=========== + +.. list-table:: + :widths: 25 75 + :header-rows: 1 + + * - Keyword + - Definition + * - ``|CODES_DIR|`` + - Main directory where the virtual python environment is created and the configuration files are stored + * - ``LaunchPad`` + - FireWorks database that controls the workflows. It stores all the tasks to be run and their status (e.g., RUNNING, WAITING, COMPLETED, etc.) + * - ``FireTask`` + - Computing task to be performed + * - ``FireWork`` + - A list of FireTasks that are to be run in sequence \ No newline at end of file diff --git a/html/_sources/license.rst.txt b/html/_sources/license.rst.txt new file mode 100644 index 00000000..dec08f73 --- /dev/null +++ b/html/_sources/license.rst.txt @@ -0,0 +1,7 @@ +========== +License +========== + +MISPR is released under the MIT License. + +.. literalinclude:: _static/LICENSE.rst \ No newline at end of file diff --git a/html/_sources/mispr.common.rst.txt b/html/_sources/mispr.common.rst.txt new file mode 100644 index 00000000..dac55ef4 --- /dev/null +++ b/html/_sources/mispr.common.rst.txt @@ -0,0 +1,21 @@ +mispr.common package +==================== + +Submodules +---------- + +mispr.common.pubchem module +--------------------------- + +.. automodule:: mispr.common.pubchem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.common + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.firetasks.rst.txt b/html/_sources/mispr.gaussian.firetasks.rst.txt new file mode 100644 index 00000000..22050fca --- /dev/null +++ b/html/_sources/mispr.gaussian.firetasks.rst.txt @@ -0,0 +1,45 @@ +mispr.gaussian.firetasks package +================================ + +Submodules +---------- + +mispr.gaussian.firetasks.geo\_transformation module +--------------------------------------------------- + +.. automodule:: mispr.gaussian.firetasks.geo_transformation + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.firetasks.parse\_outputs module +---------------------------------------------- + +.. automodule:: mispr.gaussian.firetasks.parse_outputs + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.firetasks.run\_calc module +----------------------------------------- + +.. automodule:: mispr.gaussian.firetasks.run_calc + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.firetasks.write\_inputs module +--------------------------------------------- + +.. automodule:: mispr.gaussian.firetasks.write_inputs + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.gaussian.firetasks + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.fireworks.rst.txt b/html/_sources/mispr.gaussian.fireworks.rst.txt new file mode 100644 index 00000000..90d5aa35 --- /dev/null +++ b/html/_sources/mispr.gaussian.fireworks.rst.txt @@ -0,0 +1,29 @@ +mispr.gaussian.fireworks package +================================ + +Submodules +---------- + +mispr.gaussian.fireworks.break\_mol module +------------------------------------------ + +.. automodule:: mispr.gaussian.fireworks.break_mol + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.fireworks.core module +------------------------------------ + +.. automodule:: mispr.gaussian.fireworks.core + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.gaussian.fireworks + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.rst.txt b/html/_sources/mispr.gaussian.rst.txt new file mode 100644 index 00000000..743265f5 --- /dev/null +++ b/html/_sources/mispr.gaussian.rst.txt @@ -0,0 +1,40 @@ +mispr.gaussian package +====================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + mispr.gaussian.firetasks + mispr.gaussian.fireworks + mispr.gaussian.utilities + mispr.gaussian.workflows + +Submodules +---------- + +mispr.gaussian.database module +------------------------------ + +.. automodule:: mispr.gaussian.database + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.defaults module +------------------------------ + +.. automodule:: mispr.gaussian.defaults + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.gaussian + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.utilities.rst.txt b/html/_sources/mispr.gaussian.utilities.rst.txt new file mode 100644 index 00000000..60d2a6cf --- /dev/null +++ b/html/_sources/mispr.gaussian.utilities.rst.txt @@ -0,0 +1,93 @@ +mispr.gaussian.utilities package +================================ + +Submodules +---------- + +mispr.gaussian.utilities.db\_utilities module +--------------------------------------------- + +.. automodule:: mispr.gaussian.utilities.db_utilities + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.dbdoc module +------------------------------------- + +.. automodule:: mispr.gaussian.utilities.dbdoc + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.files module +------------------------------------- + +.. automodule:: mispr.gaussian.utilities.files + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.fw\_utilities module +--------------------------------------------- + +.. automodule:: mispr.gaussian.utilities.fw_utilities + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.gout module +------------------------------------ + +.. automodule:: mispr.gaussian.utilities.gout + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.inputs module +-------------------------------------- + +.. automodule:: mispr.gaussian.utilities.inputs + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.metadata module +---------------------------------------- + +.. automodule:: mispr.gaussian.utilities.metadata + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.misc module +------------------------------------ + +.. automodule:: mispr.gaussian.utilities.misc + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.mol module +----------------------------------- + +.. automodule:: mispr.gaussian.utilities.mol + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.utilities.rdkit module +------------------------------------- + +.. automodule:: mispr.gaussian.utilities.rdkit + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.gaussian.utilities + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.workflows.base.rst.txt b/html/_sources/mispr.gaussian.workflows.base.rst.txt new file mode 100644 index 00000000..b86eedb6 --- /dev/null +++ b/html/_sources/mispr.gaussian.workflows.base.rst.txt @@ -0,0 +1,61 @@ +mispr.gaussian.workflows.base package +===================================== + +Submodules +---------- + +mispr.gaussian.workflows.base.bde module +---------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.bde + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.workflows.base.binding\_energy module +---------------------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.binding_energy + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.workflows.base.core module +----------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.core + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.workflows.base.esp module +---------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.esp + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.workflows.base.ip\_ea module +------------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.ip_ea + :members: + :undoc-members: + :show-inheritance: + +mispr.gaussian.workflows.base.nmr module +---------------------------------------- + +.. automodule:: mispr.gaussian.workflows.base.nmr + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.gaussian.workflows.base + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.gaussian.workflows.rst.txt b/html/_sources/mispr.gaussian.workflows.rst.txt new file mode 100644 index 00000000..dbec3d29 --- /dev/null +++ b/html/_sources/mispr.gaussian.workflows.rst.txt @@ -0,0 +1,18 @@ +mispr.gaussian.workflows package +================================ + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + mispr.gaussian.workflows.base + +Module contents +--------------- + +.. automodule:: mispr.gaussian.workflows + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.hybrid.firetasks.rst.txt b/html/_sources/mispr.hybrid.firetasks.rst.txt new file mode 100644 index 00000000..7b3ab01b --- /dev/null +++ b/html/_sources/mispr.hybrid.firetasks.rst.txt @@ -0,0 +1,21 @@ +mispr.hybrid.firetasks package +============================== + +Submodules +---------- + +mispr.hybrid.firetasks.nmr\_from\_md module +------------------------------------------- + +.. automodule:: mispr.hybrid.firetasks.nmr_from_md + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.hybrid.firetasks + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.hybrid.rst.txt b/html/_sources/mispr.hybrid.rst.txt new file mode 100644 index 00000000..2f5bba3e --- /dev/null +++ b/html/_sources/mispr.hybrid.rst.txt @@ -0,0 +1,30 @@ +mispr.hybrid package +==================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + mispr.hybrid.firetasks + mispr.hybrid.workflows + +Submodules +---------- + +mispr.hybrid.defaults module +---------------------------- + +.. automodule:: mispr.hybrid.defaults + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.hybrid + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.hybrid.workflows.rst.txt b/html/_sources/mispr.hybrid.workflows.rst.txt new file mode 100644 index 00000000..312259eb --- /dev/null +++ b/html/_sources/mispr.hybrid.workflows.rst.txt @@ -0,0 +1,29 @@ +mispr.hybrid.workflows package +============================== + +Submodules +---------- + +mispr.hybrid.workflows.core module +---------------------------------- + +.. automodule:: mispr.hybrid.workflows.core + :members: + :undoc-members: + :show-inheritance: + +mispr.hybrid.workflows.nmr module +--------------------------------- + +.. automodule:: mispr.hybrid.workflows.nmr + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.hybrid.workflows + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.firetasks.rst.txt b/html/_sources/mispr.lammps.firetasks.rst.txt new file mode 100644 index 00000000..e2ca5d5e --- /dev/null +++ b/html/_sources/mispr.lammps.firetasks.rst.txt @@ -0,0 +1,37 @@ +mispr.lammps.firetasks package +============================== + +Submodules +---------- + +mispr.lammps.firetasks.parse\_outputs module +-------------------------------------------- + +.. automodule:: mispr.lammps.firetasks.parse_outputs + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.firetasks.run module +--------------------------------- + +.. automodule:: mispr.lammps.firetasks.run + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.firetasks.write\_inputs module +------------------------------------------- + +.. automodule:: mispr.lammps.firetasks.write_inputs + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps.firetasks + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.fireworks.rst.txt b/html/_sources/mispr.lammps.fireworks.rst.txt new file mode 100644 index 00000000..1b6a189f --- /dev/null +++ b/html/_sources/mispr.lammps.fireworks.rst.txt @@ -0,0 +1,21 @@ +mispr.lammps.fireworks package +============================== + +Submodules +---------- + +mispr.lammps.fireworks.core module +---------------------------------- + +.. automodule:: mispr.lammps.fireworks.core + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps.fireworks + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.rst.txt b/html/_sources/mispr.lammps.rst.txt new file mode 100644 index 00000000..bd0acbfe --- /dev/null +++ b/html/_sources/mispr.lammps.rst.txt @@ -0,0 +1,41 @@ +mispr.lammps package +==================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + mispr.lammps.firetasks + mispr.lammps.fireworks + mispr.lammps.tests + mispr.lammps.utilities + mispr.lammps.workflows + +Submodules +---------- + +mispr.lammps.database module +---------------------------- + +.. automodule:: mispr.lammps.database + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.defaults module +---------------------------- + +.. automodule:: mispr.lammps.defaults + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.tests.rst.txt b/html/_sources/mispr.lammps.tests.rst.txt new file mode 100644 index 00000000..d6a00dde --- /dev/null +++ b/html/_sources/mispr.lammps.tests.rst.txt @@ -0,0 +1,117 @@ +mispr.lammps.tests package +========================== + +Submodules +---------- + +mispr.lammps.tests.antechamber module +------------------------------------- + +.. automodule:: mispr.lammps.tests.antechamber + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.base\_test module +------------------------------------ + +.. automodule:: mispr.lammps.tests.base_test + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.control module +--------------------------------- + +.. automodule:: mispr.lammps.tests.control + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.custom\_data\_workflow module +------------------------------------------------ + +.. automodule:: mispr.lammps.tests.custom_data_workflow + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.data module +------------------------------ + +.. automodule:: mispr.lammps.tests.data + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.electrolyte\_wf module +----------------------------------------- + +.. automodule:: mispr.lammps.tests.electrolyte_wf + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.esp\_to\_ff\_dict\_custom module +--------------------------------------------------- + +.. automodule:: mispr.lammps.tests.esp_to_ff_dict_custom + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.esp\_to\_ff\_dict\_function module +----------------------------------------------------- + +.. automodule:: mispr.lammps.tests.esp_to_ff_dict_function + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.liquid\_wf\_local module +------------------------------------------- + +.. automodule:: mispr.lammps.tests.liquid_wf_local + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.parmchk module +--------------------------------- + +.. automodule:: mispr.lammps.tests.parmchk + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.prmtop module +-------------------------------- + +.. automodule:: mispr.lammps.tests.prmtop + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.run\_lammps module +------------------------------------- + +.. automodule:: mispr.lammps.tests.run_lammps + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.tests.tleap module +------------------------------- + +.. automodule:: mispr.lammps.tests.tleap + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.utilities.rst.txt b/html/_sources/mispr.lammps.utilities.rst.txt new file mode 100644 index 00000000..433522f1 --- /dev/null +++ b/html/_sources/mispr.lammps.utilities.rst.txt @@ -0,0 +1,29 @@ +mispr.lammps.utilities package +============================== + +Submodules +---------- + +mispr.lammps.utilities.opls module +---------------------------------- + +.. automodule:: mispr.lammps.utilities.opls + :members: + :undoc-members: + :show-inheritance: + +mispr.lammps.utilities.utilities module +--------------------------------------- + +.. automodule:: mispr.lammps.utilities.utilities + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps.utilities + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.lammps.workflows.rst.txt b/html/_sources/mispr.lammps.workflows.rst.txt new file mode 100644 index 00000000..e6511648 --- /dev/null +++ b/html/_sources/mispr.lammps.workflows.rst.txt @@ -0,0 +1,21 @@ +mispr.lammps.workflows package +============================== + +Submodules +---------- + +mispr.lammps.workflows.base module +---------------------------------- + +.. automodule:: mispr.lammps.workflows.base + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mispr.lammps.workflows + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/mispr.rst.txt b/html/_sources/mispr.rst.txt new file mode 100644 index 00000000..ba30d80c --- /dev/null +++ b/html/_sources/mispr.rst.txt @@ -0,0 +1,21 @@ +mispr package +============= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + mispr.common + mispr.gaussian + mispr.hybrid + mispr.lammps + +Module contents +--------------- + +.. automodule:: mispr + :members: + :undoc-members: + :show-inheritance: diff --git a/html/_sources/modules.rst.txt b/html/_sources/modules.rst.txt new file mode 100644 index 00000000..4d1a62f9 --- /dev/null +++ b/html/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +mispr +===== + +.. toctree:: + :maxdepth: 4 + + mispr diff --git a/html/_sources/overview.rst.txt b/html/_sources/overview.rst.txt new file mode 100644 index 00000000..53224c3b --- /dev/null +++ b/html/_sources/overview.rst.txt @@ -0,0 +1,67 @@ +========== +Overview +========== +MISPR (Materials Informatics for Structure-Property Relationships) is a +high-throughput computational infrastructure aimed at guiding and +accelerating materials discovery, optimization, and deployment for +liquid solutions by seamlessly integrating density functional theory +(DFT) with classical molecular dynamics (MD) techniques. + +MISPR is motivated by the Materials Genome Initiative (MGI) principles and is +built on top of open-source Python packages developed for the `Materials +Project `_ such as `pymatgen `_, +`FireWorks `_ , +and `custodian `_, as +well as `MDPropTools `_, which +is an in-house package for analyzing MD output and trajectory files. + +.. figure:: _static/overview.png + +**Features of MISPR include**: + +* Automation of DFT and MD simulations and all their underlying tasks + from file management and job submission to supercomputing resources, + to output parsing and data analytics; a task that can be done to a + single molecule/system or to a large number of systems in parallel + +* Creation of computational databases of force field parameters and DFT + and MD derived properties of molecular systems for establishing + structure-property relations and maintaining data provenance and + reproducibility + +* Detection of the inevitable errors that occur during the simulations + and their on-the-fly correction based on template responses that have + been designed relying on human intuition coupled with extensive + experience to significantly improve the success rate of high-throughput + simulations while eliminating human intervention + +* Support for flexible and well-tested DFT workflows that compute various + properties of individual molecular species or complexes such as bond + dissociation energy, binding energy, redox potential, and nuclear + magnetic resonance (NMR) tensors + +* Derivation of many molecular ensemble properties such as radial + distribution functions, diffusion coefficients, viscosity, and + conductivity of liquid solutions, which are critical to understanding + complex inter- and intra-atomic interactions controlling the performance + of solutions within various chemistry, biology, and materials science + applications + +* Seamless integration of DFT and MD simulations through hybrid + workflows that enable force field generation and information flow + between the two length scales to allow exploring wide chemical and + parameter spaces (e.g., temperature, pressure, concentration, etc.), + a task that can be infeasible experimentally and challenging using + manual calculations + +* Automatic extraction of hundreds of thousands of solvation structures + from MD ensembles and their use in DFT workflows to accurately represent + the electronic environment, which is crucial to derive reliable energetics + and other properties such as NMR chemical shifts and redox potentials + and match them to experimental data + +.. note:: + MISPR is primarily built to work with `Gaussian `_ + electronic structure software for DFT calculation and + `LAMMPS `_ + open-source software for MD simulations. \ No newline at end of file diff --git a/html/_sources/resources/faq.rst.txt b/html/_sources/resources/faq.rst.txt new file mode 100644 index 00000000..22db95a8 --- /dev/null +++ b/html/_sources/resources/faq.rst.txt @@ -0,0 +1,5 @@ +=========== +FAQ +=========== + +This page is under construction. \ No newline at end of file diff --git a/html/_sources/resources/resources.rst.txt b/html/_sources/resources/resources.rst.txt new file mode 100644 index 00000000..c1366a60 --- /dev/null +++ b/html/_sources/resources/resources.rst.txt @@ -0,0 +1,22 @@ +============= +Helpful Links +============= + +Code Documentation +------------------------------ +* `pymatgen `_ +* `FireWorks `_ +* `custodian `_ +* `Gaussian `_ +* `LAMMPS `_ + +Code Capsules +------------------------------ +* `MISPR workshop for high-school students `_: + a compute capsule that stores the Python environment for the workshop + and includes Jupyter notebooks for predicting various materials + properties using MISPR +* `NMR tutorial `_: a compute + capsule that shows how to use the hybrid NMR workflow in MISPR to + sample solvation structures from MD simulations and predict their + NMR chemical shifts in a fully automated manner \ No newline at end of file diff --git a/html/_sources/workflows/basics.rst.txt b/html/_sources/workflows/basics.rst.txt new file mode 100644 index 00000000..c61dff37 --- /dev/null +++ b/html/_sources/workflows/basics.rst.txt @@ -0,0 +1,64 @@ +==================== +Workflow Basics +==================== +A scientific workflow in MISPR provides a complete description of the +procedure leading to the final data used to predict the desired property +of a given molecule or system. It consists of multiple steps ranging +from the initial setup of a molecule or system of molecules to a +sequence of calculations with dependencies and optional automated +post-processing of parsed data to derive properties of interest. + +.. note:: + The workflow model we use to encode DFT and MD recipes in MISPR is + defined by the FireWorks workflow software. + +A workflow in FireWorks is modeled as a Directed Acyclic Graph +representing the chain of relationships between +computational operations. A workflow consists of one or more Fireworks +(jobs) with dependencies. The workflow contains information +about the links between Fireworks to execute them in the correct order. +Each Firework consists of one or more Firetasks that run sequentially. +A Firetask is an atomic computing job that can call shell scripts, +transfer files, write/delete files, or execute other Python functions. +An example of the structure of a DFT workflow in MISPR is shown below: + +.. figure:: ../_static/workflow.png + +Once a Workflow object is created, the user can use the FireWorks package +to execute the calculations on various computing resources. The goal of +MISPR infrastructure is to provide preset workflows for +computing properties relevant to the molecular science community and to +simplify the process of creating new workflows by using the implemented +FireWorks and Firetasks in MISPR as building blocks for custom workflows. + +At the end of each workflow in MISPR, an analysis FireTask is performed +to analyze the results and generate a report. The report is in the form +of a JSON file and/or MongoDB document. It contains all the input parameters +used in the calculations, the output data, general information about the +calculation like the software version used (Gaussian, LAMMPS, MISPR, etc.), +the wall time the full run took, and chemical metadata about the molecule +or system of molecules (e.g. SMILES, InChI, molecular formula, etc.). + +In general, each property predicted by MISPR workflows is the result of +multiple Gaussian or LAMMPS calculations, and the predicted property is +represented by a single file/document summarizing data and "raw" information +collected from different calculation steps. The MongoDB document +corresponding to a predicted property is stored in a MongoDB collection +named after the property. For example, bond dissociation energies are +stored in a ``bde`` collection in the database while electrostatic +partial charges are saved in an ``esp`` collection and so on. Some of +the analysis FireTasks also include optional plotting of the results. +Besides the final summary file/document, MISPR stores data from the +intermediate calculation steps into a collection called ``runs`` in the +database. + +The following diagram summarizes the process in MISPR workflows to generate +the analysis files/documents: + +.. figure:: ../_static/analysis.png + +.. note:: + The above diagram shows one example of the structure of a workflow + where the Fireworks are executed sequentially. Some workflows contain + parallel Fireworks. However, the analysis Firework + is always the last Firework in all the workflows in MISPR. \ No newline at end of file diff --git a/html/_sources/workflows/custom.rst.txt b/html/_sources/workflows/custom.rst.txt new file mode 100644 index 00000000..fbbd11e2 --- /dev/null +++ b/html/_sources/workflows/custom.rst.txt @@ -0,0 +1,5 @@ +========================= +Creating Custom Workflows +========================= + +This page is under construction. \ No newline at end of file diff --git a/html/_sources/workflows/supported.rst.txt b/html/_sources/workflows/supported.rst.txt new file mode 100644 index 00000000..c7795f1f --- /dev/null +++ b/html/_sources/workflows/supported.rst.txt @@ -0,0 +1,33 @@ +==================== +Supported Workflows +==================== +Some of the workflows available as of July 2022 are: + +* DFT: + * Electrostatic partial charges (ESP) + * NMR shifts + * Redox potentials + * Binding energies + * Bond dissociation energies +* MD: + * Initial configuration building, generation of `GAFF `_ + or `OPLS `_ parameters, + running of MD simulations + * Analysis of output and trajectory files (e.g. RDF, coordination + number, diffusion coefficients, etc.) +* Hybrid: + * Core workflow for optimizing the individual structure of the + mixture of components, generating their ESP charges, and using + them in MD simulations + * NMR: deriving NMR chemicals for stable solvation structures + extracted from MD simulations + +One can customize any of the above workflows or create their own by reusing +the building blocks provided by MISPR. The above preset workflows are in +``mispr/gaussian/workflows/base``, ``mispr/lammps/workflows/base``, and +``mispr/hybrid/workflows``. + +.. note:: + Other types of force field parameters can be provided as + inputs to the MD workflow, thereby skipping the force field + generation step. \ No newline at end of file diff --git a/html/_sources/workflows/tutorials.rst.txt b/html/_sources/workflows/tutorials.rst.txt new file mode 100644 index 00000000..eac6408d --- /dev/null +++ b/html/_sources/workflows/tutorials.rst.txt @@ -0,0 +1,172 @@ +=================== +Workflow Tutorials +=================== + +This page is under construction. + +Running an ESP workflow +------------------------------ +The ESP workflow calculates the partial charges on atoms of a molecule. The charges are +fit to the electrostatic potential at points selected according to the Merz-Singh-Kollman +scheme, but other schemes supported by Gaussian can be used as well. + +**The ESP workflow performs the following steps:** + +.. mermaid:: + + %%{ + init: { + 'theme': 'base', + 'themeVariables': { + 'primaryTextColor': 'black', + 'lineColor': 'lightgrey', + 'secondaryColor': 'pink', + 'tertiaryColor': 'lightgrey' + } + } + }%% + + graph TD + A[(Input Structure)] -->|Preprocessing| DFT + DFT -->| | B[Geometry Optimization] + B -->| | C[Frequency Calculation] + C -->| | D[ESP Calculation] + D -->|Postprocessing| E[(Output)] + + subgraph DFT + B[Geometry Optimization] + C[Frequency Calculation] + D[ESP Calculation] + end + + style A fill:#EBEBEB,stroke:#BB2528 + style DFT fill:#DDEEFF,stroke:#DDEEFF,font-weight:bold + style B fill:#fff,stroke-dasharray: 5, 5, stroke:#BB2528 + style C fill:#fff,stroke-dasharray: 5, 5, stroke:#BB2528 + style D fill:#fff,stroke:#BB2528 + style E fill:#EBEBEB,stroke:#BB2528 + +.. note:: + The geometry optimization and frequency calculation steps (marked with a dashed + border in the above diagram) are optional. If the input structure is already + optimized, the workflow will skip these steps. + + +In the following example, we will run the ESP workflow on a monoglyme molecule. + +.. code-block:: python + :linenos: + + from fireworks import LaunchPad + + from mispr.gaussian.workflows.base.esp import get_esp_charges + + lpad = LaunchPad.auto_load() + + wf, _ = get_esp_charges( + mol_operation_type="get_from_pubchem", # (1)! + mol="monoglyme", + format_chk=True, + save_to_db=True, + save_to_file=True, + additional_prop_doc_fields={"name": "monoglyme"}, + tag="mispr_tutorial", + ) + lpad.add_wf(wf) # (2)! + +.. code-annotations:: + 1. + :code:`mol_operation_type` refers to the operation to be performed on the input to process the molecule. + + In this example, we are requesting to directly retrieve the molecule from PubChem by providing a + common name for the molecule to be used as query criteria for searching the PubChem database via + the :code:`mol` input argument. For a list of supported :code:`mol_operation_type` and the corresponding + :code:`mol`, refer to :meth:`mispr.gaussian.utilities.mol.process_mol`. + + 2. Adds the workflow to the launchpad. + + +Download :download:`esp_tutorial.py <../_downloads/esp_tutorial.py>`. + +Run the script using the following command: + +.. code-block:: bash + + python esp_tutorial.py + +And then launch the job through the queueing system using the following command: + +.. code-block:: bash + + qlaunch rapidfire # (1)! + +.. code-annotations:: + 1. + This command can submit a large number of jobs at once + or maintain a certain number of jobs in the queue. + +The workflow will run and create a directory named :code:`C4H10O2` in the current working +directory. The directory will contain the following subdirectories: + +.. code-block:: bash + + C4H10O2 + β”œβ”€β”€ Optimization + β”œβ”€β”€ Frequency + β”œβ”€β”€ ESP + β”œβ”€β”€ analysis + +Inside the :code:`Optimization`, :code:`Frequency`, and :code:`ESP` subdirectories, you +will find the Gaussian input and output files for the corresponding step. Inside the +:code:`Optimization` subdirectory, you will also find a "convergence.png" figure that +shows the forces and displacement convergence during the course of the optimization. + +.. figure:: ../_static/convergence.png + +The :code:`analysis` subdirectory contains the results of the workflow in the form of a +:code:`esp.json` file. You can read the content of the :code:`esp.json` file using the +following commands: + +.. code-block:: python + :linenos: + + import json + + with open("C4H10O2/analysis/esp.json", "r") as f: + esp = json.load(f) + + print(esp["esp"]) + +This will output the partial charges on the atoms of the molecule: + +.. code-block:: python + + { + "1": ["O", -0.374646], + "2": ["O", -0.373831], + "3": ["C", 0.132166], + "4": ["C", 0.132716], + "5": ["C", 0.034284], + "6": ["C", 0.031733], + "7": ["H", 0.033853], + "8": ["H", 0.034024], + "9": ["H", 0.034218], + "10": ["H", 0.034388], + "11": ["H", 0.070724], + "12": ["H", 0.03474], + "13": ["H", 0.03438], + "14": ["H", 0.034621], + "15": ["H", 0.071656], + "16": ["H", 0.034974], + } + +Running a BDE workflow +------------------------------ + + +Running an MD workflow +------------------------------ + + +Running a hybrid workflow +------------------------------ diff --git a/html/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/html/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/html/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/html/_sphinx_design_static/design-tabs.js b/html/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/html/_sphinx_design_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/html/_static/LICENSE.rst b/html/_static/LICENSE.rst new file mode 100644 index 00000000..ba657a33 --- /dev/null +++ b/html/_static/LICENSE.rst @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Stony Brook University + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/html/_static/analysis.png b/html/_static/analysis.png new file mode 100644 index 00000000..2c8fa034 Binary files /dev/null and b/html/_static/analysis.png differ diff --git a/html/_static/check-solid.svg b/html/_static/check-solid.svg new file mode 100644 index 00000000..92fad4b5 --- /dev/null +++ b/html/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/html/_static/clipboard.min.js b/html/_static/clipboard.min.js new file mode 100644 index 00000000..54b3c463 --- /dev/null +++ b/html/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT Β© Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/html/_static/copybutton.css b/html/_static/copybutton.css new file mode 100644 index 00000000..f1916ec7 --- /dev/null +++ b/html/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/html/_static/copybutton.js b/html/_static/copybutton.js new file mode 100644 index 00000000..2ea7ff3e --- /dev/null +++ b/html/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': 'Β‘Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'CopiΓ© !', + 'copy_failure': 'Γ‰chec de la copie', + }, + 'ru': { + 'copy': 'Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ', + 'copy_to_clipboard': 'Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€', + 'copy_success': 'Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΎ!', + 'copy_failure': 'НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ', + }, + 'zh-CN': { + 'copy': '倍刢', + 'copy_to_clipboard': '倍刢到ε‰ͺ贴板', + 'copy_success': '倍刢成功!', + 'copy_failure': '倍刢倱θ΄₯', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/html/_static/copybutton_funcs.js b/html/_static/copybutton_funcs.js new file mode 100644 index 00000000..dbe1aaad --- /dev/null +++ b/html/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/html/_static/css/rtd_sphinx_search.min.css b/html/_static/css/rtd_sphinx_search.min.css new file mode 100644 index 00000000..b52e1909 --- /dev/null +++ b/html/_static/css/rtd_sphinx_search.min.css @@ -0,0 +1 @@ +@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.search__backdrop,.search__outer__wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:700}.search__backdrop{z-index:500;display:none;background-color:rgba(0,0,0,.502)}.search__outer{margin:auto;position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000;height:80%;width:80%;max-height:1000px;max-width:1500px;padding:10px;overflow-y:scroll;border:1px solid #e0e0e0;line-height:1.875;background-color:#fcfcfc;-webkit-box-shadow:1px 3px 4px rgba(0,0,0,.09);box-shadow:1px 3px 4px rgba(0,0,0,.09);text-align:left}.search__outer::-webkit-scrollbar-track{border-radius:10px;background-color:#fcfcfc}.search__outer::-webkit-scrollbar{width:7px;height:7px;background-color:#fcfcfc}.search__outer::-webkit-scrollbar-thumb{border-radius:10px;background-color:#8f8f8f}.search__cross__img{width:15px;height:15px;margin:12px}.search__cross{position:absolute;top:0;right:0}.search__cross:hover{cursor:pointer}.search__outer__input{width:90%;height:30px;font-size:19px;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fcfcfc;border:0;border-bottom:1px solid #757575;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDUxIDQ1MSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUxIDQ1MTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ0Ny4wNSw0MjhsLTEwOS42LTEwOS42YzI5LjQtMzMuOCw0Ny4yLTc3LjksNDcuMi0xMjYuMUMzODQuNjUsODYuMiwyOTguMzUsMCwxOTIuMzUsMEM4Ni4yNSwwLDAuMDUsODYuMywwLjA1LDE5Mi4zDQoJCXM4Ni4zLDE5Mi4zLDE5Mi4zLDE5Mi4zYzQ4LjIsMCw5Mi4zLTE3LjgsMTI2LjEtNDcuMkw0MjguMDUsNDQ3YzIuNiwyLjYsNi4xLDQsOS41LDRzNi45LTEuMyw5LjUtNA0KCQlDNDUyLjI1LDQ0MS44LDQ1Mi4yNSw0MzMuMiw0NDcuMDUsNDI4eiBNMjYuOTUsMTkyLjNjMC05MS4yLDc0LjItMTY1LjMsMTY1LjMtMTY1LjNjOTEuMiwwLDE2NS4zLDc0LjIsMTY1LjMsMTY1LjMNCgkJcy03NC4xLDE2NS40LTE2NS4zLDE2NS40QzEwMS4xNSwzNTcuNywyNi45NSwyODMuNSwyNi45NSwxOTIuM3oiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-position:left;background-size:15px 15px;padding-left:25px}.search__outer__input:focus{outline:0}.search__outer .bar{position:relative;display:block;width:90%;margin-bottom:15px}.search__outer .bar:after,.search__outer .bar:before{content:"";height:2px;width:0;bottom:1px;position:absolute;background:#5264ae;-webkit-transition:.2s ease all;-o-transition:.2s ease all;transition:.2s ease all}.search__outer .bar:before{left:50%}.search__outer .bar:after{right:50%}.search__outer__input:focus~.bar:after,.search__outer__input:focus~.bar:before{width:50%}.search__result__box{padding:0 10px}.search__result__single{margin-top:10px;border-bottom:1px solid #e6e6e6}.outer_div_page_results:hover,.search__result__box .active{background-color:#f5f5f5}.search__error__box{color:#000;min-width:300px;font-weight:700}.outer_div_page_results{margin:5px 0;overflow:auto;padding:3px 5px}.search__result__single a{text-decoration:none;cursor:pointer}.search__result__title{display:inline-block;font-weight:500;margin-bottom:15px;margin-top:0;font-size:15px;color:#6ea0ec;border-bottom:1px solid #6ea0ec}.search__result__subheading{color:#000;font-weight:700;float:left;width:20%;font-size:15px;margin-right:10px;word-break:break-all;overflow-x:hidden}.search__result__content{text-decoration:none;color:#000;font-size:15px;display:block;margin:0;line-height:inherit;float:right;width:calc(80% - 15px);text-align:left}.search__outer span{font-style:normal}.search__outer .search__result__title span{background-color:#e5f6ff;padding-bottom:3px;border-bottom-color:#000}.search__outer .search__result__content span{background-color:#e5f6ff;border-bottom:1px solid #000}.search__result__subheading span{border-bottom:1px solid #000}.br-for-hits{display:block;content:"";margin-top:10px}.rtd_ui_search_subtitle{all:unset;color:inherit;font-size:85%}.rtd__search__credits{margin:auto;position:absolute;top:0;left:0;right:0;bottom:calc(-80% - 20px);width:80%;max-width:1500px;height:30px;overflow:hidden;background:#eee;z-index:100000;border:1px solid #eee;padding:5px 10px;text-align:center;color:#000}.rtd__search__credits a{color:#000;text-decoration:underline}.search__domain_role_name{font-size:80%;letter-spacing:1px}.search__filters{padding:0 10px}.search__filters li,.search__filters ul{display:-webkit-box;display:-ms-flexbox;display:flex}.search__filters ul{list-style:none;padding:0;margin:0}.search__filters li{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}.search__filters label{margin:auto}.search__filters .search__filters__title,.search__filters label{color:#000;font-size:15px}@media (max-width:670px){.rtd__search__credits{height:50px;bottom:calc(-80% - 40px);overflow:hidden}}@media (min-height:1250px){.rtd__search__credits{bottom:calc(-1000px - 30px)}}@media (max-width:630px){.search__result__content,.search__result__subheading{float:none;width:90%}} \ No newline at end of file diff --git a/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/html/_static/design-tabs.js b/html/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/html/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/html/_static/document.png b/html/_static/document.png new file mode 100644 index 00000000..4a59e8ef Binary files /dev/null and b/html/_static/document.png differ diff --git a/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 b/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 new file mode 100644 index 00000000..ab301009 Binary files /dev/null and b/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 differ diff --git a/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 b/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 new file mode 100644 index 00000000..09e03c95 Binary files /dev/null and b/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 differ diff --git a/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 b/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 new file mode 100644 index 00000000..d338178b Binary files /dev/null and b/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 differ diff --git a/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 b/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 new file mode 100644 index 00000000..6b0b4afe Binary files /dev/null and b/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 differ diff --git a/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 b/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 new file mode 100644 index 00000000..f477fda0 Binary files /dev/null and b/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 differ diff --git a/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 b/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 new file mode 100644 index 00000000..9a378af0 Binary files /dev/null and b/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 differ diff --git a/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 b/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 new file mode 100644 index 00000000..48a8c10f Binary files /dev/null and b/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 differ diff --git a/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 b/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 new file mode 100644 index 00000000..6aa28456 Binary files /dev/null and b/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 differ diff --git a/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf b/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf new file mode 100644 index 00000000..fbb56251 Binary files /dev/null and b/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf differ diff --git a/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 b/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 new file mode 100644 index 00000000..5b0171c1 Binary files /dev/null and b/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 differ diff --git a/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 b/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 new file mode 100644 index 00000000..71c9bb7d Binary files /dev/null and b/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 differ diff --git a/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 b/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 new file mode 100644 index 00000000..186d9986 Binary files /dev/null and b/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 differ diff --git a/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 b/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 new file mode 100644 index 00000000..02a27ead Binary files /dev/null and b/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 differ diff --git a/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 b/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 new file mode 100644 index 00000000..59ed385e Binary files /dev/null and b/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 differ diff --git a/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 b/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 new file mode 100644 index 00000000..40b9fda9 Binary files /dev/null and b/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 differ diff --git a/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 b/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 new file mode 100644 index 00000000..d953103e Binary files /dev/null and b/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 differ diff --git a/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 b/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 new file mode 100644 index 00000000..508baefb Binary files /dev/null and b/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 differ diff --git a/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 b/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 new file mode 100644 index 00000000..bdad3dfb Binary files /dev/null and b/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 differ diff --git a/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf b/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf new file mode 100644 index 00000000..1a6895d1 Binary files /dev/null and b/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf differ diff --git a/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 b/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 new file mode 100644 index 00000000..cb9bfa71 Binary files /dev/null and b/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 differ diff --git a/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 b/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 new file mode 100644 index 00000000..6d458ad0 Binary files /dev/null and b/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 differ diff --git a/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf b/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf new file mode 100644 index 00000000..2cf147e1 Binary files /dev/null and b/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf differ diff --git a/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 b/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 new file mode 100644 index 00000000..87711c04 Binary files /dev/null and b/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 differ diff --git a/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 b/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 new file mode 100644 index 00000000..bc7e1b2c Binary files /dev/null and b/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 differ diff --git a/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 b/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 new file mode 100644 index 00000000..d4ec1890 Binary files /dev/null and b/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 differ diff --git a/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 b/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 new file mode 100644 index 00000000..2950a77c Binary files /dev/null and b/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 differ diff --git a/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 b/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 new file mode 100644 index 00000000..51c88fde Binary files /dev/null and b/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 differ diff --git a/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 b/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 new file mode 100644 index 00000000..81848e2c Binary files /dev/null and b/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 differ diff --git a/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 b/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 new file mode 100644 index 00000000..7e931875 Binary files /dev/null and b/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 differ diff --git a/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 b/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 new file mode 100644 index 00000000..544eddca Binary files /dev/null and b/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 differ diff --git a/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 b/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 new file mode 100644 index 00000000..cf61b889 Binary files /dev/null and b/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 differ diff --git a/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf b/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf new file mode 100644 index 00000000..d7455040 Binary files /dev/null and b/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf differ diff --git a/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 b/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 new file mode 100644 index 00000000..c8091bc9 Binary files /dev/null and b/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 differ diff --git a/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf b/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf new file mode 100644 index 00000000..64fca947 Binary files /dev/null and b/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf differ diff --git a/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 b/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 new file mode 100644 index 00000000..8c63b51b Binary files /dev/null and b/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 differ diff --git a/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 b/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 new file mode 100644 index 00000000..1f579aa4 Binary files /dev/null and b/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 differ diff --git a/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 b/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 new file mode 100644 index 00000000..e0d3c435 Binary files /dev/null and b/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 differ diff --git a/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf b/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf new file mode 100644 index 00000000..ea5c8fe0 Binary files /dev/null and b/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf differ diff --git a/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 b/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 new file mode 100644 index 00000000..4b7a373a Binary files /dev/null and b/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 differ diff --git a/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf b/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf new file mode 100644 index 00000000..d25425d8 Binary files /dev/null and b/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf differ diff --git a/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 b/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 new file mode 100644 index 00000000..c5776a5e Binary files /dev/null and b/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 differ diff --git a/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf b/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf new file mode 100644 index 00000000..9c48d222 Binary files /dev/null and b/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf differ diff --git a/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 b/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 new file mode 100644 index 00000000..53d081f3 Binary files /dev/null and b/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 differ diff --git a/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 b/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 new file mode 100644 index 00000000..45eae25c Binary files /dev/null and b/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 differ diff --git a/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 b/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 new file mode 100644 index 00000000..f3c5f6ac Binary files /dev/null and b/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 differ diff --git a/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 b/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 new file mode 100644 index 00000000..cb5834ff Binary files /dev/null and b/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 differ diff --git a/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf b/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf new file mode 100644 index 00000000..7c38f724 Binary files /dev/null and b/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf differ diff --git a/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 b/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 new file mode 100644 index 00000000..b1dc168f Binary files /dev/null and b/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 differ diff --git a/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 b/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 new file mode 100644 index 00000000..53b8d0dc Binary files /dev/null and b/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 differ diff --git a/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 b/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 new file mode 100644 index 00000000..8a8de615 Binary files /dev/null and b/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 differ diff --git a/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 b/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 new file mode 100644 index 00000000..63995528 Binary files /dev/null and b/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 differ diff --git a/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 b/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 new file mode 100644 index 00000000..59cab0f1 Binary files /dev/null and b/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 differ diff --git a/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 b/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 new file mode 100644 index 00000000..99b1da1b Binary files /dev/null and b/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 differ diff --git a/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 b/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 new file mode 100644 index 00000000..45f222cc Binary files /dev/null and b/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 differ diff --git a/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 b/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 new file mode 100644 index 00000000..8ab91719 Binary files /dev/null and b/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 differ diff --git a/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 b/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 new file mode 100644 index 00000000..1f384187 Binary files /dev/null and b/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 differ diff --git a/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 b/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 new file mode 100644 index 00000000..0f6e60b8 Binary files /dev/null and b/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 differ diff --git a/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 b/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 new file mode 100644 index 00000000..0bb27069 Binary files /dev/null and b/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 differ diff --git a/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 b/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 new file mode 100644 index 00000000..b289f002 Binary files /dev/null and b/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 differ diff --git a/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 b/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 new file mode 100644 index 00000000..9d7fb7f8 Binary files /dev/null and b/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 differ diff --git a/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 b/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 new file mode 100644 index 00000000..47da3629 Binary files /dev/null and b/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 differ diff --git a/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 b/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 new file mode 100644 index 00000000..997a45c6 Binary files /dev/null and b/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 differ diff --git a/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 b/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 new file mode 100644 index 00000000..3c450111 Binary files /dev/null and b/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 differ diff --git a/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 b/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 new file mode 100644 index 00000000..fb22fec2 Binary files /dev/null and b/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 differ diff --git a/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 b/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 new file mode 100644 index 00000000..de10a3cf Binary files /dev/null and b/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 differ diff --git a/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 b/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 new file mode 100644 index 00000000..2e71425c Binary files /dev/null and b/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 differ diff --git a/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 b/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 new file mode 100644 index 00000000..c0099878 Binary files /dev/null and b/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 differ diff --git a/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 b/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 new file mode 100644 index 00000000..a0f44185 Binary files /dev/null and b/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 differ diff --git a/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 b/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 new file mode 100644 index 00000000..3df1d8a0 Binary files /dev/null and b/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 differ diff --git a/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 b/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 new file mode 100644 index 00000000..100e81a6 Binary files /dev/null and b/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 differ diff --git a/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 b/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 new file mode 100644 index 00000000..a0d68e2b Binary files /dev/null and b/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 differ diff --git a/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 b/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 new file mode 100644 index 00000000..f496f9e2 Binary files /dev/null and b/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 differ diff --git a/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 b/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 new file mode 100644 index 00000000..dd5a4a2e Binary files /dev/null and b/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 differ diff --git a/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 b/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 new file mode 100644 index 00000000..c2862d73 Binary files /dev/null and b/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 differ diff --git a/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 b/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 new file mode 100644 index 00000000..6a258ac6 Binary files /dev/null and b/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 differ diff --git a/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 b/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 new file mode 100644 index 00000000..fecc1855 Binary files /dev/null and b/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 differ diff --git a/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 b/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 new file mode 100644 index 00000000..122ac2c7 Binary files /dev/null and b/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 differ diff --git a/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 b/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 new file mode 100644 index 00000000..00a4a4be Binary files /dev/null and b/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 differ diff --git a/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 b/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 new file mode 100644 index 00000000..edfc6cd0 Binary files /dev/null and b/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 differ diff --git a/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 b/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 new file mode 100644 index 00000000..ae1933f3 Binary files /dev/null and b/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 differ diff --git a/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 b/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 new file mode 100644 index 00000000..ece005fc Binary files /dev/null and b/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 differ diff --git a/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 b/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 new file mode 100644 index 00000000..1bb7737c Binary files /dev/null and b/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 differ diff --git a/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf b/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf new file mode 100644 index 00000000..3e69acbe Binary files /dev/null and b/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf differ diff --git a/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf b/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf new file mode 100644 index 00000000..563f4493 Binary files /dev/null and b/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf differ diff --git a/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 b/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 new file mode 100644 index 00000000..a56a6ede Binary files /dev/null and b/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 differ diff --git a/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf b/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf new file mode 100644 index 00000000..604934aa Binary files /dev/null and b/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf differ diff --git a/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 b/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 new file mode 100644 index 00000000..cbe564b0 Binary files /dev/null and b/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 differ diff --git a/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 b/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 new file mode 100644 index 00000000..92fe38dd Binary files /dev/null and b/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 differ diff --git a/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 b/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 new file mode 100644 index 00000000..0933dfe8 Binary files /dev/null and b/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 differ diff --git a/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf b/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf new file mode 100644 index 00000000..454e5d05 Binary files /dev/null and b/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf differ diff --git a/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf b/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf new file mode 100644 index 00000000..10f8720c Binary files /dev/null and b/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf differ diff --git a/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 b/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 new file mode 100644 index 00000000..943c5a0a Binary files /dev/null and b/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 differ diff --git a/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 b/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 new file mode 100644 index 00000000..9eda94a2 Binary files /dev/null and b/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 differ diff --git a/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 b/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 new file mode 100644 index 00000000..c0f0f73b Binary files /dev/null and b/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 differ diff --git a/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 b/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 new file mode 100644 index 00000000..6284d2e3 Binary files /dev/null and b/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 differ diff --git a/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 b/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 new file mode 100644 index 00000000..dd0851d5 Binary files /dev/null and b/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 differ diff --git a/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 b/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 new file mode 100644 index 00000000..be81ddf5 Binary files /dev/null and b/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 differ diff --git a/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 b/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 new file mode 100644 index 00000000..e0d41239 Binary files /dev/null and b/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 differ diff --git a/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 b/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 new file mode 100644 index 00000000..ff1f96d3 Binary files /dev/null and b/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 differ diff --git a/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 b/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 new file mode 100644 index 00000000..66efc250 Binary files /dev/null and b/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 differ diff --git a/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 b/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 new file mode 100644 index 00000000..067cb322 Binary files /dev/null and b/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 differ diff --git a/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 b/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 new file mode 100644 index 00000000..68f094cd Binary files /dev/null and b/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 differ diff --git a/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf b/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf new file mode 100644 index 00000000..13a7f42e Binary files /dev/null and b/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf differ diff --git a/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 b/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 new file mode 100644 index 00000000..11c7018c Binary files /dev/null and b/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 differ diff --git a/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 b/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 new file mode 100644 index 00000000..e836b518 Binary files /dev/null and b/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 differ diff --git a/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf b/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf new file mode 100644 index 00000000..99c5795f Binary files /dev/null and b/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf differ diff --git a/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 b/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 new file mode 100644 index 00000000..8a81a2ff Binary files /dev/null and b/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 differ diff --git a/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 b/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 new file mode 100644 index 00000000..ef9a2bdd Binary files /dev/null and b/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 differ diff --git a/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 b/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 new file mode 100644 index 00000000..6b05020c Binary files /dev/null and b/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 differ diff --git a/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf b/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf new file mode 100644 index 00000000..57a6dc38 Binary files /dev/null and b/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf differ diff --git a/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 b/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 new file mode 100644 index 00000000..9756ba7c Binary files /dev/null and b/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 differ diff --git a/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf b/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf new file mode 100644 index 00000000..68ff2a47 Binary files /dev/null and b/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf differ diff --git a/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 b/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 new file mode 100644 index 00000000..72fc0214 Binary files /dev/null and b/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 differ diff --git a/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf b/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf new file mode 100644 index 00000000..9c039d63 Binary files /dev/null and b/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf differ diff --git a/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 b/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 new file mode 100644 index 00000000..f8d7a0d4 Binary files /dev/null and b/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 differ diff --git a/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 b/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 new file mode 100644 index 00000000..472bf5a5 Binary files /dev/null and b/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 differ diff --git a/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 b/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 new file mode 100644 index 00000000..5fd10290 Binary files /dev/null and b/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 differ diff --git a/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 b/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 new file mode 100644 index 00000000..cb00b8b5 Binary files /dev/null and b/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 differ diff --git a/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 b/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 new file mode 100644 index 00000000..ef920e5a Binary files /dev/null and b/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 differ diff --git a/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 b/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 new file mode 100644 index 00000000..3f7f93ab Binary files /dev/null and b/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 differ diff --git a/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 b/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 new file mode 100644 index 00000000..663ec4c2 Binary files /dev/null and b/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 differ diff --git a/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 b/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 new file mode 100644 index 00000000..d0c5aa5e Binary files /dev/null and b/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 differ diff --git a/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 b/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 new file mode 100644 index 00000000..3f060b34 Binary files /dev/null and b/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 differ diff --git a/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 b/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 new file mode 100644 index 00000000..2f2cacd3 Binary files /dev/null and b/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 differ diff --git a/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 b/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 new file mode 100644 index 00000000..1d173f2a Binary files /dev/null and b/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 differ diff --git a/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 b/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 new file mode 100644 index 00000000..dd587a2b Binary files /dev/null and b/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 differ diff --git a/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 b/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 new file mode 100644 index 00000000..9213da01 Binary files /dev/null and b/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 differ diff --git a/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 b/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 new file mode 100644 index 00000000..c932cd45 Binary files /dev/null and b/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 differ diff --git a/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 b/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 new file mode 100644 index 00000000..cce41ce7 Binary files /dev/null and b/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 differ diff --git a/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 b/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 new file mode 100644 index 00000000..c8ab3b2d Binary files /dev/null and b/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 differ diff --git a/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 b/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 new file mode 100644 index 00000000..477887e3 Binary files /dev/null and b/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 differ diff --git a/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf b/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf new file mode 100644 index 00000000..aa6a46dd Binary files /dev/null and b/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf differ diff --git a/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 b/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 new file mode 100644 index 00000000..c88b8aea Binary files /dev/null and b/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 differ diff --git a/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 b/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 new file mode 100644 index 00000000..8571683e Binary files /dev/null and b/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 differ diff --git a/html/_static/fonts/b019538234514166ec7665359d097403.woff2 b/html/_static/fonts/b019538234514166ec7665359d097403.woff2 new file mode 100644 index 00000000..29342a8d Binary files /dev/null and b/html/_static/fonts/b019538234514166ec7665359d097403.woff2 differ diff --git a/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 b/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 new file mode 100644 index 00000000..91231c9c Binary files /dev/null and b/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 differ diff --git a/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 b/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 new file mode 100644 index 00000000..4ccadd18 Binary files /dev/null and b/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 differ diff --git a/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 b/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 new file mode 100644 index 00000000..38d4c74d Binary files /dev/null and b/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 differ diff --git a/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 b/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 new file mode 100644 index 00000000..ee64c936 Binary files /dev/null and b/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 differ diff --git a/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 b/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 new file mode 100644 index 00000000..18c3f128 Binary files /dev/null and b/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 differ diff --git a/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 b/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 new file mode 100644 index 00000000..a4699c78 Binary files /dev/null and b/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 differ diff --git a/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 b/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 new file mode 100644 index 00000000..22ddee9c Binary files /dev/null and b/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 differ diff --git a/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 b/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 new file mode 100644 index 00000000..fa67bec9 Binary files /dev/null and b/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 differ diff --git a/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 b/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 new file mode 100644 index 00000000..22c57b01 Binary files /dev/null and b/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 differ diff --git a/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf b/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf new file mode 100644 index 00000000..ce5a5252 Binary files /dev/null and b/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf differ diff --git a/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 b/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 new file mode 100644 index 00000000..20eb7ec2 Binary files /dev/null and b/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 differ diff --git a/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 b/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 new file mode 100644 index 00000000..2900346b Binary files /dev/null and b/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 differ diff --git a/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 b/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 new file mode 100644 index 00000000..0f11176a Binary files /dev/null and b/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 differ diff --git a/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 b/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 new file mode 100644 index 00000000..6363b1c7 Binary files /dev/null and b/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 differ diff --git a/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf b/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf new file mode 100644 index 00000000..99e1e894 Binary files /dev/null and b/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf differ diff --git a/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 b/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 new file mode 100644 index 00000000..27773c96 Binary files /dev/null and b/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 differ diff --git a/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 b/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 new file mode 100644 index 00000000..b2ffb560 Binary files /dev/null and b/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 differ diff --git a/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 b/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 new file mode 100644 index 00000000..7148fac7 Binary files /dev/null and b/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 differ diff --git a/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 b/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 new file mode 100644 index 00000000..fcadc912 Binary files /dev/null and b/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 differ diff --git a/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf b/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf new file mode 100644 index 00000000..7a8b630b Binary files /dev/null and b/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf differ diff --git a/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 b/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 new file mode 100644 index 00000000..d2f30b58 Binary files /dev/null and b/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 differ diff --git a/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 b/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 new file mode 100644 index 00000000..24a1bfd3 Binary files /dev/null and b/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 differ diff --git a/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf b/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf new file mode 100644 index 00000000..4242da4d Binary files /dev/null and b/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf differ diff --git a/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 b/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 new file mode 100644 index 00000000..65687e73 Binary files /dev/null and b/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 differ diff --git a/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 b/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 new file mode 100644 index 00000000..6abf54d0 Binary files /dev/null and b/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 differ diff --git a/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 b/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 new file mode 100644 index 00000000..b8dff97b Binary files /dev/null and b/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 differ diff --git a/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 b/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 new file mode 100644 index 00000000..93cd525d Binary files /dev/null and b/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 differ diff --git a/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 b/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 new file mode 100644 index 00000000..bfa05a0f Binary files /dev/null and b/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 differ diff --git a/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 b/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 new file mode 100644 index 00000000..72ce0e98 Binary files /dev/null and b/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 differ diff --git a/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf b/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf new file mode 100644 index 00000000..6a9fc931 Binary files /dev/null and b/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf differ diff --git a/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 b/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 new file mode 100644 index 00000000..b9cee29d Binary files /dev/null and b/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 differ diff --git a/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf b/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf new file mode 100644 index 00000000..11a1e9fe Binary files /dev/null and b/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf differ diff --git a/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 b/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 new file mode 100644 index 00000000..0b792b0b Binary files /dev/null and b/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 differ diff --git a/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 b/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 new file mode 100644 index 00000000..fe8fcec7 Binary files /dev/null and b/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 differ diff --git a/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 b/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 new file mode 100644 index 00000000..3d0f604e Binary files /dev/null and b/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 differ diff --git a/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 b/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 new file mode 100644 index 00000000..fc71d944 Binary files /dev/null and b/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 differ diff --git a/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 b/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 new file mode 100644 index 00000000..e1b7a79f Binary files /dev/null and b/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 differ diff --git a/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 b/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 new file mode 100644 index 00000000..75d29cff Binary files /dev/null and b/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 differ diff --git a/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 b/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 new file mode 100644 index 00000000..44819272 Binary files /dev/null and b/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 differ diff --git a/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 b/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 new file mode 100644 index 00000000..a181dfe7 Binary files /dev/null and b/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 differ diff --git a/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 b/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 new file mode 100644 index 00000000..b2391b92 Binary files /dev/null and b/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 differ diff --git a/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 b/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 new file mode 100644 index 00000000..9997e98d Binary files /dev/null and b/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 differ diff --git a/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 b/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 new file mode 100644 index 00000000..bfcc76fa Binary files /dev/null and b/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 differ diff --git a/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 b/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 new file mode 100644 index 00000000..677de8b5 Binary files /dev/null and b/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 differ diff --git a/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 b/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 new file mode 100644 index 00000000..064e94b7 Binary files /dev/null and b/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 differ diff --git a/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 b/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 new file mode 100644 index 00000000..074504d6 Binary files /dev/null and b/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 differ diff --git a/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 b/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 new file mode 100644 index 00000000..0bfb07d7 Binary files /dev/null and b/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 differ diff --git a/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 b/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 new file mode 100644 index 00000000..f041fde3 Binary files /dev/null and b/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 differ diff --git a/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 b/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 new file mode 100644 index 00000000..5b19d60d Binary files /dev/null and b/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 differ diff --git a/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 b/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 new file mode 100644 index 00000000..23fcdf30 Binary files /dev/null and b/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 differ diff --git a/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 b/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 new file mode 100644 index 00000000..2bfc2cee Binary files /dev/null and b/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 differ diff --git a/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 b/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 new file mode 100644 index 00000000..481279c0 Binary files /dev/null and b/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 differ diff --git a/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 b/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 new file mode 100644 index 00000000..771fbecc Binary files /dev/null and b/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 differ diff --git a/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 b/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 new file mode 100644 index 00000000..d87fe266 Binary files /dev/null and b/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 differ diff --git a/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 b/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 new file mode 100644 index 00000000..020729ef Binary files /dev/null and b/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 differ diff --git a/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 b/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 new file mode 100644 index 00000000..60681387 Binary files /dev/null and b/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 differ diff --git a/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 b/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 new file mode 100644 index 00000000..4487ab7b Binary files /dev/null and b/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 differ diff --git a/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 b/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 new file mode 100644 index 00000000..1351aad4 Binary files /dev/null and b/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 differ diff --git a/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 b/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 new file mode 100644 index 00000000..94ab5fb0 Binary files /dev/null and b/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 differ diff --git a/html/_static/full_logo.png b/html/_static/full_logo.png new file mode 100644 index 00000000..b2e77b28 Binary files /dev/null and b/html/_static/full_logo.png differ diff --git a/html/_static/js/rtd_search_config.js b/html/_static/js/rtd_search_config.js new file mode 100644 index 00000000..c512b4db --- /dev/null +++ b/html/_static/js/rtd_search_config.js @@ -0,0 +1,2 @@ + +var RTD_SEARCH_CONFIG = {"default_filter": "project:/", "filters": []}; \ No newline at end of file diff --git a/html/_static/js/rtd_sphinx_search.min.js b/html/_static/js/rtd_sphinx_search.min.js new file mode 100644 index 00000000..ee0b3007 --- /dev/null +++ b/html/_static/js/rtd_sphinx_search.min.js @@ -0,0 +1 @@ +"use strict";function _createForOfIteratorHelper(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,t=function(){};return{s:t,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:t}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,l=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return o=e.done,e},e:function(e){l=!0,a=e},f:function(){try{o||null==r.return||r.return()}finally{if(l)throw a}}}}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(r="Object"===r&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);rSearching ....",a.appendChild(e);return debounce(function(){updateUrl(),updateSearchBar();var e=t+"?"+new URLSearchParams(r).toString();fetch(e,{method:"GET"}).then(function(e){if(!e.ok)throw new Error;return e.json()}).then(function(e){var t;00 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/html/_static/logo.png b/html/_static/logo.png new file mode 100644 index 00000000..41573142 Binary files /dev/null and b/html/_static/logo.png differ diff --git a/html/_static/mispr_citation.bib b/html/_static/mispr_citation.bib new file mode 100644 index 00000000..3d60a500 --- /dev/null +++ b/html/_static/mispr_citation.bib @@ -0,0 +1,5 @@ +@article{atwi2022mispr, + title={MISPR: An automated infrastructure for high-throughput DFT and MD simulations}, + author={Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi}, + year={2022} +} diff --git a/html/_static/nmr_citation.bib b/html/_static/nmr_citation.bib new file mode 100644 index 00000000..af6f0ea5 --- /dev/null +++ b/html/_static/nmr_citation.bib @@ -0,0 +1,10 @@ +@article{atwi2022automated, + title={An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions}, + author={Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi}, + journal={Nature Computational Science}, + volume={2}, + number={2}, + pages={112--122}, + year={2022}, + publisher={Nature Publishing Group} +} diff --git a/html/_static/overview.png b/html/_static/overview.png new file mode 100644 index 00000000..da7be327 Binary files /dev/null and b/html/_static/overview.png differ diff --git a/html/_static/sphinx_immaterial_theme.359ec555e2989f00f.min.css b/html/_static/sphinx_immaterial_theme.359ec555e2989f00f.min.css new file mode 100644 index 00000000..30546992 --- /dev/null +++ b/html/_static/sphinx_immaterial_theme.359ec555e2989f00f.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:content-box;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:transparent;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root,[data-md-color-scheme=default]{--md-default-fg-color:rgba(0,0,0,.87);--md-default-fg-color--light:rgba(0,0,0,.54);--md-default-fg-color--lighter:rgba(0,0,0,.32);--md-default-fg-color--lightest:rgba(0,0,0,.07);--md-default-bg-color:#fff;--md-default-bg-color--light:hsla(0,0%,100%,.7);--md-default-bg-color--lighter:hsla(0,0%,100%,.3);--md-default-bg-color--lightest:hsla(0,0%,100%,.12);--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7);--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:rgba(255,255,0,.5);--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(255,255,0,.5);--md-typeset-del-color:rgba(245,80,61,.15);--md-typeset-ins-color:rgba(11,213,112,.15);--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:rgba(0,0,0,.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-fg-color:#fff;--md-footer-fg-color--light:hsla(0,0%,100%,.7);--md-footer-fg-color--lighter:hsla(0,0%,100%,.3);--md-footer-bg-color:rgba(0,0,0,.87);--md-footer-bg-color--dark:rgba(0,0,0,.32);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.05),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.1),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.35)}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}.si-icon-inline:before{background-color:var(--md-default-fg-color);content:"";display:inline-flex;height:1.125em;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;vertical-align:text-top;width:1.125em}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}body,input{font-feature-settings:"kern","liga";font-family:var(--md-text-font-family)}body,code,input,kbd,pre{color:var(--md-typeset-color)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset .code-block-caption+.notranslate .highlighttable,.md-typeset .code-block-caption+.notranslate pre{margin-top:0}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:-webkit-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}.md-typeset abbr[title]:-moz-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}[dir=ltr] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:is(:focus,:hover):after{left:0}[dir=rtl] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:is(:focus,:hover):after{right:0}.md-typeset abbr[title]:is(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li :-webkit-any(ul,ol),.md-typeset ul li :-webkit-any(ul,ol){margin-bottom:.5em;margin-top:.5em}.md-typeset ol li :-moz-any(ul,ol),.md-typeset ul li :-moz-any(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset ol li :-webkit-any(ul,ol),[dir=ltr] .md-typeset ul li :-webkit-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :-moz-any(ul,ol),[dir=ltr] .md-typeset ul li :-moz-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :is(ul,ol),[dir=ltr] .md-typeset ul li :is(ul,ol){margin-left:.625em}[dir=rtl] .md-typeset ol li :-webkit-any(ul,ol),[dir=rtl] .md-typeset ul li :-webkit-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :-moz-any(ul,ol),[dir=rtl] .md-typeset ul li :-moz-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :is(ul,ol),[dir=rtl] .md-typeset ul li :is(ul,ol){margin-right:.625em}.md-typeset ol li :is(ul,ol),.md-typeset ul li :is(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset img[src$="#gh-dark-mode-only"],.md-typeset img[src$="#only-dark"]{display:none}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table.data:not(.plain){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto;width:-moz-max-content;width:max-content}@media print{.md-typeset table.data:not(.plain){display:table}}.md-typeset table.data:not(.plain)+*{margin-top:1.5em}.md-typeset table.data:not(.plain) :-webkit-any(th,td)>:first-child{margin-top:0}.md-typeset table.data:not(.plain) :-moz-any(th,td)>:first-child{margin-top:0}.md-typeset table.data:not(.plain) :is(th,td)>:first-child{margin-top:0}.md-typeset table.data:not(.plain) :-webkit-any(th,td)>:last-child{margin-bottom:0}.md-typeset table.data:not(.plain) :-moz-any(th,td)>:last-child{margin-bottom:0}.md-typeset table.data:not(.plain) :is(th,td)>:last-child{margin-bottom:0}.md-typeset table.data:not(.plain) :-webkit-any(th,td):not([align],.align-center,.align-left,.align-right){text-align:left}.md-typeset table.data:not(.plain) :-moz-any(th,td):not([align],.align-center,.align-left,.align-right){text-align:left}.md-typeset table.data:not(.plain) :is(th,td):not([align],.align-center,.align-left,.align-right){text-align:left}[dir=rtl] .md-typeset table.data:not(.plain) :-webkit-any(th,td):not([align],.align-center,.align-left,.align-right){text-align:right}[dir=rtl] .md-typeset table.data:not(.plain) :-moz-any(th,td):not([align],.align-center,.align-left,.align-right){text-align:right}[dir=rtl] .md-typeset table.data:not(.plain) :is(th,td):not([align],.align-center,.align-left,.align-right){text-align:right}.md-typeset table.data:not(.plain) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table.data:not(.plain) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table.data:not(.plain) tbody tr{transition:background-color 125ms}.md-typeset table.data:not(.plain) tbody tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table.data:not(.plain) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background:var(--md-typeset-mark-color);color:var(--md-default-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:-webkit-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:-moz-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:is(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:rgba(0,0,0,.54);height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{display:flex;flex-grow:0.01;outline-color:var(--md-accent-fg-color);overflow:hidden;padding-bottom:.4rem;padding-top:1.4rem;transition:opacity .25s}.md-footer__link:-webkit-any(:focus,:hover){opacity:.7}.md-footer__link:-moz-any(:focus,:hover){opacity:.7}.md-footer__link:is(:focus,:hover){opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;line-height:2.4rem;max-width:calc(100% - 2.4rem);padding:0 1rem;position:relative;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;left:0;margin-top:-1rem;opacity:.7;padding:0 1rem;position:absolute;right:0}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:-webkit-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:-moz-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:is(:focus,:hover){color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:is(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:-webkit-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:-moz-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:is(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem transparent,0 .2rem .4rem transparent;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-hero{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-size:1rem;overflow:hidden;transition:background .25s}.md-hero__inner{margin-top:1rem;padding:.8rem .8rem .4rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition-delay:.1s}@media screen and (max-width:76.1875em){.md-hero__inner{margin-bottom:1.2rem;margin-top:2.4rem}}[data-md-state=hidden] .md-hero__inner{opacity:0;pointer-events:none;transform:translateY(.625rem);transition:transform 0ms .4s,opacity .1s 0ms}.md-hero--expand .md-hero__inner{margin-bottom:1.2rem}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{align-items:center;display:flex;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;-o-object-fit:contain;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link.md-nav__sticky{box-shadow:0 -.625em var(--md-default-bg-color),0 .625em var(--md-default-bg-color)}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__link--in-viewport{position:relative}.md-nav__link--in-viewport:before{background-color:var(--md-primary-fg-color);bottom:0;content:"";height:100%;position:absolute;right:calc(100% + .3rem);top:0;width:.05rem}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__sticky{background-color:var(--md-default-bg-color);position:sticky;top:var(--md-nav__header-height,0);z-index:var(--md-nav__sticky-zindex)}.md-nav .md-ellipsis{display:block;flex-grow:1;white-space:normal}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__sticky{background-color:transparent;box-shadow:none;position:static;z-index:auto}.md-nav--primary :-webkit-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :-moz-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :is(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;line-height:2.4rem;min-height:5.6rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:transparent;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:transparent}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-nav .md-nav__title .md-ellipsis{white-space:nowrap}.md-nav .md-nav__title .md-ellipsis wbr{display:none}}@media screen and (max-width:59.9375em){.md-nav__current-nested{display:none}.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav__current-toc{display:none}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:-webkit-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:-moz-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:is(:checked,:indeterminate)~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s,transform .25s;width:.9rem}[dir=rtl] .md-nav__icon{transform:rotate(180deg)}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:-.1rem;width:100%}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);font-weight:700;margin-top:0;padding:0 .6rem;position:sticky;top:0;z-index:var(--md-nav__sticky-zindex,1)}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__link--index){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:rgba(0,0,0,.54);cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem transparent;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:rgba(0,0,0,.26);border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:hsla(0,0%,100%,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem rgba(0,0,0,.07);color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:transparent;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::-moz-placeholder{-moz-transition:color .25s;transition:color .25s}.md-search__input::placeholder{transition:color .25s}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::-moz-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>*{margin-left:.2rem}[dir=rtl] .md-search__options>*{margin-right:.2rem}.md-search__options>*{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>*{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{color:var(--md-typeset-a-color);cursor:pointer;display:block;font-size:.64rem;outline:none;padding:.75em .8rem;scroll-snap-align:start;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem}}.md-search-result__more summary:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary::marker{display:none}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}.md-search-result__article--document .md-search-result__title{font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result__title{font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result__teaser{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--md-default-fg-color--light);display:-webkit-box;font-size:.64rem;line-height:1.6;margin:.5em 0;max-height:2rem;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width:44.9375em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}.md-search-result__teaser mark{background-color:transparent;text-decoration:underline}.md-search-result__terms{font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:transparent;color:var(--md-accent-fg-color)}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:-webkit-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-webkit-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:-moz-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-moz-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:is(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid transparent;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid transparent;border-right:.2rem solid transparent;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.1875em){.md-overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;padding:0;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:-webkit-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:-moz-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:is(:focus,:hover){color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags{margin-bottom:.75em;margin-top:-.125em}[dir=ltr] .md-typeset .md-tag{margin-right:.5em}[dir=rtl] .md-typeset .md-tag{margin-left:.5em}.md-typeset .md-tag{background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-block;font-size:.64rem;font-weight:700;letter-spacing:normal;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em;vertical-align:middle}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;margin-right:.4em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon:-webkit-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:-moz-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:is(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em transparent;transform:scale(1)}to{box-shadow:0 0 0 0 transparent;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}:-webkit-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:-moz-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:is(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation__index{cursor:pointer;font-family:var(--md-code-font-family);font-size:.85em;margin:0 1ch;outline:none;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:0}.md-annotation .md-annotation__index{color:#fff;transition:z-index .25s}.md-annotation .md-annotation__index:-webkit-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:-moz-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:is(:focus,:hover){color:#fff}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.125em;margin:0 -.4ch;padding:0 .4ch;position:absolute;top:0;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{animation:pulse 2s infinite}}.md-tooltip--active+.md-annotation__index:after{animation:none;transition:color .25s,background-color .25s}code .md-annotation__index{font-family:var(--md-code-font-family);font-size:inherit}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}.md-tooltip--active+.md-annotation__index{animation:none;transition:none;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:is(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:-webkit-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-webkit-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:-moz-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-moz-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:is(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.05rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition :-webkit-any(.admonition,details),.md-typeset details :-webkit-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :-moz-any(.admonition,details),.md-typeset details :-moz-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :is(.admonition,details),.md-typeset details :is(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:rgba(68,138,255,.1);border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.note){border-color:#448aff}.md-typeset :-moz-any(.admonition,details):-moz-any(.note){border-color:#448aff}.md-typeset :is(.admonition,details):is(.note){border-color:#448aff}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :is(.note)>:is(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):before{background-color:#448aff;mask-image:var(--md-admonition-icon--note)}.md-typeset :is(.note)>:is(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):after{color:#448aff}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):after{color:#448aff}.md-typeset :is(.note)>:is(.admonition-title,summary):after{color:#448aff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-moz-any(.admonition,details):-moz-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :is(.admonition,details):is(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):before{background-color:#00b0ff;mask-image:var(--md-admonition-icon--abstract)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.info,.todo){border-color:#00b8d4}.md-typeset :-moz-any(.admonition,details):-moz-any(.info,.todo){border-color:#00b8d4}.md-typeset :is(.admonition,details):is(.info,.todo){border-color:#00b8d4}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):before{background-color:#00b8d4;mask-image:var(--md-admonition-icon--info)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-moz-any(.admonition,details):-moz-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :is(.admonition,details):is(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):before{background-color:#00bfa5;mask-image:var(--md-admonition-icon--tip)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.success,.check,.done){border-color:#00c853}.md-typeset :-moz-any(.admonition,details):-moz-any(.success,.check,.done){border-color:#00c853}.md-typeset :is(.admonition,details):is(.success,.check,.done){border-color:#00c853}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):before{background-color:#00c853;mask-image:var(--md-admonition-icon--success)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):after{color:#00c853}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):after{color:#00c853}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):after{color:#00c853}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :-moz-any(.admonition,details):-moz-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :is(.admonition,details):is(.question,.help,.faq){border-color:#64dd17}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):before{background-color:#64dd17;mask-image:var(--md-admonition-icon--question)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):after{color:#64dd17}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-moz-any(.admonition,details):-moz-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :is(.admonition,details):is(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):before{background-color:#ff9100;mask-image:var(--md-admonition-icon--warning)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):after{color:#ff9100}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-moz-any(.admonition,details):-moz-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :is(.admonition,details):is(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):before{background-color:#ff5252;mask-image:var(--md-admonition-icon--failure)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):after{color:#ff5252}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.danger,.error){border-color:#ff1744}.md-typeset :-moz-any(.admonition,details):-moz-any(.danger,.error){border-color:#ff1744}.md-typeset :is(.admonition,details):is(.danger,.error){border-color:#ff1744}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):before{background-color:#ff1744;mask-image:var(--md-admonition-icon--danger)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):after{color:#ff1744}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.bug){border-color:#f50057}.md-typeset :-moz-any(.admonition,details):-moz-any(.bug){border-color:#f50057}.md-typeset :is(.admonition,details):is(.bug){border-color:#f50057}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :is(.bug)>:is(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):before{background-color:#f50057;mask-image:var(--md-admonition-icon--bug)}.md-typeset :is(.bug)>:is(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):after{color:#f50057}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):after{color:#f50057}.md-typeset :is(.bug)>:is(.admonition-title,summary):after{color:#f50057}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.example){border-color:#7c4dff}.md-typeset :-moz-any(.admonition,details):-moz-any(.example){border-color:#7c4dff}.md-typeset :is(.admonition,details):is(.example){border-color:#7c4dff}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :is(.example)>:is(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):before{background-color:#7c4dff;mask-image:var(--md-admonition-icon--example)}.md-typeset :is(.example)>:is(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :is(.example)>:is(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :-moz-any(.admonition,details):-moz-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :is(.admonition,details):is(.quote,.cite){border-color:#9e9e9e}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):before{background-color:#9e9e9e;mask-image:var(--md-admonition-icon--quote)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:-webkit-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:-moz-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:is(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :-webkit-any(:hover,:target)>.headerlink{opacity:1;-webkit-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :-moz-any(:hover,:target)>.headerlink{opacity:1;-moz-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :is(:hover,:target)>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:-webkit-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:-moz-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:is(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset :-webkit-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :-moz-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :is(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-moz-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset :-webkit-any(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset :-moz-any(del,ins,.comment).critic{box-decoration-break:clone}.md-typeset :is(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :is(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :is(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight :-webkit-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :-moz-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :is(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight :-webkit-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-moz-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :is(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-webkit-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-moz-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :is(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-webkit-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-moz-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :is(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-webkit-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :is(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.n){color:var(--md-code-hl-name-color)}.highlight :-moz-any(.n){color:var(--md-code-hl-name-color)}.highlight :is(.n){color:var(--md-code-hl-name-color)}.highlight :-webkit-any(.kc,.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-moz-any(.kc,.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :is(.kc,.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-webkit-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-moz-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :is(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-webkit-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :is(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-moz-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :is(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-webkit-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-moz-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :is(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-webkit-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-moz-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :is(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-webkit-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :-moz-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :is(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable :-webkit-any(tbody,td){display:block;padding:0}.highlighttable :-moz-any(tbody,td){display:block;padding:0}.highlighttable :is(tbody,td){display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset :-webkit-any(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset :-moz-any(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset :is(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset :-webkit-any(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result:after{clear:both;content:"";display:block}.md-typeset :-moz-any(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result:after{clear:both;content:"";display:block}.md-typeset :is(.highlight,.highlighttable,.literal-block-wrapper,div[class^=highlight-],.results-prefix)+.result:after{clear:both;content:"";display:block}.md-typeset .results .results-prefix+.result{margin-top:0}.md-typeset .results .results-prefix{background-color:var(--md-code-bg-color);font-size:.85em;font-weight:700;margin-top:-1em;padding:.6617647059em 1.1764705882em}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:-webkit-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:-moz-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:is(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"βŽ‡";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"βŒƒ";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"β—†";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"βŒ₯";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"β†’";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇀";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"β‡ͺ";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"–";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"βŽ‹";padding-right:.4em}.md-typeset .keys .key-home:before{content:"β€’";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"βŽ€";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"β‡Ÿ";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"β‡ž";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"βŽ™";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"β‡₯";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌀";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid transparent;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,transparent);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,transparent);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}.rst-versions{font-family:var(--md-text-font-family)}.rst-versions.rst-badge{bottom:inherit!important;font-size:.85rem;height:auto;top:50px}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}:root>*{--md-graphviz-edge-color:var(--md-default-fg-color);--md-graphviz-node-bg-color:var(--md-accent-fg-color--transparent);--md-graphviz-node-fg-color:var(--md-accent-fg-color);--md-graphviz-label-bg-color:var(--md-default-bg-color);--md-graphviz-label-fg-color:var(--md-code-fg-color);--md-graphviz-a-hover-color:var(--md-primary-fg-color)}.graphviz{margin:1em 0}.graphviz a:hover>text{fill:var(--md-graphviz-hover-color)!important}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}}.md-typeset .align-left{text-align:left}.md-typeset .align-right{text-align:right}.md-typeset .align-center{clear:both;text-align:center}.md-typeset .align-top{vertical-align:top}.md-typeset .align-middle{vertical-align:middle}.md-typeset .align-bottom{vertical-align:bottom}.md-typeset .figure.align-left,.md-typeset figure.align-left,.md-typeset img.align-left,.md-typeset object.align-left,.md-typeset table.align-left{margin-right:auto}.md-typeset .figure.align-center,.md-typeset figure.align-center,.md-typeset img.align-center,.md-typeset object.align-center,.md-typeset table.align-center{margin-left:auto;margin-right:auto}.md-typeset .figure.align-right,.md-typeset figure.align-right,.md-typeset img.align-right,.md-typeset object.align-right,.md-typeset table.align-right{margin-left:auto}.md-typeset .figure.align-center,.md-typeset .figure.align-right,.md-typeset figure.align-center,.md-typeset figure.align-right,.md-typeset img.align-center,.md-typeset img.align-right,.md-typeset object.align-center,.md-typeset object.align-right{display:block}.md-typeset .figure.align-left,.md-typeset .figure.align-right,.md-typeset figure.align-left,.md-typeset figure.align-right,.md-typeset table.align-center,.md-typeset table.align-left,.md-typeset table.align-right{text-align:inherit}.md-typeset .rubric{font-weight:700}.md-typeset .viewcode-block .viewcode-back{float:right}.md-typeset .versionmodified{font-style:italic}.md-typeset div.line-block{display:block}.md-typeset div.line-block div.line-block{margin-left:1.5em}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt{background:var(--md-code-bg-color);font-family:var(--md-code-font-family)}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt{background:var(--md-code-bg-color);font-family:var(--md-code-font-family)}.md-typeset :is(dl.objdesc,dl.api-field)>dt{background:var(--md-code-bg-color);font-family:var(--md-code-font-family)}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt code{border-radius:0;padding:0}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt code{border-radius:0;padding:0}.md-typeset :is(dl.objdesc,dl.api-field)>dt code{border-radius:0;padding:0}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .sig-name:not(.sig-name-nonprimary){color:var(--md-code-hl-name-color);font-weight:700;padding:0}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .sig-name:not(.sig-name-nonprimary){color:var(--md-code-hl-name-color);font-weight:700;padding:0}.md-typeset :is(dl.objdesc,dl.api-field)>dt .sig-name:not(.sig-name-nonprimary){color:var(--md-code-hl-name-color);font-weight:700;padding:0}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .sig-param{font-style:normal}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .sig-param{font-style:normal}.md-typeset :is(dl.objdesc,dl.api-field)>dt .sig-param{font-style:normal}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .sig-param .n:not(.desctype){color:var(--md-default-fg-color--light)}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .sig-param .n:not(.desctype){color:var(--md-default-fg-color--light)}.md-typeset :is(dl.objdesc,dl.api-field)>dt .sig-param .n:not(.desctype){color:var(--md-default-fg-color--light)}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .sig-param a.reference .n:not(.desctype):hover{color:var(--md-accent-fg-color)}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .sig-param a.reference .n:not(.desctype):hover{color:var(--md-accent-fg-color)}.md-typeset :is(dl.objdesc,dl.api-field)>dt .sig-param a.reference .n:not(.desctype):hover{color:var(--md-accent-fg-color)}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-param-decl:before{content:"\a ";white-space:pre}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-param-decl:before{content:"\a ";white-space:pre}.md-typeset :is(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-param-decl:before{content:"\a ";white-space:pre}.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-paren~.sig-paren:before{content:"\a";white-space:pre}.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-paren~.sig-paren:before{content:"\a";white-space:pre}.md-typeset :is(dl.objdesc,dl.api-field)>dt.sig-wrap .sig-paren~.sig-paren:before{content:"\a";white-space:pre}.md-typeset dl.objdesc>dd>dl.field-list>dt>.colon{display:none}.md-typeset .sig-inline a.reference.sig-name,.md-typeset .sig-inline a.reference:not(.desctype)>.n,.md-typeset .sig-inline a.reference>.sig-name,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference.sig-name,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference>.sig-name{color:var(--md-typeset-a-color)}.md-typeset .sig-inline a.reference.sig-name,.md-typeset .sig-inline a.reference:not(.desctype)>.n,.md-typeset .sig-inline a.reference>.sig-name,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference.sig-name,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference>.sig-name{color:var(--md-typeset-a-color)}.md-typeset .sig-inline a.reference.sig-name,.md-typeset .sig-inline a.reference:not(.desctype)>.n,.md-typeset .sig-inline a.reference>.sig-name,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference.sig-name,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference>.sig-name{color:var(--md-typeset-a-color)}.md-typeset .sig-inline a.reference.sig-name:hover,.md-typeset .sig-inline a.reference:not(.desctype)>.n:hover,.md-typeset .sig-inline a.reference>.sig-name:hover,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference.sig-name:hover,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n:hover,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt a.reference>.sig-name:hover{color:var(--md-accent-fg-color)}.md-typeset .sig-inline a.reference.sig-name:hover,.md-typeset .sig-inline a.reference:not(.desctype)>.n:hover,.md-typeset .sig-inline a.reference>.sig-name:hover,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference.sig-name:hover,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n:hover,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt a.reference>.sig-name:hover{color:var(--md-accent-fg-color)}.md-typeset .sig-inline a.reference.sig-name:hover,.md-typeset .sig-inline a.reference:not(.desctype)>.n:hover,.md-typeset .sig-inline a.reference>.sig-name:hover,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference.sig-name:hover,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference:not(.desctype)>.n:hover,.md-typeset :is(dl.objdesc,dl.api-field)>dt a.reference>.sig-name:hover{color:var(--md-accent-fg-color)}.md-typeset .sig-inline .desctype,.md-typeset .sig-inline .desctype>a.reference,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference{color:var(--md-code-hl-special-color)}.md-typeset .sig-inline .desctype,.md-typeset .sig-inline .desctype>a.reference,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference{color:var(--md-code-hl-special-color)}.md-typeset .sig-inline .desctype,.md-typeset .sig-inline .desctype>a.reference,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype>a.reference{color:var(--md-code-hl-special-color)}.md-typeset .sig-inline .desctype .n,.md-typeset .sig-inline .desctype>a.reference .n,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype .n,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference .n{color:inherit}.md-typeset .sig-inline .desctype .n,.md-typeset .sig-inline .desctype>a.reference .n,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype .n,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference .n{color:inherit}.md-typeset .sig-inline .desctype .n,.md-typeset .sig-inline .desctype>a.reference .n,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype .n,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype>a.reference .n{color:inherit}.md-typeset .sig-inline .desctype:-webkit-any(a.reference):hover,.md-typeset .sig-inline .desctype>a.reference:hover,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype:-webkit-any(a.reference):hover,.md-typeset :-webkit-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference:hover{color:var(--md-accent-fg-color)}.md-typeset .sig-inline .desctype:-moz-any(a.reference):hover,.md-typeset .sig-inline .desctype>a.reference:hover,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype:-moz-any(a.reference):hover,.md-typeset :-moz-any(dl.objdesc,dl.api-field)>dt .desctype>a.reference:hover{color:var(--md-accent-fg-color)}.md-typeset .sig-inline .desctype:is(a.reference):hover,.md-typeset .sig-inline .desctype>a.reference:hover,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype:is(a.reference):hover,.md-typeset :is(dl.objdesc,dl.api-field)>dt .desctype>a.reference:hover{color:var(--md-accent-fg-color)}.md-typeset dl.objdesc>dt{background:var(--md-code-bg-color);font-family:var(--md-code-font-family);padding-left:.5em;padding-right:.5em;padding-top:.5em}.md-typeset dl.objdesc>dt,.md-typeset dl.objdesc>dt code{font-size:.75rem}.md-typeset dl.objdesc>dt .property{color:var(--md-code-hl-keyword-color);font-style:normal;font-weight:700}.md-typeset dl.objdesc>dt .sig-prename{color:var(--md-code-hl-name-color);padding:0}.md-typeset dl.objdesc>dt .viewcode-back,.md-typeset dl.objdesc>dt .viewcode-link{float:right;text-align:right}.md-typeset dl.objdesc>dt.api-include-path,.md-typeset dl.objdesc>dt.api-include-path code{font-size:.65rem}.md-typeset dl.objdesc>dt:first-child{padding-top:.5em}.md-typeset dl.objdesc>dt:last-of-type{padding-bottom:.5em}.md-typeset dl.objdesc>dd dl.field-list>dt{font-size:1em;font-weight:700;margin-bottom:1em}.md-typeset dl.objdesc>dd dd.noindent{margin-left:0}.md-typeset dl.api-field>dt{display:table}.md-typeset dl.api-field>dt a.headerlink{left:.5em;margin-left:0;position:relative;width:0}.md-typeset dl.api-field>dt,.md-typeset dl.api-field>dt code{font-size:.65rem}.md-typeset dl.api-field>dt.api-parameter-kind{float:right;font-family:var(--md-text-font-family)}.md-typeset dl.api-field>dt.api-parameter-kind:before{content:"["}.md-typeset dl.api-field>dt.api-parameter-kind:after{content:"]"}.md-typeset dl.objdesc.summary>dd,.md-typeset dl.objdesc.summary>dd>p:first-child{margin-top:0}.md-typeset .sig-inline:-webkit-any(.c-texpr,.cpp-texpr){background-color:unset;font-family:unset}.md-typeset .sig-inline:-moz-any(.c-texpr,.cpp-texpr){background-color:unset;font-family:unset}.md-typeset .sig-inline:is(.c-texpr,.cpp-texpr){background-color:unset;font-family:unset}.md-nav__link{white-space:nowrap}:root>*{--objinfo-icon-fg-alias:#e65100;--objinfo-icon-fg-default:#424242;--objinfo-icon-fg-data:#1565c0;--objinfo-icon-fg-procedure:#6a1b9a;--objinfo-icon-fg-sub-data:#2e7d32;--objinfo-icon-bg-default:var(--md-default-bg-color)}@media screen{[data-md-color-scheme=slate]{--objinfo-icon-fg-alias:#ffb74d;--objinfo-icon-fg-default:#e0e0e0;--objinfo-icon-fg-data:#64b5f6;--objinfo-icon-fg-procedure:#ce93d8;--objinfo-icon-fg-sub-data:#81c784}}.objinfo-icon{background-color:var(--objinfo-icon-bg-default);border:1px solid var(--objinfo-icon-fg-default);border-radius:2px;color:var(--objinfo-icon-fg-default);display:inline-table;flex-shrink:0;font-family:var(--md-text-font-family);font-weight:500;height:16px;line-height:16px;margin-right:8px;text-align:center;vertical-align:middle;width:16px}.objinfo-icon__alias{background-color:var(--objinfo-icon-fg-alias);border:1px solid var(--objinfo-icon-fg-alias);color:var(--objinfo-icon-bg-default)}.objinfo-icon__procedure{background-color:var(--objinfo-icon-fg-procedure);border:1px solid var(--objinfo-icon-fg-procedure);color:var(--objinfo-icon-bg-default)}.objinfo-icon__data{background-color:var(--objinfo-icon-fg-data);border:1px solid var(--objinfo-icon-fg-data);color:var(--objinfo-icon-bg-default)}.objinfo-icon__sub-data{background-color:var(--objinfo-icon-fg-sub-data);border:1px solid var(--objinfo-icon-fg-sub-data);color:var(--objinfo-icon-bg-default)}.search-result-objlabel{border:1px solid var(--md-default-fg-color--light);border-radius:2px;float:right;padding:2px}table.longtable.docutils.data.align-default tbody>tr>td>p>a.reference.internal>code.xref.py.py-obj.docutils.literal.notranslate>span.pre{word-break:normal} +@media screen{[data-md-color-scheme=slate]{--md-hue:232;--md-default-fg-color:hsla(var(--md-hue),75%,95%,1);--md-default-fg-color--light:hsla(var(--md-hue),75%,90%,0.62);--md-default-fg-color--lighter:hsla(var(--md-hue),75%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),75%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,21%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,21%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,21%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,21%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,1);--md-code-bg-color:hsla(var(--md-hue),15%,15%,1);--md-code-hl-color:rgba(66,135,255,.15);--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(66,135,255,.3);--md-typeset-kbd-color:hsla(var(--md-hue),15%,94%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,94%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-table-color:hsla(var(--md-hue),75%,95%,0.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,12%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,10%,1);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.3),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.4),0 0 0.05rem rgba(0,0,0,.35)}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=slate] img[src$="#only-dark"]{display:initial}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#bd78c9}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a682e3}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#6c91d5}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff9575}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c7846b}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#6c91d5}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:rgba(255,25,71,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:rgba(245,0,86,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:rgba(223,65,251,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:rgba(124,77,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:rgba(66,135,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:rgba(0,145,235,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:rgba(0,186,214,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:rgba(0,189,164,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:rgba(0,199,83,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:rgba(99,222,23,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:rgba(176,235,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:rgba(255,213,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:rgba(255,170,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:rgba(255,145,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:rgba(255,110,66,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:#fff;--md-primary-fg-color--light:hsla(0,0%,100%,.7);--md-primary-fg-color--dark:rgba(0,0,0,.07);--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54);--md-typeset-a-color:#4051b5}[data-md-color-primary=white] .md-hero--expand{border-bottom:.05rem solid rgba(0,0,0,.07)}@media screen and (max-width:76.1875em){[data-md-color-primary=white] .md-hero{border-bottom:.05rem solid rgba(0,0,0,.07)}}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:rgba(0,0,0,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color:#000;--md-primary-fg-color--light:rgba(0,0,0,.54);--md-primary-fg-color--dark:#000;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-header,[data-md-color-primary=black] .md-hero{background-color:#000}@media screen and (max-width:59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width:60em){[data-md-color-primary=black] .md-search__form{background-color:hsla(0,0%,100%,.12)}[data-md-color-primary=black] .md-search__form:hover{background-color:hsla(0,0%,100%,.3)}}@media screen and (max-width:76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}} +@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/638764dc2513deb09c55fc025f6dd36c.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/8007dfe835cfb201b8caaa9651098588.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/8c3798e37724f71bc0c63c44a5307413.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/ca7eea0cf248d6e8442c01074765bd33.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 100;src: url(fonts/0f303f31706d39866cced9dcc17b61fb.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/6de03a64aa8100032abc6e836b3ed803.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/0ec3cc19652785204ea2e322330f0f1b.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/b57a5ada789f195d5d42f4073a6cf313.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/daf12b5f1889502004bba85ad71f9fa4.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/64a6b4e954cf84685cbf8de77eb47344.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 100;src: url(fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/435e4b7f9f250d9d9243d4754799fc96.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/20dc200cc43ab904876fb0c1697ebe39.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/51f3f41805329fb8341beb56ded833ea.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 300;src: url(fonts/f75911313e1c7802c23345ab57e754d8.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/28e6b81b1bc1964707edd4179e4268f5.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/e704ef18719c08839bc99a32437ef0f8.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/76945c7494c20515bb45d1dedab8f706.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/21953b998bab09c1f60c599caee56378.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/e33716333704ab19fdf9989e072ad49a.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 300;src: url(fonts/bb8007225d94a099cddbade7ea904667.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/3254c528e2ab56454a9f22191035c5fe.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/495d38d4b9741e8aa4204002414069e2.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/daf51ab540602b2d0b87646621637bac.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/77b24796a3d4ab521f66765651875338.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 400;src: url(fonts/f6734f8177112c0839b961f96d813fcb.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/a6933e678530b263486fa7b185a449ca.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/144860ed1e48e186f08997e6388a9c3f.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/2ea7a97b7c976b121112a088eb398561.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/0b68e8634c96265eb32a0c769416b5b0.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/9582ced8a675bf267cc7ac392a86413e.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 400;src: url(fonts/db0424fb67fb52e7e538490240cc7fb9.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/2096d27efc16cbdd79183bf295c8ebde.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/713780d8b30bda5583052ea847cdcb4f.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 500;src: url(fonts/b019538234514166ec7665359d097403.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/38f3ee1f96b758f95672c632d8759594.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/4c815fdc869f885520f7c8eae6730edf.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/6deb20301c65a96db17c433ad0cf8158.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/63111d307c01b52ffccf7b0319cb7917.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/e56cc9fb5272752b78f144b4be43175d.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/2e10480d4154762bc7c8fbb40877e104.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/7af61b2367eba2b1852e837c46a75696.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 500;src: url(fonts/661d4b208656c006e7aab58acf778485.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/ac848474638236e67a64bc654fb18de0.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/3c505383d37d2078648e37868bbd1fad.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/5b6377da4c959db6d4b22738a27f1bee.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/4ec57f2a80b91090971b83970230ca09.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/fc66f942651a9fe1a598770d3d896529.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 700;src: url(fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/8aa562790559d61dd5178a88a296d70f.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/ccdebed88064e470c15f37c432922e57.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/acaac043ca238f0e56e61864456777fa.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 700;src: url(fonts/6be97ca17228a69c406231d89c003194.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/84e959dd07f302392f0ffd86f87db888.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/9fdb12ceee3a402d3a54afe354552459.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/76da333ab59c6d625cabfb0768f82b4a.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/3a38c967413f7bce36d3baefc321aade.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: normal;font-weight: 900;src: url(fonts/7e262106f82cc52663e403f5b73795bb.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/2f5c32f094829c0278bce28fe2bbe074.ttf) format('truetype');}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/da6cd48e6dad1888fccc91735e7522f7.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/50aacf068f685be0dd903a91d5bab7d8.woff2) format('woff2');unicode-range: U+1F00-1FFF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/1383417807f7965daaf94e7c497dcddb.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/3f1918538864f9681d47a4538d48289c.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/bfd1a0c9c783e84595589f33e1828a57.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto';font-style: italic;font-weight: 900;src: url(fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/c6dc61b627bbc5af9130518297bd4f17.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/78a9265759e7b861a1639a36f4c01d04.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/2f7c3c315334a99574ee4ceb21af654d.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/870e5928dd14fcfe0ce9386107666774.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 100;src: url(fonts/cce2217cc8323fe49789adefb3596291.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/302b0425bf5ea66f37a822a61d723adc.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/c22066c14662d6c80415ae04c5dd9d51.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/de018865c95896bb57265fc97c48ebd7.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/3177dacffeac1eb4102852811ae4a2c7.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/5989ef3a21d7f252337ab3326f78bde7.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/dd719f1662079ce6a61260f9af972379.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 100;src: url(fonts/07ff82964967feebb9c96288e0e0df05.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/4f93c2808e3b69e525c118074e5de31f.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/99be4d68845d66c27c7f7d3a48687b66.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/029e176ad602329b4434892101db9cf3.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/9095d663e4d450059bcc2260bb75cd62.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/1181a8e619707033241139715eca64c6.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 200;src: url(fonts/22aadc77cafa07b2db9ed560d0320616.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/765bd4a97597a4d7781193793477a6cd.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/ab03beb9091fa15ce4e783199e076bc6.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/a70ff2592da5e3453943f727633aff54.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/d07f561ba87d93460742b060727d9e0d.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 200;src: url(fonts/43358c04243de546caddd0898dbf0757.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/63f4b74ebf127dbeb033126ea988f54e.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/0053ba6958e79f26751eabb555bd73d0.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 300;src: url(fonts/90ebb29b5cffa197b184773983ba7e91.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/71e06579279fba7436d58a1c49288909.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/fb1aaa90783b8cb9375265abeb91b153.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/2325b97b584755067ea4f7f56ee05430.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/f534242dea2255c25b9d05c2371986e3.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 300;src: url(fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/aa28d99c7db60ad23f96a5c317615c42.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/52f28cb4d065b4adfa78df4f9559c639.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/122802d03aed4bf8cd6a03997a97aca4.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/4039566f251699c4b421ed1a38a59b24.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 400;src: url(fonts/32c8a74ac0816253d69a7cc68a60986d.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/99cf36e763be9cce7b4c59b91841af58.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/255cf41e0317d95e3992683a76ef28a8.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/f154d62b4879af7a22895af7a4ef03f0.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 400;src: url(fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/1512b579343c6b61c7523cdd838d8328.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/25c52b9af13f0d1b10719f5289e8c803.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/b4e42731e8d667ae87c3450c345754ae.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 500;src: url(fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/bc67bba106323289ea3eda0826de1912.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/392ff374142585f7b886ee1fe66e686e.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/1f1481679a64a39f3427547aa1b13f0f.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 500;src: url(fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/aab05142e0e2dadf7df633e061e612ad.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/77ff81100e5a1db3d925f713660700ad.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/101522bafe9c61c68698ecc784607772.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 600;src: url(fonts/c28a41f656599f6694528b5463c6a445.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/cadfb311297a9362b07fab73934b432a.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/e99627cd27de169d23ece4573006af2a.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/437939342255944b82a49f916404c5fc.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/83614c36460a4a9734968789cb535de7.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 600;src: url(fonts/b4d3c40a77fd9e35a881a79077957055.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/770518db51bed1e082feecc532cfcbf8.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/cd3d1f17e048e2116f438bd7157baccf.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: normal;font-weight: 700;src: url(fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/d422317033deb87342a5e56c7be67458.ttf) format('truetype');}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/2c0f74be498d2da814c0a84dd6833f70.woff2) format('woff2');unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2) format('woff2');unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2) format('woff2');unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2) format('woff2');unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/60eb682678bbea5e8ad71f66f2f65536.woff2) format('woff2');unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face {font-family: 'Roboto Mono';font-style: italic;font-weight: 700;src: url(fonts/5ce47d5195e59af38114d0b70217baf2.woff2) format('woff2');unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;} +:root{--si-icon--material_alert-circle:url('data:image/svg+xml;charset=utf-8,');--si-icon--material_delete:url('data:image/svg+xml;charset=utf-8,');}.md-typeset .si-icon-inline.material_alert-circle::before{-webkit-mask-image:var(--si-icon--material_alert-circle);mask-image:var(--si-icon--material_alert-circle);}.md-typeset .si-icon-inline.material_delete::before{-webkit-mask-image:var(--si-icon--material_delete);mask-image:var(--si-icon--material_delete);}.md-typeset .admonition.versionadded{border-color:rgb(72,138,87);}.md-typeset .versionadded>.admonition-title{background-color:rgba(72,138,87,0.1);border-color:rgb(72,138,87);}.md-typeset .versionadded>.admonition-title::before{background-color:rgb(72,138,87);-webkit-mask-image:var(--si-icon--material_alert-circle);mask-image:var(--si-icon--material_alert-circle);}.md-typeset .admonition.versionchanged{border-color:rgb(238,144,64);}.md-typeset .versionchanged>.admonition-title{background-color:rgba(238,144,64,0.1);border-color:rgb(238,144,64);}.md-typeset .versionchanged>.admonition-title::before{background-color:rgb(238,144,64);-webkit-mask-image:var(--si-icon--material_alert-circle);mask-image:var(--si-icon--material_alert-circle);}.md-typeset .admonition.deprecated{border-color:rgb(203,70,83);}.md-typeset .deprecated>.admonition-title{background-color:rgba(203,70,83,0.1);border-color:rgb(203,70,83);}.md-typeset .deprecated>.admonition-title::before{background-color:rgb(203,70,83);-webkit-mask-image:var(--si-icon--material_delete);mask-image:var(--si-icon--material_delete);} diff --git a/html/_static/sphinx_immaterial_theme.f9d9eeeb247ace16c.min.js b/html/_static/sphinx_immaterial_theme.f9d9eeeb247ace16c.min.js new file mode 100644 index 00000000..8334adf7 --- /dev/null +++ b/html/_static/sphinx_immaterial_theme.f9d9eeeb247ace16c.min.js @@ -0,0 +1,27 @@ +"use strict";(()=>{var aa=Object.create;var wr=Object.defineProperty;var sa=Object.getOwnPropertyDescriptor;var ca=Object.getOwnPropertyNames,Rt=Object.getOwnPropertySymbols,fa=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,dn=Object.prototype.propertyIsEnumerable;var mn=(e,t,r)=>t in e?wr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,N=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&mn(e,r,t[r]);if(Rt)for(var r of Rt(t))dn.call(t,r)&&mn(e,r,t[r]);return e};var hn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Rt)for(var n of Rt(e))t.indexOf(n)<0&&dn.call(e,n)&&(r[n]=e[n]);return r};var vt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var la=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ca(t))!Er.call(e,o)&&o!==r&&wr(e,o,{get:()=>t[o],enumerable:!(n=sa(t,o))||n.enumerable});return e};var Je=(e,t,r)=>(r=e!=null?aa(fa(e)):{},la(t||!e||!e.__esModule?wr(r,"default",{value:e,enumerable:!0}):r,e));var ze=(e,t,r)=>new Promise((n,o)=>{var i=s=>{try{c(r.next(s))}catch(f){o(f)}},a=s=>{try{c(r.throw(s))}catch(f){o(f)}},c=s=>s.done?n(s.value):Promise.resolve(s.value).then(i,a);c((r=r.apply(e,t)).next())});var vn=vt((Sr,bn)=>{(function(e,t){typeof Sr=="object"&&typeof bn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Sr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function c(x){return!!(x&&x!==document&&x.nodeName!=="HTML"&&x.nodeName!=="BODY"&&"classList"in x&&"contains"in x.classList)}function s(x){var Te=x.type,Le=x.tagName;return!!(Le==="INPUT"&&a[Te]&&!x.readOnly||Le==="TEXTAREA"&&!x.readOnly||x.isContentEditable)}function f(x){x.classList.contains("focus-visible")||(x.classList.add("focus-visible"),x.setAttribute("data-focus-visible-added",""))}function u(x){!x.hasAttribute("data-focus-visible-added")||(x.classList.remove("focus-visible"),x.removeAttribute("data-focus-visible-added"))}function l(x){x.metaKey||x.altKey||x.ctrlKey||(c(r.activeElement)&&f(r.activeElement),n=!0)}function p(x){n=!1}function m(x){!c(x.target)||(n||s(x.target))&&f(x.target)}function h(x){!c(x.target)||(x.target.classList.contains("focus-visible")||x.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(x.target))}function b(x){document.visibilityState==="hidden"&&(o&&(n=!0),v())}function v(){document.addEventListener("mousemove",$),document.addEventListener("mousedown",$),document.addEventListener("mouseup",$),document.addEventListener("pointermove",$),document.addEventListener("pointerdown",$),document.addEventListener("pointerup",$),document.addEventListener("touchmove",$),document.addEventListener("touchstart",$),document.addEventListener("touchend",$)}function V(){document.removeEventListener("mousemove",$),document.removeEventListener("mousedown",$),document.removeEventListener("mouseup",$),document.removeEventListener("pointermove",$),document.removeEventListener("pointerdown",$),document.removeEventListener("pointerup",$),document.removeEventListener("touchmove",$),document.removeEventListener("touchstart",$),document.removeEventListener("touchend",$)}function $(x){x.target.nodeName&&x.target.nodeName.toLowerCase()==="html"||(n=!1,V())}document.addEventListener("keydown",l,!0),document.addEventListener("mousedown",p,!0),document.addEventListener("pointerdown",p,!0),document.addEventListener("touchstart",p,!0),document.addEventListener("visibilitychange",b,!0),v(),r.addEventListener("focus",m,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var gn=vt(Or=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(f){return!1}},r=t(),n=function(f){var u={next:function(){var l=f.shift();return{done:l===void 0,value:l}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(f){return encodeURIComponent(f).replace(/%20/g,"+")},i=function(f){return decodeURIComponent(String(f).replace(/\+/g," "))},a=function(){var f=function(l){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var p=typeof l;if(p!=="undefined")if(p==="string")l!==""&&this._fromString(l);else if(l instanceof f){var m=this;l.forEach(function(V,$){m.append($,V)})}else if(l!==null&&p==="object")if(Object.prototype.toString.call(l)==="[object Array]")for(var h=0;hm[0]?1:0}),f._entries&&(f._entries={});for(var l=0;l1?i(m[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(s,f){typeof s!="string"&&(s=String(s)),f&&typeof f!="string"&&(f=String(f));var u=document,l;if(f&&(e.location===void 0||f!==e.location.href)){f=f.toLowerCase(),u=document.implementation.createHTMLDocument(""),l=u.createElement("base"),l.href=f,u.head.appendChild(l);try{if(l.href.indexOf(f)!==0)throw new Error(l.href)}catch(x){throw new Error("URL unable to set base "+f+" due to "+x)}}var p=u.createElement("a");p.href=s,l&&(u.body.appendChild(p),p.href=p.href);var m=u.createElement("input");if(m.type="url",m.value=s,p.protocol===":"||!/:/.test(p.href)||!m.checkValidity()&&!f)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:p});var h=new e.URLSearchParams(this.search),b=!0,v=!0,V=this;["append","delete","set"].forEach(function(x){var Te=h[x];h[x]=function(){Te.apply(h,arguments),b&&(v=!1,V.search=h.toString(),v=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var $=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==$&&($=this.search,v&&(b=!1,this.searchParams._fromString(this.search),b=!0))}})},a=i.prototype,c=function(s){Object.defineProperty(a,s,{get:function(){return this._anchorElement[s]},set:function(f){this._anchorElement[s]=f},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(s){c(s)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(s){this._anchorElement.search=s,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var s=this;return function(){return s.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(s){this._anchorElement.href=s,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(s){this._anchorElement.pathname=s},enumerable:!0},origin:{get:function(){var s={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],f=this._anchorElement.port!=s&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(f?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(s){},enumerable:!0},username:{get:function(){return""},set:function(s){},enumerable:!0}}),i.createObjectURL=function(s){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(s){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or)});var Un=vt((tc,Pt)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var yn,xn,wn,En,Sn,On,_n,Tn,Ln,Ht,_r,Mn,An,Cn,it,Rn,Hn,kn,Pn,$n,In,jn,Fn,kt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(r(t,r(n)))}):typeof Pt=="object"&&typeof Pt.exports=="object"?e(r(t,r(Pt.exports))):e(r(t));function r(n,o){return n!==t&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,a){return n[i]=o?o(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};yn=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");t(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},xn=Object.assign||function(n){for(var o,i=1,a=arguments.length;i=0;u--)(f=n[u])&&(s=(c<3?f(s):c>3?f(o,i,s):f(o,i))||s);return c>3&&s&&Object.defineProperty(o,i,s),s},Sn=function(n,o){return function(i,a){o(i,a,n)}},On=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},_n=function(n,o,i,a){function c(s){return s instanceof i?s:new i(function(f){f(s)})}return new(i||(i=Promise))(function(s,f){function u(m){try{p(a.next(m))}catch(h){f(h)}}function l(m){try{p(a.throw(m))}catch(h){f(h)}}function p(m){m.done?s(m.value):c(m.value).then(u,l)}p((a=a.apply(n,o||[])).next())})},Tn=function(n,o){var i={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},a,c,s,f;return f={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(f[Symbol.iterator]=function(){return this}),f;function u(p){return function(m){return l([p,m])}}function l(p){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,c&&(s=p[0]&2?c.return:p[0]?c.throw||((s=c.return)&&s.call(c),0):c.next)&&!(s=s.call(c,p[1])).done)return s;switch(c=0,s&&(p=[p[0]&2,s.value]),p[0]){case 0:case 1:s=p;break;case 4:return i.label++,{value:p[1],done:!1};case 5:i.label++,c=p[1],p=[0];continue;case 7:p=i.ops.pop(),i.trys.pop();continue;default:if(s=i.trys,!(s=s.length>0&&s[s.length-1])&&(p[0]===6||p[0]===2)){i=0;continue}if(p[0]===3&&(!s||p[1]>s[0]&&p[1]=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},_r=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var a=i.call(n),c,s=[],f;try{for(;(o===void 0||o-- >0)&&!(c=a.next()).done;)s.push(c.value)}catch(u){f={error:u}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(f)throw f.error}}return s},Mn=function(){for(var n=[],o=0;o1||u(b,v)})})}function u(b,v){try{l(a[b](v))}catch(V){h(s[0][3],V)}}function l(b){b.value instanceof it?Promise.resolve(b.value.v).then(p,m):h(s[0][2],b)}function p(b){u("next",b)}function m(b){u("throw",b)}function h(b,v){b(v),s.shift(),s.length&&u(s[0][0],s[0][1])}},Hn=function(n){var o,i;return o={},a("next"),a("throw",function(c){throw c}),a("return"),o[Symbol.iterator]=function(){return this},o;function a(c,s){o[c]=n[c]?function(f){return(i=!i)?{value:it(n[c](f)),done:c==="return"}:s?s(f):f}:s}},kn=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Ht=="function"?Ht(n):n[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(s){i[s]=n[s]&&function(f){return new Promise(function(u,l){f=n[s](f),c(u,l,f.done,f.value)})}}function c(s,f,u,l){Promise.resolve(l).then(function(p){s({value:p,done:u})},f)}},Pn=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var r=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};$n=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&kt(o,n,i);return r(o,n),o},In=function(n){return n&&n.__esModule?n:{default:n}},jn=function(n,o){if(!o.has(n))throw new TypeError("attempted to get private field on non-instance");return o.get(n)},Fn=function(n,o,i){if(!o.has(n))throw new TypeError("attempted to set private field on non-instance");return o.set(n,i),i},e("__extends",yn),e("__assign",xn),e("__rest",wn),e("__decorate",En),e("__param",Sn),e("__metadata",On),e("__awaiter",_n),e("__generator",Tn),e("__exportStar",Ln),e("__createBinding",kt),e("__values",Ht),e("__read",_r),e("__spread",Mn),e("__spreadArrays",An),e("__spreadArray",Cn),e("__await",it),e("__asyncGenerator",Rn),e("__asyncDelegator",Hn),e("__asyncValues",kn),e("__makeTemplateObject",Pn),e("__importStar",$n),e("__importDefault",In),e("__classPrivateFieldGet",jn),e("__classPrivateFieldSet",Fn)})});var Qr=vt((Lt,Jr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT Β© Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Jr=="object"?Jr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ia}});var a=i(279),c=i.n(a),s=i(370),f=i.n(s),u=i(817),l=i.n(u);function p(F){try{return document.execCommand(F)}catch(S){return!1}}var m=function(S){var E=l()(S);return p("cut"),E},h=m;function b(F){var S=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[S?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=F,E}var v=function(S,E){var H=b(S);E.container.appendChild(H);var j=l()(H);return p("copy"),H.remove(),j},V=function(S){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof S=="string"?H=v(S,E):S instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(S==null?void 0:S.type)?H=v(S.value,E):(H=l()(S),p("copy")),H},$=V;function x(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?x=function(E){return typeof E}:x=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},x(F)}var Te=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=S.action,H=E===void 0?"copy":E,j=S.container,K=S.target,Me=S.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(K!==void 0)if(K&&x(K)==="object"&&K.nodeType===1){if(H==="copy"&&K.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(K.hasAttribute("readonly")||K.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return $(Me,{container:j});if(K)return H==="cut"?h(K):$(K,{container:j})},Le=Te;function we(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?we=function(E){return typeof E}:we=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},we(F)}function Mt(F,S){if(!(F instanceof S))throw new TypeError("Cannot call a class as a function")}function ot(F,S){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof j.action=="function"?j.action:this.defaultAction,this.target=typeof j.target=="function"?j.target:this.defaultTarget,this.text=typeof j.text=="function"?j.text:this.defaultText,this.container=we(j.container)==="object"?j.container:document.body}},{key:"listenClick",value:function(j){var K=this;this.listener=f()(j,"click",function(Me){return K.onClick(Me)})}},{key:"onClick",value:function(j){var K=j.delegateTarget||j.currentTarget,Me=this.action(K)||"copy",Ct=Le({action:Me,container:this.container,target:this.target(K),text:this.text(K)});this.emit(Ct?"success":"error",{action:Me,text:Ct,trigger:K,clearSelection:function(){K&&K.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(j){return xr("action",j)}},{key:"defaultTarget",value:function(j){var K=xr("target",j);if(K)return document.querySelector(K)}},{key:"defaultText",value:function(j){return xr("text",j)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(j){var K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return $(j,K)}},{key:"cut",value:function(j){return h(j)}},{key:"isSupported",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],K=typeof j=="string"?[j]:j,Me=!!document.queryCommandSupported;return K.forEach(function(Ct){Me=Me&&!!document.queryCommandSupported(Ct)}),Me}}]),E}(c()),ia=oa},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(c,s){for(;c&&c.nodeType!==o;){if(typeof c.matches=="function"&&c.matches(s))return c;c=c.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function c(u,l,p,m,h){var b=f.apply(this,arguments);return u.addEventListener(p,b,h),{destroy:function(){u.removeEventListener(p,b,h)}}}function s(u,l,p,m,h){return typeof u.addEventListener=="function"?c.apply(null,arguments):typeof p=="function"?c.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(b){return c(b,l,p,m,h)}))}function f(u,l,p,m){return function(h){h.delegateTarget=a(h.target,l),h.delegateTarget&&m.call(u,h)}}n.exports=s},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),c=i(438);function s(p,m,h){if(!p&&!m&&!h)throw new Error("Missing required arguments");if(!a.string(m))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(p))return f(p,m,h);if(a.nodeList(p))return u(p,m,h);if(a.string(p))return l(p,m,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function f(p,m,h){return p.addEventListener(m,h),{destroy:function(){p.removeEventListener(m,h)}}}function u(p,m,h){return Array.prototype.forEach.call(p,function(b){b.addEventListener(m,h)}),{destroy:function(){Array.prototype.forEach.call(p,function(b){b.removeEventListener(m,h)})}}}function l(p,m,h){return c(document.body,p,m,h)}n.exports=s},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var c=i.hasAttribute("readonly");c||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),c||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var s=window.getSelection(),f=document.createRange();f.selectNodeContents(i),s.removeAllRanges(),s.addRange(f),a=s.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,c){var s=this.e||(this.e={});return(s[i]||(s[i]=[])).push({fn:a,ctx:c}),this},once:function(i,a,c){var s=this;function f(){s.off(i,f),a.apply(c,arguments)}return f._=a,this.on(i,f,c)},emit:function(i){var a=[].slice.call(arguments,1),c=((this.e||(this.e={}))[i]||[]).slice(),s=0,f=c.length;for(s;s{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Ls=/["'&<>]/;Ti.exports=Ms;function Ms(e){var t=""+e,r=Ls.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,c=o.observers;return i||a?Tr:(this.currentObservers=null,c.push(r),new $e(function(){n.currentObservers=null,Ve(c,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new Xn(r,n)},t}(U);var Xn=function(e){re(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Tr},t}(L);var yt={now:function(){return(yt.delegate||Date).now()},delegate:void 0};var xt=function(e){re(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=yt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,c=n._timestampProvider,s=n._windowTime;o||(i.push(r),!a&&i.push(c.now()+s)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,c=a.slice(),s=0;s0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ft.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ft.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Dt);var to=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var fe=new to(eo);var k=new U(function(e){return e.complete()});function zt(e){return e&&T(e.schedule)}function kr(e){return e[e.length-1]}function qe(e){return T(kr(e))?e.pop():void 0}function Ee(e){return zt(kr(e))?e.pop():void 0}function qt(e,t){return typeof kr(e)=="number"?e.pop():t}var lt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Kt(e){return T(e==null?void 0:e.then)}function Bt(e){return T(e[ct])}function Yt(e){return Symbol.asyncIterator&&T(e==null?void 0:e[Symbol.asyncIterator])}function Gt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ya(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Jt=ya();function Qt(e){return T(e==null?void 0:e[Jt])}function Xt(e){return Dn(this,arguments,function(){var r,n,o,i;return $t(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,It(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,It(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,It(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Zt(e){return T(e==null?void 0:e.getReader)}function D(e){if(e instanceof U)return e;if(e!=null){if(Bt(e))return xa(e);if(lt(e))return wa(e);if(Kt(e))return Ea(e);if(Yt(e))return ro(e);if(Qt(e))return Sa(e);if(Zt(e))return Oa(e)}throw Gt(e)}function xa(e){return new U(function(t){var r=e[ct]();if(T(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function wa(e){return new U(function(t){for(var r=0;r=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new L}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,c=e.resetOnRefCountZero,s=c===void 0?!0:c;return function(f){var u,l,p,m=0,h=!1,b=!1,v=function(){l==null||l.unsubscribe(),l=void 0},V=function(){v(),u=p=void 0,h=b=!1},$=function(){var x=u;V(),x==null||x.unsubscribe()};return y(function(x,Te){m++,!b&&!h&&v();var Le=p=p!=null?p:r();Te.add(function(){m--,m===0&&!b&&!h&&(l=Dr($,s))}),Le.subscribe(Te),!u&&m>0&&(u=new Xe({next:function(we){return Le.next(we)},error:function(we){b=!0,v(),l=Dr(V,o,we),Le.error(we)},complete:function(){h=!0,v(),l=Dr(V,a),Le.complete()}}),D(x).subscribe(u))})(f)}}function Dr(e,t){for(var r=[],n=2;ne.next(document)),e}function W(e,t=document){return Array.from(t.querySelectorAll(e))}function B(e,t=document){let r=ie(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ie(e,t=document){return t.querySelector(e)||void 0}function Fe(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function nr(e){return P(w(document.body,"focusin"),w(document.body,"focusout")).pipe(He(1),d(()=>{let t=Fe();return typeof t!="undefined"?e.contains(t):!1}),q(e===Fe()),Q())}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function Oo(e){return P(w(window,"load"),w(window,"resize")).pipe(Re(0,fe),d(()=>Be(e)),q(Be(e)))}function or(e){return{x:e.scrollLeft,y:e.scrollTop}}function _t(e){return P(w(e,"scroll"),w(window,"resize")).pipe(Re(0,fe),d(()=>or(e)),q(or(e)))}var To=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Br||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),Ka?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Br||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=qa.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Lo=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Ao=typeof WeakMap!="undefined"?new WeakMap:new To,Co=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ba.getInstance(),n=new ns(t,r,this);Ao.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Co.prototype[e]=function(){var t;return(t=Ao.get(this))[e].apply(t,arguments)}});var os=function(){return typeof ir.ResizeObserver!="undefined"?ir.ResizeObserver:Co}(),Ro=os;var Ho=new L,is=I(()=>C(new Ro(e=>{for(let t of e)Ho.next(t)}))).pipe(_(e=>P(je,C(e)).pipe(R(()=>e.disconnect()))),X(1));function Se(e){return{width:e.offsetWidth,height:e.offsetHeight}}function de(e){return is.pipe(M(t=>t.observe(e)),_(t=>Ho.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),d(()=>Se(e)))),q(Se(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ko(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Po=new L,as=I(()=>C(new IntersectionObserver(e=>{for(let t of e)Po.next(t)},{threshold:0}))).pipe(_(e=>P(je,C(e)).pipe(R(()=>e.disconnect()))),X(1));function cr(e){return as.pipe(M(t=>t.observe(e)),_(t=>Po.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),d(({isIntersecting:r})=>r))))}var fr={drawer:B("[data-md-toggle=drawer]"),search:B("[data-md-toggle=search]")};function $o(e){return fr[e].checked}function Ye(e,t){fr[e].checked!==t&&fr[e].click()}function ht(e){let t=fr[e];return w(t,"change").pipe(d(()=>t.checked),q(t.checked))}function ss(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Io(){return w(window,"keydown").pipe(A(e=>!(e.metaKey||e.ctrlKey)),d(e=>({mode:$o("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),A(({mode:e,type:t})=>{if(e==="global"){let r=Fe();if(typeof r!="undefined")return!ss(r,t)}return!0}),pe())}function Oe(){return new URL(location.href)}function lr(e){location.href=e.href}function jo(){return new L}function Fo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Fo(e,r)}function O(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)Fo(n,o);return n}function Uo(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function ur(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Vo(){return location.hash.substring(1)}function No(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function cs(){return w(window,"hashchange").pipe(d(Vo),q(Vo()),A(e=>e.length>0),X(1))}function Do(){return cs().pipe(d(e=>ie(`[id="${e}"]`)),A(e=>typeof e!="undefined"))}function Yr(e){let t=matchMedia(e);return tr(r=>t.addListener(()=>r(t.matches))).pipe(q(t.matches))}function Wo(){let e=matchMedia("print");return P(w(window,"beforeprint").pipe(d(()=>!0)),w(window,"afterprint").pipe(d(()=>!1))).pipe(q(e.matches))}function Gr(e,t){return e.pipe(_(r=>r?t():k))}function pr(e,t={credentials:"same-origin"}){return be(fetch(`${e}`,t)).pipe(le(()=>k),_(r=>r.status!==200?Et(()=>new Error(r.statusText)):C(r)))}function Ge(e,t){return pr(e,t).pipe(_(r=>r.json()),X(1))}function zo(e,t){let r=new DOMParser;return pr(e,t).pipe(_(n=>n.text()),d(n=>r.parseFromString(n,"text/xml")),X(1))}function qo(e){let t=O("script",{src:e});return I(()=>(document.head.appendChild(t),P(w(t,"load"),w(t,"error").pipe(_(()=>Et(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(d(()=>{}),R(()=>document.head.removeChild(t)),ve(1))))}function Ko(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Bo(){return P(w(window,"scroll",{passive:!0}),w(window,"resize",{passive:!0})).pipe(d(Ko),q(Ko()))}function Yo(){return{width:innerWidth,height:innerHeight}}function Go(){return w(window,"resize",{passive:!0}).pipe(d(Yo),q(Yo()))}function Jo(){return G([Bo(),Go()]).pipe(d(([e,t])=>({offset:e,size:t})),X(1))}function mr(e,{viewport$:t,header$:r}){let n=t.pipe(J("size")),o=G([n,r]).pipe(d(()=>Be(e)));return G([r,t,o]).pipe(d(([{height:i},{offset:a,size:c},{x:s,y:f}])=>({offset:{x:a.x-s,y:a.y-f+i},size:c})))}var fs=B("#__config"),bt=JSON.parse(fs.textContent);bt.base=`${new URL(bt.base,Oe())}`;function ce(){return bt}function Z(e){return bt.features.includes(e)}function ae(e,t){return typeof t!="undefined"?bt.translations[e].replace("#",t.toString()):bt.translations[e]}function _e(e,t=document){return B(`[data-md-component=${e}]`,t)}function ee(e,t=document){return W(`[data-md-component=${e}]`,t)}function ls(e){let t=B(".md-typeset > :first-child",e);return w(t,"click",{once:!0}).pipe(d(()=>B(".md-typeset",e)),d(r=>({hash:__md_hash(r.innerHTML)})))}function Qo(e){return!Z("announce.dismiss")||!e.childElementCount?k:I(()=>{let t=new L;return t.pipe(q({hash:__md_get("__announce")})).subscribe(({hash:r})=>{var n;r&&r===((n=__md_get("__announce"))!=null?n:r)&&(e.hidden=!0,__md_set("__announce",r))}),ls(e).pipe(M(r=>t.next(r)),R(()=>t.complete()),d(r=>N({ref:e},r)))})}function us(e,{target$:t}){return t.pipe(d(r=>({hidden:r!==e})))}function Xo(e,t){let r=new L;return r.subscribe(({hidden:n})=>{e.hidden=n}),us(e,t).pipe(M(n=>r.next(n)),R(()=>r.complete()),d(n=>N({ref:e},n)))}var fi=Je(Qr());function Xr(e){return O("div",{class:"md-tooltip",id:e},O("div",{class:"md-tooltip__inner md-typeset"}))}function Zo(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Xr(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Xr(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function ei(e){return O("button",{class:"md-clipboard md-icon",title:ae("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Zr(e,t){let r=t&2,n=t&1,o=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,s)=>[...c,O("del",null,s)," "],[]).slice(0,-1),i=new URL(e.location);Z("search.highlight")&&i.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[s])=>`${c} ${s}`.trim(),""));let{tags:a}=ce();return O("a",{href:`${i}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),O("h1",{class:"md-search-result__title"},e.title),n>0&&e.text.length>0&&O("p",{class:"md-search-result__teaser"},Uo(e.text,320)),e.tags&&O("div",{class:"md-typeset"},e.tags.map(c=>{let s=c.replace(/<[^>]+>/g,""),f=a?s in a?`md-tag-icon md-tag-icon--${a[s]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${f}`},c)})),n>0&&o.length>0&&O("p",{class:"md-search-result__terms"},ae("search.result.term.missing"),": ",...o)))}function ti(e){let t=e[0].score,r=[...e],n=r.findIndex(f=>!f.location.includes("#")),[o]=r.splice(n===-1?0:n,1),i=r.findIndex(f=>f.scoreZr(f,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},c.length>0&&c.length===1?ae("search.result.more.one"):ae("search.result.more.other",c.length)),...c.map(f=>Zr(f,1)))]:[]];return O("li",{class:"md-search-result__item"},s)}function ri(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ur(r):r)))}function en(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1}))}function ni(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function ps(e){let t=ce(),r=new URL(`${e.version}/`,new URL("../",t.base));return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function oi(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":ae("select.version.title")},t.title),O("ul",{class:"md-version__list"},e.map(ps)))}function ms(e,t){let r=I(()=>G([Oo(e),_t(t)])).pipe(d(([{x:n,y:o},i])=>{let{width:a,height:c}=Se(e);return{x:n-i.x+a/2,y:o-i.y+c/2}}));return nr(e).pipe(_(n=>r.pipe(d(o=>({active:n,offset:o})),ve(+!n||1/0))))}function ii(e,t,{target$:r}){let[n,o]=Array.from(e.children);return I(()=>{let i=new L,a=i.pipe(ue(1));return i.subscribe({next({offset:c}){e.style.setProperty("--md-tooltip-x",`${c.x}px`),e.style.setProperty("--md-tooltip-y",`${c.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),cr(e).pipe(te(a)).subscribe(c=>{e.toggleAttribute("data-md-visible",c)}),P(i.pipe(A(({active:c})=>c)),i.pipe(He(250),A(({active:c})=>!c))).subscribe({next({active:c}){c?e.prepend(n):n.remove()},complete(){e.prepend(n)}}),i.pipe(Re(16,fe)).subscribe(({active:c})=>{n.classList.toggle("md-tooltip--active",c)}),i.pipe(Kr(125,fe),A(()=>!!e.offsetParent),d(()=>e.offsetParent.getBoundingClientRect()),d(({x:c})=>c)).subscribe({next(c){c?e.style.setProperty("--md-tooltip-0",`${-c}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),w(o,"click").pipe(te(a),A(c=>!(c.metaKey||c.ctrlKey))).subscribe(c=>c.preventDefault()),w(o,"mousedown").pipe(te(a),me(i)).subscribe(([c,{active:s}])=>{var f;if(c.button!==0||c.metaKey||c.ctrlKey)c.preventDefault();else if(s){c.preventDefault();let u=e.parentElement.closest(".md-annotation");u instanceof HTMLElement?u.focus():(f=Fe())==null||f.blur()}}),r.pipe(te(a),A(c=>c===n),ke(125)).subscribe(()=>e.focus()),ms(e,t).pipe(M(c=>i.next(c)),R(()=>i.complete()),d(c=>N({ref:e},c)))})}function ds(e){let t=[];for(let r of W(".c, .c1, .cm",e)){let n=[],o=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=o.nextNode();i;i=o.nextNode())n.push(i);for(let i of n){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,c,s]=a;if(typeof s=="undefined"){let f=i.splitText(a.index);i=f.splitText(c.length),t.push(f)}else{i.textContent=c,t.push(i);break}}}}return t}function ai(e,t){t.append(...Array.from(e.childNodes))}function si(e,t,{target$:r,print$:n}){let o=t.closest("[id]"),i=o==null?void 0:o.id,a=new Map;for(let c of ds(t)){let[,s]=c.textContent.match(/\((\d+)\)/);ie(`li:nth-child(${s})`,e)&&(a.set(s,Zo(s,i)),c.replaceWith(a.get(s)))}return a.size===0?k:I(()=>{let c=new L,s=[];for(let[f,u]of a)s.push([B(".md-typeset",u),B(`li:nth-child(${f})`,e)]);return n.pipe(te(c.pipe(ue(1)))).subscribe(f=>{e.hidden=!f;for(let[u,l]of s)f?ai(u,l):ai(l,u)}),P(...[...a].map(([,f])=>ii(f,t,{target$:r}))).pipe(R(()=>c.complete()),pe())})}var hs=0;function li(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return li(t)}}function ci(e){return de(e).pipe(d(({width:t})=>({scrollable:Tt(e).width>t})),J("scrollable"))}function ui(e,t){let{matches:r}=matchMedia("(hover)"),n=I(()=>{let o=new L;if(o.subscribe(({scrollable:a})=>{a&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),fi.default.isSupported()){let a=e.closest("pre");a.id=`__code_${++hs}`,a.insertBefore(ei(a.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let a=li(i);if(typeof a!="undefined"&&(i.classList.contains("annotate")||Z("content.code.annotate"))){let c=si(a,e,t);return ci(e).pipe(M(s=>o.next(s)),R(()=>o.complete()),d(s=>N({ref:e},s)),tt(de(i).pipe(d(({width:s,height:f})=>s&&f),Q(),_(s=>s?c:k))))}}return ci(e).pipe(M(a=>o.next(a)),R(()=>o.complete()),d(a=>N({ref:e},a)))});return Z("content.lazy")?cr(e).pipe(A(o=>o),ve(1),_(()=>n)):n}var pi=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:transparent}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}defs #flowchart-circleEnd,defs #flowchart-circleStart,defs #flowchart-crossEnd,defs #flowchart-crossStart,defs #flowchart-pointEnd,defs #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}.actor,defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{stroke:var(--md-mermaid-node-fg-color)}text.actor>tspan{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-default-fg-color--lighter)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-edge-color)}.loopText>tspan,.messageText,.noteText>tspan{font-family:var(--md-mermaid-font-family)!important}#arrowhead path,.loopText>tspan,.messageText,.noteText>tspan{fill:var(--md-mermaid-edge-color);stroke:none}.loopLine{stroke:var(--md-mermaid-node-fg-color)}.labelBox,.loopLine{fill:var(--md-mermaid-node-bg-color)}.labelBox{stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-node-fg-color);font-family:var(--md-mermaid-font-family)}";var tn,vs=0,gs=ce();function ys(){return typeof mermaid=="undefined"||mermaid instanceof Element?qo(`${gs.base}_static/mermaid/mermaid.min.js`):C(void 0)}function mi(e){return e.classList.remove("mermaid"),tn||(tn=ys().pipe(M(()=>mermaid.initialize({startOnLoad:!1,themeCSS:pi,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),d(()=>{}),X(1))),tn.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${vs++}`,r=O("div",{class:"mermaid"});mermaid.mermaidAPI.render(t,e.textContent,n=>{let o=r.attachShadow({mode:"closed"});o.innerHTML=n,e.replaceWith(r)})}),tn.pipe(d(()=>({ref:e})))}function xs(e,{target$:t,print$:r}){let n=!0;return P(t.pipe(d(o=>o.closest("details:not([open])")),A(o=>e===o),d(()=>({action:"open",reveal:!0}))),r.pipe(A(o=>o||!n),M(()=>n=e.open),d(o=>({action:o?"open":"close"}))))}function di(e,t){return I(()=>{let r=new L;return r.subscribe(({action:n,reveal:o})=>{e.toggleAttribute("open",n==="open"),o&&e.scrollIntoView()}),xs(e,t).pipe(M(n=>r.next(n)),R(()=>r.complete()),d(n=>N({ref:e},n)))})}var hi=O("table");function bi(e){return e.replaceWith(hi),hi.replaceWith(ni(e)),C({ref:e})}function ws(e){let t=W(":scope > input",e),r=t.find(n=>n.checked)||t[0];return P(...t.map(n=>w(n,"change").pipe(d(()=>B(`label[for="${n.id}"]`))))).pipe(q(B(`label[for="${r.id}"]`)),d(n=>({active:n})))}function vi(e,{viewport$:t}){let r=en("prev");e.append(r);let n=en("next");e.append(n);let o=B(".tabbed-labels",e);return I(()=>{let i=new L,a=i.pipe(ue(1));return G([i,de(e)]).pipe(Re(1,fe),te(a)).subscribe({next([{active:c},s]){let f=Be(c),{width:u}=Se(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let l=or(o);(f.xl.x+s.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),G([_t(o),de(o)]).pipe(te(a)).subscribe(([c,s])=>{let f=Tt(o);r.hidden=c.x<16,n.hidden=c.x>f.width-s.width-16}),P(w(r,"click").pipe(d(()=>-1)),w(n,"click").pipe(d(()=>1))).pipe(te(a)).subscribe(c=>{let{width:s}=Se(o);o.scrollBy({left:s*c,behavior:"smooth"})}),Z("content.tabs.link")&&i.pipe(Pe(1),me(t)).subscribe(([{active:c},{offset:s}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-s.y;for(let p of W("[data-tabs]"))for(let m of W(":scope > input",p)){let h=B(`label[for="${m.id}"]`);if(h!==c&&h.innerText.trim()===f){h.setAttribute("data-md-switching",""),m.click();break}}window.scrollTo({top:e.offsetTop-u});let l=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...l])])}}),ws(e).pipe(M(c=>i.next(c)),R(()=>i.complete()),d(c=>N({ref:e},c)))}).pipe(Ze(se))}function gi(e,{viewport$:t,target$:r,print$:n}){return P(...W("pre:not(.mermaid) > code",e).map(o=>ui(o,{target$:r,print$:n})),...W("pre.mermaid",e).map(o=>mi(o)),...W("table:not([class])",e).map(o=>bi(o)),...W("details",e).map(o=>di(o,{target$:r,print$:n})),...W("[data-tabs]",e).map(o=>vi(o,{viewport$:t})))}function Es(e,{alert$:t}){return t.pipe(_(r=>P(C(!0),C(!1).pipe(ke(2e3))).pipe(d(n=>({message:r,active:n})))))}function yi(e,t){let r=B(".md-typeset",e);return I(()=>{let n=new L;return n.subscribe(({message:o,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=o}),Es(e,t).pipe(M(o=>n.next(o)),R(()=>n.complete()),d(o=>N({ref:e},o)))})}function Ss({viewport$:e}){if(!Z("header.autohide"))return C(!1);let t=e.pipe(d(({offset:{y:o}})=>o),Ne(2,1),d(([o,i])=>[oMath.abs(i-o.y)>100),d(([,[o]])=>o),Q()),n=ht("search");return G([e,n]).pipe(d(([{offset:o},i])=>o.y>400&&!i),Q(),_(o=>o?r:C(!1)),q(!1))}function xi(e,t){return I(()=>G([de(e),Ss(t)])).pipe(d(([{height:r},n])=>({height:r,hidden:n})),Q((r,n)=>r.height===n.height&&r.hidden===n.hidden),X(1))}function wi(e,{header$:t,main$:r}){return I(()=>{let n=new L,o=n.pipe(ue(1));return n.pipe(J("active"),St(t)).subscribe(([{active:i},{hidden:a}])=>{e.classList.toggle("md-header--shadow",i&&!a),e.hidden=a}),r.subscribe(n),t.pipe(te(o),d(i=>N({ref:e},i)))})}function Os(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(d(({offset:{y:n}})=>{let{height:o}=Se(e);return{active:n>=o}}),J("active"))}function Ei(e,t){return I(()=>{let r=new L;r.subscribe(({active:o})=>{e.classList.toggle("md-header__title--active",o)});let n=ie("article h1, .objdesc > dt .descname");return typeof n=="undefined"?k:Os(n,t).pipe(M(o=>r.next(o)),R(()=>r.complete()),d(o=>N({ref:e},o)))})}function Si(e,{viewport$:t,header$:r}){let n=r.pipe(d(({height:i})=>i),Q()),o=n.pipe(_(()=>de(e).pipe(d(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),J("bottom"))));return G([n,o,t]).pipe(d(([i,{top:a,bottom:c},{offset:{y:s},size:{height:f}}])=>(f=Math.max(0,f-Math.max(0,a-s,i)-Math.max(0,f+s-c)),{offset:a-i,height:f,active:a-i<=s})),Q((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function _s(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return C(...e).pipe(oe(r=>w(r,"change").pipe(d(()=>r))),q(e[Math.max(0,t.index)]),d(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),X(1))}function Oi(e){return I(()=>{let t=new L;t.subscribe(n=>{document.body.setAttribute("data-md-color-switching","");for(let[o,i]of Object.entries(n.color))document.body.setAttribute(`data-md-color-${o}`,i);for(let o=0;o{document.body.removeAttribute("data-md-color-switching")});let r=W("input",e);return _s(r).pipe(M(n=>t.next(n)),R(()=>t.complete()),d(n=>N({ref:e},n)))})}function Ts(e){let t=a=>a.trim(),{searchParams:r}=Oe(),n;if(r.has("q")){Ye("search",!0);let a=r.get("q");n=C(a)}else n=C();ht("search").pipe(A(a=>!a),ve(1)).subscribe(()=>{let a=new URL(location.href);a.searchParams.delete("q"),history.replaceState({},"",`${a}`)}),n.subscribe(a=>{a&&(e.value=a,e.focus())});let o=nr(e),i=P(w(e,"keyup"),w(e,"focus").pipe(ke(1)),n).pipe(d(()=>t(e.value)),q(""),Q());return G([i,o]).pipe(d(([a,c])=>({value:a,focus:c})),X(1))}function _i(e){let t=new L,r=t.pipe(ue(1));return t.pipe(J("focus")).subscribe(({focus:n})=>{n?(Ye("search",n),e.placeholder=""):e.placeholder=ae("search.placeholder")}),w(e.form,"reset").pipe(te(r)).subscribe(()=>e.focus()),Ts(e).pipe(M(n=>t.next(n)),R(()=>t.complete()),d(n=>N({ref:e},n)),pe())}var on=Je(rn());var As=ce();function nn(e){return`${As.base}${e}`}var dr;function Li(e){return new Promise((t,r)=>{let n=document.createElement("script"),o=nn(e);n.src=o,n.addEventListener("load",()=>t()),n.addEventListener("error",()=>{console.error(`Failed to load search data: ${o}`),r()}),document.body.appendChild(n)})}function Cs(){return dr!==void 0||(dr=Promise.all([Li("_static/language_data.js"),Li("searchindex.js")]).then(()=>{})),dr}var Ue={objNameMatch:11,objPartialMatch:6,objPrio:{0:15,1:5,2:-5},objPrioDefault:0,title:15,partialTitle:7,term:5,partialTerm:2},an;window.Search={setIndex:e=>{an=e}};var Rs=!1;function Hs(e,t){let{docurls:r,objects:n,objnames:o,titles:i}=an,a=[];function c(s,f,u,l,p,m,h){var V;let b=(s?`${s}.`:"")+m,v=b.toLowerCase();if(v.indexOf(e)>-1){let $=0,x=v.split(".");v===e||x[x.length-1]===e?$+=Ue.objNameMatch:x[x.length-1].indexOf(e)>-1&&($+=Ue.objPartialMatch);let Te=o[u][2],Le=i[f];if(t.length>0){let we=`${s} ${m} ${Te} ${Le} ${h!=null?h:""}`.toLowerCase(),Mt=!0;for(let ot=0;ot2){let m=sn(u);if(!o[u])for(let h in o)h.match(m)&&p.push({files:o[h],score:Ue.partialTerm});if(!i[u])for(let h in i)h.match(m)&&p.push({files:i[h],score:Ue.partialTitle})}if(p.every(m=>m.files===void 0))break;p.forEach(m=>{let h=m.files;if(h!==void 0){Array.isArray(h)||(h=[h]),l.push(...h);for(let b=0;bm.length>2).length;if(!(a[u].length!==e.length&&a[u].length!==p)){for(let m=0;mc[f][h]));s.push({docurl:r[f],title:n[f],anchor:"",objectLabel:null,synopsis:null,score:m})}}}return s}function $s(e){let t=new DOMParser().parseFromString(e,"text/html");t.querySelectorAll(".headerlink").forEach(s=>{var f;(f=s.parentNode)==null||f.removeChild(s)});let r=t.querySelector("[role=main]");if(r===null)return console.warn("Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."),[];let n=r.querySelectorAll("h1, h2, h3, h4, h5, h6"),o,i=[],a=t.createRange(),c=(s,f)=>{var m;s!==void 0?a.setStartAfter(s):a.setStartBefore(r),f!==void 0?a.setEndBefore(f):a.setEndAfter(r);let u=a.toString().trim(),l=(m=s==null?void 0:s.textContent)==null?void 0:m.trim();if(!l&&!u)return;let p=s!==void 0?`#${s.id}`:"";i.push({title:l!=null?l:"",anchor:p,text:u})};return n.forEach(s=>{if(!s.id)return;let u=o;o=s,c(u,s)}),c(o,void 0),i}function Is(e,t){let r=$s(e),n=t.map(i=>new RegExp(sn(i),"im")),o=[];for(let i=0;ii.score!==a.score?a.score-i.score:i.sectionIndex-a.sectionIndex),o.length!==0)return o.map(i=>{let c=r[i.sectionIndex],s=Math.max(i.snippetIndex-240/2,0);return{snippet:(s>0?"\u2026":"")+c.text.substr(s,240).trim()+(s+240${(0,on.default)(e.objectLabel)}`,text:r(e.synopsis)}];let a=nn(e.docurl),c;if(window.location.protocol!=="file:")try{let l=yield(yield fetch(a)).text();c=Is(l,t)}catch(u){console.warn("Failed to retrieve search result document: ",u)}c===void 0&&(c=[{score:-1,title:"",anchor:"",snippet:"",terms:i}]);let s=[];c[0].score!==-1&&s.push({location:n,score:e.score,terms:i,title:r(o),text:""});let f;for(let u of c)f===void 0&&(f=u.score),s.push({location:n+u.anchor,score:u.score===f?e.score:0,terms:u.terms,title:r(u.title||o),text:r(u.snippet)});return s})}function Fs(e){return new DOMParser().parseFromString(e,"text/html").body.textContent||""}function Mi(e){return ze(this,null,function*(){yield Cs();let t=new Stemmer,r=[],n=[],o=[],i=[];for(let u of ks(e)){let l=!1;u[0]==="-"&&(l=!0,u=u.substr(1));let p=u.toLowerCase();if(p.length===0)continue;i.push(p);let m=!1;for(let h of p.matchAll(/\w+/g)){let b=h[0];if(stopwords.indexOf(b)!==-1)continue;let v=t.stemWord(b);v.length<3&&b.length>=3&&(v=b);let V;l?V=n:(V=r,m=!0),V.indexOf(v)===-1&&V.push(v)}!l&&m&&o.push(p)}let a=[];for(let u=0;u{let p=u.score,m=l.score;if(p!==m)return m-p;let h=u.title.toLowerCase(),b=l.title.toLowerCase();return h>b?1:h`${u}`,f=u=>(0,on.default)(u).replace(c,s).replace(/<\/mark>(\s+)]*>/gim,"$1");return{count:a.length,get:u=>js(a[u],o,f)}})}function Ai(e,{query$:t}){let r=B(":scope > :first-child",e),n=B(":scope > :last-child",e),o,i,a=e.parentElement,c=16,s=()=>a.scrollTop+a.clientHeight+c>a.scrollHeight,f=()=>{i!==void 0&&s()&&(i(),i=void 0)};a.addEventListener("scroll",f,{passive:!0}),window.addEventListener("resize",f,{passive:!0});let u=l=>ze(this,null,function*(){o=l;let p=4,m=p;for(let h=0;h{i=()=>v(void 0)})),m+=p),o!==l)return;let b=yield l.get(h);if(o!==l)return;n.appendChild(ti(b))}});return t.pipe(J("value"),Fr(()=>$r(250)),mt(l=>ze(this,null,function*(){if(!!l.value)return Mi(l.value)})),Ce(fe)).subscribe(l=>{if(n.innerHTML="",l){switch(l.count){case 0:r.textContent=ae("search.result.none");break;case 1:r.textContent=ae("search.result.one");break;default:r.textContent=ae("search.result.other",ur(l.count))}u(l)}else r.textContent=ae("search.result.placeholder")}),C()}function Us(e,{query$:t}){return t.pipe(d(({value:r})=>{let n=Oe();return n.hash="",n.searchParams.delete("h"),n.searchParams.set("q",r),{url:n}}))}function Ci(e,t){let r=new L;return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),w(e,"click").subscribe(n=>n.preventDefault()),Us(e,t).pipe(M(n=>r.next(n)),R(()=>r.complete()),d(n=>N({ref:e},n)))}function Ri(e,{keyboard$:t}){let r=_e("search-query");return t.pipe(A(({mode:n})=>n==="search")).subscribe(n=>{switch(n.type){case"ArrowRight":e.innerText.length&&r.selectionStart===r.value.length&&(r.value=e.innerText);break}}),C()}function Hi(e,{keyboard$:t}){try{let r=_e("search-query",e),n=_e("search-result",e);t.pipe(A(({mode:a})=>a==="search")).subscribe(a=>{let c=Fe();switch(a.type){case"Enter":if(c===r){let s=new Map;for(let f of W(":first-child [href]",n)){let u=f.firstElementChild;s.set(f,parseFloat(u.getAttribute("data-md-score")))}if(s.size){let[[f]]=[...s].sort(([,u],[,l])=>l-u);f.click()}a.claim()}break;case"Escape":case"Tab":Ye("search",!1),r.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")r.focus();else{let s=[r,...W(":not(details) > [href], summary, details[open] [href]",n)],f=Math.max(0,(Math.max(0,s.indexOf(c))+s.length+(a.type==="ArrowUp"?-1:1))%s.length);s[f].focus()}a.claim();break;default:r!==Fe()&&r.focus()}}),t.pipe(A(({mode:a})=>a==="global")).subscribe(a=>{switch(a.type){case"f":case"s":case"/":r.focus(),r.select(),a.claim();break}});let o=_i(r),i=Ai(n,{query$:o});return P(o,i).pipe(tt(...ee("search-share",e).map(a=>Ci(a,{query$:o})),...ee("search-suggest",e).map(a=>Ri(a,{keyboard$:t}))))}catch(r){return e.hidden=!0,je}}var cn=Je(Qr());function Vs(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function ki({alert$:e}){cn.default.isSupported()&&new U(t=>{new cn.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Vs(B(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(M(t=>{t.trigger.focus()}),d(()=>ae("clipboard.copied"))).subscribe(e)}function Ns(e){if(e.length<2)return[""];let[t,r]=[...e].sort((o,i)=>o.length-i.length).map(o=>o.replace(/[^/]+$/,"")),n=0;if(t===r)n=t.length;else for(;t.charCodeAt(n)===r.charCodeAt(n);)n++;return e.map(o=>o.replace(t.slice(0,n),""))}function hr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return C(t);{let r=ce();return zo(new URL("sitemap.xml",e||r.base)).pipe(d(n=>Ns(W("loc",n).map(o=>o.textContent))),le(()=>k),De([]),M(n=>__md_set("__sitemap",n,sessionStorage,e)))}}function Pi({document$:e,location$:t,viewport$:r}){let n=ce();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",w(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let o=ie("link[rel=icon]");typeof o!="undefined"&&(o.href=o.href);let i=hr().pipe(d(l=>l.map(p=>`${new URL(p,n.base)}`)),_(l=>w(document.body,"click").pipe(A(p=>!p.metaKey&&!p.ctrlKey),_(p=>{if(p.target instanceof Element){let m=p.target.closest("a");if(m&&!m.target){let h=new URL(m.href);if(h.search="",h.hash="",h.pathname!==location.pathname&&l.includes(h.toString()))return p.preventDefault(),C({url:new URL(m.href)})}}return je}))),pe()),a=w(window,"popstate").pipe(A(l=>l.state!==null),d(l=>({url:new URL(location.href),offset:l.state})),pe());P(i,a).pipe(Q((l,p)=>l.url.href===p.url.href),d(({url:l})=>l)).subscribe(t);let c=t.pipe(J("pathname"),_(l=>pr(l.href).pipe(le(()=>(lr(l),je)))),pe());i.pipe(rr(c)).subscribe(({url:l})=>{history.pushState({},"",`${l}`)});let s=new DOMParser;c.pipe(_(l=>l.text()),d(l=>s.parseFromString(l,"text/html"))).subscribe(e);let f=new Set,u=new Set;for(let l of W("script",document))l.src?f.add(new URL(l.src,document.baseURI).toString()):u.add(l.outerHTML);e.pipe(Pe(1),mt(l=>ze(this,null,function*(){var p;for(let m of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...Z("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let h=ie(m),b=ie(m,l);typeof h!="undefined"&&typeof b!="undefined"&&h.replaceWith(b)}((p=window.MathJax)==null?void 0:p.typesetPromise)!==void 0&&(yield window.MathJax.typesetPromise());for(let m of W("script",l))if(m.src){let h=new URL(m.src,document.baseURI).toString();if(!f.has(h)){let b=document.createElement("script");for(let V of m.getAttributeNames())b.setAttribute(V,m.getAttribute(V));let v;b.src=h,b.async||(v=new Promise(V=>b.addEventListener("load",()=>V()))),document.body.appendChild(b),f.add(h),v!==void 0&&(yield v)}}else{let h=m.outerHTML;if(!u.has(h)){let b=document.createElement("script");for(let v of m.getAttributeNames())b.setAttribute(v,m.getAttribute(v));b.textContent=m.textContent,document.body.appendChild(b),u.add(h)}}}))).subscribe(),e.pipe(Pe(1),d(()=>_e("container")),_(l=>W("script",l)),mt(l=>{let p=O("script");if(l.src){for(let m of l.getAttributeNames())p.setAttribute(m,l.getAttribute(m));return l.replaceWith(p),new U(m=>{p.onload=()=>m.complete()})}else return p.textContent=l.textContent,l.replaceWith(p),k})).subscribe(),P(i,a).pipe(rr(e)).subscribe(({url:l,offset:p})=>{l.hash&&!p?No(l.hash):window.scrollTo(0,(p==null?void 0:p.y)||0)}),r.pipe(Wr(i),He(250),J("offset")).subscribe(({offset:l})=>{history.replaceState(l,"")}),P(i,a).pipe(Ne(2,1),A(([l,p])=>l.url.pathname===p.url.pathname),d(([,l])=>l)).subscribe(({offset:l})=>{window.scrollTo(0,(l==null?void 0:l.y)||0)})}var $i=Je(rn());function Ii(e,t){let r=new RegExp(e.separator,"img"),n=(o,i,a)=>`${i}${a}`;return o=>{o=o.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator})(${o.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(t?(0,$i.default)(a):a).replace(i,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function ji({document$:e}){var a;let t=ce(),r=t.version.staticVersions?C(t.version.staticVersions):Ge(new URL((a=t.version.versionPath)!=null?a:"../versions.json",t.base)),n=new URL("..",t.base),o=c=>new URL(c,n).toString().replace(/\/*$/,""),i=r.pipe(d(c=>{let s=t.base.toString().replace(/\/*$/,"");return c.find(({version:f,aliases:u})=>o(f)===s||u.find(l=>o(l)===s))||c[0]}));r.pipe(d(c=>new Map(c.map(s=>[`${new URL(`../${s.version}/`,t.base)}`,s]))),_(c=>w(document.body,"click").pipe(A(s=>!s.metaKey&&!s.ctrlKey),me(i),_(([s,f])=>{if(s.target instanceof Element){let u=s.target.closest("a");if(u&&!u.target&&c.has(u.href)){let l=u.href;return!s.target.closest(".md-version")&&c.get(l)===f?k:(s.preventDefault(),C(l))}}return k}),_(s=>{let{version:f}=c.get(s);return hr(new URL(s)).pipe(d(u=>{let p=Oe().href.replace(t.base,"");return u.includes(p.split("#")[0])?new URL(`../${f}/${p}`,t.base):new URL(s)}))})))).subscribe(c=>lr(c)),G([r,i]).subscribe(([c,s])=>{B(".md-header__topic").appendChild(oi(c,s))}),e.pipe(_(()=>i)).subscribe(c=>{var f;let s=__md_get("__outdated",sessionStorage);if(s===null){let u=((f=t.version)==null?void 0:f.default)||"latest";s=!c.aliases.includes(u),__md_set("__outdated",s,sessionStorage)}if(s)for(let u of ee("outdated"))u.hidden=!1})}function Fi(e,{location$:t}){let r={lang:[],separator:"\\s+"};return G([t.pipe(q(Oe()),A(n=>!!n.searchParams.get("h")))]).pipe(d(([n])=>Ii(r,!0)(n.searchParams.get("h"))),d(n=>{var a;let o=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let c=i.nextNode();c;c=i.nextNode())if((a=c.parentElement)!=null&&a.offsetHeight){let s=c.textContent,f=n(s);f.length>s.length&&o.set(c,f)}for(let[c,s]of o){let{childNodes:f}=O("span",null,s);c.replaceWith(...Array.from(f))}return{ref:e,nodes:o}}))}function Ds(e,{viewport$:t,main$:r}){let n=e.parentElement,o=n.offsetTop-n.parentElement.offsetTop;return G([r,t]).pipe(d(([{offset:i,height:a},{offset:{y:c}}])=>(a=a+Math.min(o,Math.max(0,c-i))-o,{height:a,locked:c>=i+o})),Q((i,a)=>i.height===a.height&&i.locked===a.locked))}function fn(e,n){var o=n,{header$:t}=o,r=hn(o,["header$"]);let i=B(".md-sidebar__scrollwrap",e),{y:a}=Be(i);return I(()=>{let c=new L;return c.pipe(Re(0,fe),me(t)).subscribe({next([{height:s},{height:f}]){i.style.height=`${s-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ce(fe),ve(1)).subscribe(()=>{for(let s of W(".md-nav__link--active[href]",e)){let f=ko(s);if(typeof f!="undefined"){let u=s.offsetTop-f.offsetTop,{height:l}=Se(f);f.scrollTo({top:u-l/2})}}}),Ds(e,r).pipe(M(s=>c.next(s)),R(()=>c.complete()),d(s=>N({ref:e},s)))})}function Ui(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ir(Ge(`${r}/releases/latest`).pipe(le(()=>k),d(n=>({version:n.tag_name})),De({})),Ge(r).pipe(le(()=>k),d(n=>({stars:n.stargazers_count,forks:n.forks_count})),De({}))).pipe(d(([n,o])=>N(N({},n),o)))}else{let r=`https://api.github.com/users/${e}`;return Ge(r).pipe(d(n=>({repositories:n.public_repos})),De({}))}}function Vi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ge(r).pipe(le(()=>k),d(({star_count:n,forks_count:o})=>({stars:n,forks:o})),De({}))}function Ni(e){let[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":let[,r,n]=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);return Ui(r,n);case"gitlab":let[,o,i]=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i);return Vi(o,i);default:return k}}var Ws;function zs(e){return Ws||(Ws=I(()=>{let t=__md_get("__source",sessionStorage);if(t)return C(t);if(ee("consent").length){let n=__md_get("__consent");if(!(n&&n.github))return k}return Ni(e.href).pipe(M(n=>__md_set("__source",n,sessionStorage)))}).pipe(le(()=>k),A(t=>Object.keys(t).length>0),d(t=>({facts:t})),X(1)))}function Di(e){let t=B(":scope > :last-child",e);return I(()=>{let r=new L;return r.subscribe(({facts:n})=>{t.appendChild(ri(n)),t.classList.add("md-source__repository--active")}),zs(e).pipe(M(n=>r.next(n)),R(()=>r.complete()),d(n=>N({ref:e},n)))})}function qs(e,{viewport$:t,header$:r}){return de(document.body).pipe(_(()=>mr(e,{header$:r,viewport$:t})),d(({offset:{y:n}})=>({hidden:n>=10})),J("hidden"))}function Wi(e,t){return I(()=>{let r=new L;return r.subscribe({next({hidden:n}){e.hidden=n},complete(){e.hidden=!1}}),(Z("navigation.tabs.sticky")?C({hidden:!1}):qs(e,t)).pipe(M(n=>r.next(n)),R(()=>r.complete()),d(n=>N({ref:e},n)))})}function Ks(e,{viewport$:t,header$:r,excludedLinks:n}){let o=new Map,i=W("a[href]",e);for(let s of i){if(n!=null&&n.has(s))continue;let f=s.getAttribute("href"),u;if(f.startsWith("#")){let l=decodeURIComponent(s.hash.substring(1));u=ie(`[id="${l}"]`)}else u=ie(`a.pseudo-toc-entry[href=${CSS.escape(f)}]`);if(typeof u!="undefined"){let l=s.closest(".md-nav__link");l!==null&&o.set(l,u)}}let a=r.pipe(J("height"),d(({height:s})=>{let f=_e("main"),u=B(":scope > :first-child",f);return s+.8*(u.offsetTop-f.offsetTop)}),pe());return de(document.body).pipe(J("height"),_(s=>I(()=>{let f=[];return C([...o].reduce((u,[l,p])=>{for(;f.length&&o.get(f[f.length-1]).tagName>=p.tagName;)f.pop();let m=p.offsetTop;for(;!m&&p.parentElement;)p=p.parentElement,m=p.offsetTop;return u.set([...f=[...f,l]].reverse(),m)},new Map))}).pipe(d(f=>new Map([...f].sort(([,u],[,l])=>u-l))),St(a),_(([f,u])=>t.pipe(Nr(([l,p],{offset:{y:m},size:h})=>{let b=m+h.height>=Math.floor(s.height);for(;p.length;){let[,v]=p[0];if(v-u=m&&!b)p=[l.pop(),...p];else break}return[l,p]},[[],[...f]]),Q((l,p)=>l[0]===p[0]&&l[1]===p[1])))))).pipe(d(([s,f])=>({prev:s.map(([u])=>u),next:f.map(([u])=>u)})),q({prev:[],next:[]}),Ne(2,1),d(([s,f])=>s.prev.length{let i=new L,a=o?"md-nav__link--active":"md-nav__link--in-viewport";if(i.subscribe(({prev:s,next:f})=>{for(let[u]of f)u.classList.remove("md-nav__link--passed"),u.classList.remove(a);for(let[u,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle(a,u===s.length-1)}),Z("toc.follow")&&(o||!Z("toc.integrate"))){let s=!o||Z("toc.integrate");i.pipe(He(1)).subscribe(({prev:f})=>{var m;let u;if(f.length===0&&s&&(u=(m=e.querySelector("a[href='#']"))!=null?m:e),s=!1,f.length!==0&&(u=f[f.length-1][0]),u===void 0||!u.offsetHeight)return;let l=u.parentElement,p=5;for(;l!==null&&l.scrollHeight-p<=l.clientHeight;)l=l.parentElement;if(l!==null&&l!==document.body&&l!==document.documentElement){let h=u.getBoundingClientRect(),b=l.getBoundingClientRect();l.scrollTo({top:l.scrollTop+(h.y-b.height/2-b.y)})}})}o&&Z("navigation.tracking")&&t.pipe(te(i.pipe(ue(1))),J("offset"),He(250),Pe(1),te(n.pipe(Pe(1))),Ot({delay:250}),me(i)).subscribe(([,{prev:s}])=>{let f=Oe(),u=s[s.length-1];if(u&&u.length){let[l]=u,{hash:p}=new URL(l.href);f.hash!==p&&(f.hash=p,history.replaceState({},"",`${f}`))}else f.hash="",history.replaceState({},"",`${f}`)}),Z("toc.sticky")&&de(document.body).pipe(J("width"),He(0)).subscribe(()=>{let s=new Map,f="--md-nav__header-height";for(let u of W(".md-nav__link",e)){let l=u.nextElementSibling;if(!(l instanceof HTMLElement)||l.tagName!=="NAV")continue;let p="",m=NaN,h=l.parentElement.closest("nav");if(h!==null){let b=s.get(h);b!==void 0&&(p=`${b.height} + `,m=b.zindex-1)}isNaN(m)&&(m=100),p+=`${u.offsetHeight}px + 0.625em`,u.classList.add("md-nav__sticky"),u.style.setProperty("--md-nav__sticky-zindex",m.toString()),l.style.setProperty(f,`calc(${p})`),s.set(l,{height:p,zindex:m})}});let c=o?void 0:new Set(W("[data-md-component='toc'] a[href]",e));return Ks(e,{viewport$:t,header$:r,excludedLinks:c}).pipe(M(s=>i.next(s)),R(()=>i.complete()),d(s=>N({ref:e},s)))})}function Bs(e,{viewport$:t,main$:r,target$:n}){let o=t.pipe(d(({offset:{y:a}})=>a),Ne(2,1),d(([a,c])=>a>c&&c>0),Q()),i=r.pipe(d(({active:a})=>a));return G([i,o]).pipe(d(([a,c])=>!(a&&c)),Q(),te(n.pipe(Pe(1))),Vr(!0),Ot({delay:250}),d(a=>({hidden:a})))}function zi(e,{viewport$:t,header$:r,main$:n,target$:o}){let i=new L,a=i.pipe(ue(1));return i.subscribe({next({hidden:c}){e.hidden=c,c?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(te(a),J("height")).subscribe(({height:c})=>{e.style.top=`${c+16}px`}),Bs(e,{viewport$:t,main$:n,target$:o}).pipe(M(c=>i.next(c)),R(()=>i.complete()),d(c=>N({ref:e},c)))}function qi({document$:e,tablet$:t}){e.pipe(_(()=>W(".md-toggle--indeterminate, [data-md-state=indeterminate]")),M(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>w(r,"change").pipe(zr(()=>r.classList.contains("md-toggle--indeterminate")),d(()=>r))),me(t)).subscribe(([r,n])=>{r.classList.remove("md-toggle--indeterminate"),n&&(r.checked=!1)})}function Ys(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ki({document$:e}){e.pipe(_(()=>W("[data-md-scrollfix]")),M(t=>t.removeAttribute("data-md-scrollfix")),A(Ys),oe(t=>w(t,"touchstart").pipe(d(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Bi({viewport$:e,tablet$:t}){G([ht("search"),t]).pipe(d(([r,n])=>r&&!n),_(r=>C(r).pipe(ke(r?400:100))),me(e)).subscribe(([r,{offset:{y:n}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${n}px`;else{let o=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",o&&window.scrollTo(0,o)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let n=e[r];typeof n!="object"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?t.insertBefore(this.previousSibling,n):t.replaceChild(n,this)}}}));document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var nt=So(),vr=jo(),rt=Do(),un=Io(),ge=Jo(),gr=Yr("(min-width: 960px)"),Gi=Yr("(min-width: 1220px)"),Ji=Wo(),Gs=ce(),pn=new L;ki({alert$:pn});Z("navigation.instant")&&Pi({document$:nt,location$:vr,viewport$:ge});var Yi;((Yi=Gs.version)==null?void 0:Yi.provider)==="mike"&&ji({document$:nt});P(vr,rt).pipe(ke(125)).subscribe(()=>{Ye("drawer",!1),Ye("search",!1)});un.pipe(A(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ie("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=ie("[href][rel=next]");typeof r!="undefined"&&r.click();break}});qi({document$:nt,tablet$:gr});Ki({document$:nt});Bi({viewport$:ge,tablet$:gr});var We=xi(_e("header"),{viewport$:ge}),br=nt.pipe(d(()=>_e("main")),_(e=>Si(e,{viewport$:ge,header$:We})),X(1)),Js=P(...ee("consent").map(e=>Xo(e,{target$:rt})),...ee("dialog").map(e=>yi(e,{alert$:pn})),...ee("header").map(e=>wi(e,{viewport$:ge,header$:We,main$:br})),...ee("palette").map(e=>Oi(e)),...ee("search").map(e=>Hi(e,{keyboard$:un})),...ee("source").map(e=>Di(e))),Qs=I(()=>P(...ee("announce").map(e=>Qo(e)),...ee("content").map(e=>gi(e,{viewport$:ge,target$:rt,print$:Ji})),...ee("content").map(e=>Z("search.highlight")?Fi(e,{location$:vr}):k),...ee("header-title").map(e=>Ei(e,{viewport$:ge,header$:We})),...ee("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Gr(Gi,()=>fn(e,{viewport$:ge,header$:We,main$:br})):Gr(gr,()=>fn(e,{viewport$:ge,header$:We,main$:br}))),...ee("tabs").map(e=>Wi(e,{viewport$:ge,header$:We})),...ee("toc").map(e=>ln(e,{viewport$:ge,header$:We,target$:rt,localToc:!0})),...ee("sidebar").filter(e=>e.getAttribute("data-md-type")==="navigation").map(e=>ln(e,{viewport$:ge,header$:We,target$:rt,localToc:!1})),...ee("top").map(e=>zi(e,{viewport$:ge,header$:We,main$:br,target$:rt})))),Qi=nt.pipe(_(()=>Qs),tt(Js),X(1));Qi.subscribe();window.document$=nt;window.location$=vr;window.target$=rt;window.keyboard$=un;window.viewport$=ge;window.tablet$=gr;window.screen$=Gi;window.print$=Ji;window.alert$=pn;window.component$=Qi;})(); diff --git a/html/_static/style.css b/html/_static/style.css new file mode 100644 index 00000000..6610cf47 --- /dev/null +++ b/html/_static/style.css @@ -0,0 +1,3 @@ +.mermaid text { + font-size: 90%; +} diff --git a/html/_static/summary.jpeg b/html/_static/summary.jpeg new file mode 100644 index 00000000..e4ae3800 Binary files /dev/null and b/html/_static/summary.jpeg differ diff --git a/html/_static/tabs.css b/html/_static/tabs.css new file mode 100644 index 00000000..957ba60d --- /dev/null +++ b/html/_static/tabs.css @@ -0,0 +1,89 @@ +.sphinx-tabs { + margin-bottom: 1rem; +} + +[role="tablist"] { + border-bottom: 1px solid #a0b3bf; +} + +.sphinx-tabs-tab { + position: relative; + font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; + color: #1D5C87; + line-height: 24px; + margin: 0; + font-size: 16px; + font-weight: 400; + background-color: rgba(255, 255, 255, 0); + border-radius: 5px 5px 0 0; + border: 0; + padding: 1rem 1.5rem; + margin-bottom: 0; +} + +.sphinx-tabs-tab[aria-selected="true"] { + font-weight: 700; + border: 1px solid #a0b3bf; + border-bottom: 1px solid white; + margin: -1px; + background-color: white; +} + +.sphinx-tabs-tab:focus { + z-index: 1; + outline-offset: 1px; +} + +.sphinx-tabs-panel { + position: relative; + padding: 1rem; + border: 1px solid #a0b3bf; + margin: 0px -1px -1px -1px; + border-radius: 0 0 5px 5px; + border-top: 0; + background: white; +} + +.sphinx-tabs-panel.code-tab { + padding: 0.4rem; +} + +.sphinx-tab img { + margin-bottom: 24 px; +} + +/* Dark theme preference styling */ + +@media (prefers-color-scheme: dark) { + body[data-theme="auto"] .sphinx-tabs-panel { + color: white; + background-color: rgb(50, 50, 50); + } + + body[data-theme="auto"] .sphinx-tabs-tab { + color: white; + background-color: rgba(255, 255, 255, 0.05); + } + + body[data-theme="auto"] .sphinx-tabs-tab[aria-selected="true"] { + border-bottom: 1px solid rgb(50, 50, 50); + background-color: rgb(50, 50, 50); + } +} + +/* Explicit dark theme styling */ + +body[data-theme="dark"] .sphinx-tabs-panel { + color: white; + background-color: rgb(50, 50, 50); +} + +body[data-theme="dark"] .sphinx-tabs-tab { + color: white; + background-color: rgba(255, 255, 255, 0.05); +} + +body[data-theme="dark"] .sphinx-tabs-tab[aria-selected="true"] { + border-bottom: 2px solid rgb(50, 50, 50); + background-color: rgb(50, 50, 50); +} diff --git a/html/_static/tabs.js b/html/_static/tabs.js new file mode 100644 index 00000000..48dc303c --- /dev/null +++ b/html/_static/tabs.js @@ -0,0 +1,145 @@ +try { + var session = window.sessionStorage || {}; +} catch (e) { + var session = {}; +} + +window.addEventListener("DOMContentLoaded", () => { + const allTabs = document.querySelectorAll('.sphinx-tabs-tab'); + const tabLists = document.querySelectorAll('[role="tablist"]'); + + allTabs.forEach(tab => { + tab.addEventListener("click", changeTabs); + }); + + tabLists.forEach(tabList => { + tabList.addEventListener("keydown", keyTabs); + }); + + // Restore group tab selection from session + const lastSelected = session.getItem('sphinx-tabs-last-selected'); + if (lastSelected != null) selectNamedTabs(lastSelected); +}); + +/** + * Key focus left and right between sibling elements using arrows + * @param {Node} e the element in focus when key was pressed + */ +function keyTabs(e) { + const tab = e.target; + let nextTab = null; + if (e.keyCode === 39 || e.keyCode === 37) { + tab.setAttribute("tabindex", -1); + // Move right + if (e.keyCode === 39) { + nextTab = tab.nextElementSibling; + if (nextTab === null) { + nextTab = tab.parentNode.firstElementChild; + } + // Move left + } else if (e.keyCode === 37) { + nextTab = tab.previousElementSibling; + if (nextTab === null) { + nextTab = tab.parentNode.lastElementChild; + } + } + } + + if (nextTab !== null) { + nextTab.setAttribute("tabindex", 0); + nextTab.focus(); + } +} + +/** + * Select or deselect clicked tab. If a group tab + * is selected, also select tab in other tabLists. + * @param {Node} e the element that was clicked + */ +function changeTabs(e) { + // Use this instead of the element that was clicked, in case it's a child + const notSelected = this.getAttribute("aria-selected") === "false"; + const positionBefore = this.parentNode.getBoundingClientRect().top; + const notClosable = !this.parentNode.classList.contains("closeable"); + + deselectTabList(this); + + if (notSelected || notClosable) { + selectTab(this); + const name = this.getAttribute("name"); + selectNamedTabs(name, this.id); + + if (this.classList.contains("group-tab")) { + // Persist during session + session.setItem('sphinx-tabs-last-selected', name); + } + } + + const positionAfter = this.parentNode.getBoundingClientRect().top; + const positionDelta = positionAfter - positionBefore; + // Scroll to offset content resizing + window.scrollTo(0, window.scrollY + positionDelta); +} + +/** + * Select tab and show associated panel. + * @param {Node} tab tab to select + */ +function selectTab(tab) { + tab.setAttribute("aria-selected", true); + + // Show the associated panel + document + .getElementById(tab.getAttribute("aria-controls")) + .removeAttribute("hidden"); +} + +/** + * Hide the panels associated with all tabs within the + * tablist containing this tab. + * @param {Node} tab a tab within the tablist to deselect + */ +function deselectTabList(tab) { + const parent = tab.parentNode; + const grandparent = parent.parentNode; + + Array.from(parent.children) + .forEach(t => t.setAttribute("aria-selected", false)); + + Array.from(grandparent.children) + .slice(1) // Skip tablist + .forEach(panel => panel.setAttribute("hidden", true)); +} + +/** + * Select grouped tabs with the same name, but no the tab + * with the given id. + * @param {Node} name name of grouped tab to be selected + * @param {Node} clickedId id of clicked tab + */ +function selectNamedTabs(name, clickedId=null) { + const groupedTabs = document.querySelectorAll(`.sphinx-tabs-tab[name="${name}"]`); + const tabLists = Array.from(groupedTabs).map(tab => tab.parentNode); + + tabLists + .forEach(tabList => { + // Don't want to change the tabList containing the clicked tab + const clickedTab = tabList.querySelector(`[id="${clickedId}"]`); + if (clickedTab === null ) { + // Select first tab with matching name + const tab = tabList.querySelector(`.sphinx-tabs-tab[name="${name}"]`); + deselectTabList(tab); + selectTab(tab); + } + }) +} + +if (typeof exports === 'undefined') { + exports = {}; +} + +exports.keyTabs = keyTabs; +exports.changeTabs = changeTabs; +exports.selectTab = selectTab; +exports.deselectTabList = deselectTabList; +exports.selectNamedTabs = selectNamedTabs; diff --git a/html/_static/togglebutton.css b/html/_static/togglebutton.css new file mode 100644 index 00000000..54a67879 --- /dev/null +++ b/html/_static/togglebutton.css @@ -0,0 +1,160 @@ +/** + * Admonition-based toggles + */ + +/* Visibility of the target */ +.admonition.toggle .admonition-title ~ * { + transition: opacity .3s, height .3s; +} + +/* Toggle buttons inside admonitions so we see the title */ +.admonition.toggle { + position: relative; +} + +/* Titles should cut off earlier to avoid overlapping w/ button */ +.admonition.toggle .admonition-title { + padding-right: 25%; + cursor: pointer; +} + +/* Hovering will cause a slight shift in color to make it feel interactive */ +.admonition.toggle .admonition-title:hover { + box-shadow: inset 0 0 0px 20px rgb(0 0 0 / 1%); +} + +/* Hovering will cause a slight shift in color to make it feel interactive */ +.admonition.toggle .admonition-title:active { + box-shadow: inset 0 0 0px 20px rgb(0 0 0 / 3%); +} + +/* Remove extra whitespace below the admonition title when hidden */ +.admonition.toggle-hidden { + padding-bottom: 0; +} + +.admonition.toggle-hidden .admonition-title { + margin-bottom: 0; +} + +/* hides all the content of a page until de-toggled */ +.admonition.toggle-hidden .admonition-title ~ * { + height: 0; + margin: 0; + opacity: 0; + visibility: hidden; +} + +/* General button style and position*/ +button.toggle-button { + /** + * Background and shape. By default there's no background + * but users can style as they wish + */ + background: none; + border: none; + outline: none; + + /* Positioning just inside the admonition title */ + position: absolute; + right: 0.5em; + padding: 0px; + border: none; + outline: none; +} + +/* Display the toggle hint on wide screens */ +@media (min-width: 768px) { + button.toggle-button.toggle-button-hidden:before { + content: attr(data-toggle-hint); /* This will be filled in by JS */ + font-size: .8em; + align-self: center; + } +} + +/* Icon behavior */ +.tb-icon { + transition: transform .2s ease-out; + height: 1.5em; + width: 1.5em; + stroke: currentColor; /* So that we inherit the color of other text */ +} + +/* The icon should point right when closed, down when open. */ +/* Open */ +.admonition.toggle button .tb-icon { + transform: rotate(90deg); +} + +/* Closed */ +.admonition.toggle button.toggle-button-hidden .tb-icon { + transform: rotate(0deg); +} + +/* With details toggles, we don't rotate the icon so it points right */ +details.toggle-details .tb-icon { + height: 1.4em; + width: 1.4em; + margin-top: 0.1em; /* To center the button vertically */ +} + + +/** + * Details-based toggles. + * In this case, we wrap elements with `.toggle` in a details block. + */ + +/* Details blocks */ +details.toggle-details { + margin: 1em 0; +} + + +details.toggle-details summary { + display: flex; + align-items: center; + cursor: pointer; + list-style: none; + border-radius: .2em; + border-left: 3px solid #1976d2; + background-color: rgb(204 204 204 / 10%); + padding: 0.2em 0.7em 0.3em 0.5em; /* Less padding on left because the SVG has left margin */ + font-size: 0.9em; +} + +details.toggle-details summary:hover { + background-color: rgb(204 204 204 / 20%); +} + +details.toggle-details summary:active { + background: rgb(204 204 204 / 28%); +} + +.toggle-details__summary-text { + margin-left: 0.2em; +} + +details.toggle-details[open] summary { + margin-bottom: .5em; +} + +details.toggle-details[open] summary .tb-icon { + transform: rotate(90deg); +} + +details.toggle-details[open] summary ~ * { + animation: toggle-fade-in .3s ease-out; +} + +@keyframes toggle-fade-in { + from {opacity: 0%;} + to {opacity: 100%;} +} + +/* Print rules - we hide all toggle button elements at print */ +@media print { + /* Always hide the summary so the button doesn't show up */ + details.toggle-details summary { + display: none; + } +} \ No newline at end of file diff --git a/html/_static/togglebutton.js b/html/_static/togglebutton.js new file mode 100644 index 00000000..215a7eef --- /dev/null +++ b/html/_static/togglebutton.js @@ -0,0 +1,187 @@ +/** + * Add Toggle Buttons to elements + */ + +let toggleChevron = ` + + + +`; + +var initToggleItems = () => { + var itemsToToggle = document.querySelectorAll(togglebuttonSelector); + console.log(`[togglebutton]: Adding toggle buttons to ${itemsToToggle.length} items`) + // Add the button to each admonition and hook up a callback to toggle visibility + itemsToToggle.forEach((item, index) => { + if (item.classList.contains("admonition")) { + // If it's an admonition block, then we'll add a button inside + // Generate unique IDs for this item + var toggleID = `toggle-${index}`; + var buttonID = `button-${toggleID}`; + + item.setAttribute('id', toggleID); + if (!item.classList.contains("toggle")){ + item.classList.add("toggle"); + } + // This is the button that will be added to each item to trigger the toggle + var collapseButton = ` + `; + + title = item.querySelector(".admonition-title") + title.insertAdjacentHTML("beforeend", collapseButton); + thisButton = document.getElementById(buttonID); + + // Add click handlers for the button + admonition title (if admonition) + admonitionTitle = document.querySelector(`#${toggleID} > .admonition-title`) + if (admonitionTitle) { + // If an admonition, then make the whole title block clickable + admonitionTitle.addEventListener('click', toggleClickHandler); + admonitionTitle.dataset.target = toggleID + admonitionTitle.dataset.button = buttonID + } else { + // If not an admonition then we'll listen for the button click + thisButton.addEventListener('click', toggleClickHandler); + } + + // Now hide the item for this toggle button unless explicitly noted to show + if (!item.classList.contains("toggle-shown")) { + toggleHidden(thisButton); + } + } else { + // If not an admonition, wrap the block in a
block + // Define the structure of the details block and insert it as a sibling + var detailsBlock = ` +
+ + ${toggleChevron} + ${toggleHintShow} + +
`; + item.insertAdjacentHTML("beforebegin", detailsBlock); + + // Now move the toggle-able content inside of the details block + details = item.previousElementSibling + details.appendChild(item) + item.classList.add("toggle-details__container") + + // Set up a click trigger to change the text as needed + details.addEventListener('click', (click) => { + let parent = click.target.parentElement; + if (parent.tagName.toLowerCase() == "details") { + summary = parent.querySelector("summary"); + details = parent; + } else { + summary = parent; + details = parent.parentElement; + } + // Update the inner text for the proper hint + if (details.open) { + summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintShow; + } else { + summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintHide; + } + + }); + + // If we have a toggle-shown class, open details block should be open + if (item.classList.contains("toggle-shown")) { + details.click(); + } + } + }) +}; + +// This should simply add / remove the collapsed class and change the button text +var toggleHidden = (button) => { + target = button.dataset['target'] + var itemToToggle = document.getElementById(target); + if (itemToToggle.classList.contains("toggle-hidden")) { + itemToToggle.classList.remove("toggle-hidden"); + button.classList.remove("toggle-button-hidden"); + } else { + itemToToggle.classList.add("toggle-hidden"); + button.classList.add("toggle-button-hidden"); + } +} + +var toggleClickHandler = (click) => { + // Be cause the admonition title is clickable and extends to the whole admonition + // We only look for a click event on this title to trigger the toggle. + + if (click.target.classList.contains("admonition-title")) { + button = click.target.querySelector(".toggle-button"); + } else if (click.target.classList.contains("tb-icon")) { + // We've clicked the icon and need to search up one parent for the button + button = click.target.parentElement; + } else if (click.target.tagName == "polyline") { + // We've clicked the SVG elements inside the button, need to up 2 layers + button = click.target.parentElement.parentElement; + } else if (click.target.classList.contains("toggle-button")) { + // We've clicked the button itself and so don't need to do anything + button = click.target; + } else { + console.log(`[togglebutton]: Couldn't find button for ${click.target}`) + } + target = document.getElementById(button.dataset['button']); + toggleHidden(target); +} + +// If we want to blanket-add toggle classes to certain cells +var addToggleToSelector = () => { + const selector = ""; + if (selector.length > 0) { + document.querySelectorAll(selector).forEach((item) => { + item.classList.add("toggle"); + }) + } +} + +// Helper function to run when the DOM is finished +const sphinxToggleRunWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} +sphinxToggleRunWhenDOMLoaded(addToggleToSelector) +sphinxToggleRunWhenDOMLoaded(initToggleItems) + +/** Toggle details blocks to be open when printing */ +if (toggleOpenOnPrint == "true") { + window.addEventListener("beforeprint", () => { + // Open the details + document.querySelectorAll("details.toggle-details").forEach((el) => { + el.dataset["togglestatus"] = el.open; + el.open = true; + }); + + // Open the admonitions + document.querySelectorAll(".admonition.toggle.toggle-hidden").forEach((el) => { + console.log(el); + el.querySelector("button.toggle-button").click(); + el.dataset["toggle_after_print"] = "true"; + }); + }); + window.addEventListener("afterprint", () => { + // Re-close the details that were closed + document.querySelectorAll("details.toggle-details").forEach((el) => { + el.open = el.dataset["togglestatus"] == "true"; + delete el.dataset["togglestatus"]; + }); + + // Re-close the admonition toggle buttons + document.querySelectorAll(".admonition.toggle").forEach((el) => { + if (el.dataset["toggle_after_print"] == "true") { + el.querySelector("button.toggle-button").click(); + delete el.dataset["toggle_after_print"]; + } + }); + }); +} diff --git a/html/_static/workflow.png b/html/_static/workflow.png new file mode 100644 index 00000000..e124bfdb Binary files /dev/null and b/html/_static/workflow.png differ diff --git a/html/changelog.html b/html/changelog.html new file mode 100644 index 00000000..e19e7881 --- /dev/null +++ b/html/changelog.html @@ -0,0 +1,787 @@ + + + + + + + + + + + + + + + + Changelog - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

ChangelogΒΆ

+

v0.0.1

+
    +
  • Initial release (R. Atwi and M. Bliss)

  • +
+

v0.0.4

+
    +
  • Support for retrieving molecules from pubchem directly and using them in the workflows

  • +
  • Support for OPLS 2005 ff by running Maestro in the backend

  • +
  • Option for charge scaling of ionic species when preparing the lammps data file

  • +
  • Automatic identification of system element types when creating dump files in lammps simulations

  • +
  • Addition of MDPropTools package for analysis of MD trajectories as dependency

  • +
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/citing.html b/html/citing.html new file mode 100644 index 00000000..4117e727 --- /dev/null +++ b/html/citing.html @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + Citing MISPR - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Citing MISPRΒΆ

+

If you find MISPR useful in your research, please consider citing the following papers:

+

Paper 1 (MISPR):

+
@article{atwi2022mispr,
+  title        = {MISPR: An automated infrastructure for high-throughput DFT and MD simulations},
+  author       = {Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi},
+  year         = {2022}
+}
+
+
+

Download as BibTeX

+

Paper 2 (Hybrid NMR Workflow):

+
@article{atwi2022automated,
+  title        = {An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions},
+  author       = {Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi},
+  journal      = {Nature Computational Science},
+  volume       = {2},
+  number       = {2},
+  pages        = {112--122},
+  year         = {2022},
+  publisher    = {Nature Publishing Group}
+}
+
+
+

Download as BibTeX

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/genindex.html b/html/genindex.html new file mode 100644 index 00000000..d67171c6 --- /dev/null +++ b/html/genindex.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + + + + None - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +None + + + + + + +
+
+ + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/index.html b/html/index.html new file mode 100644 index 00000000..844597ba --- /dev/null +++ b/html/index.html @@ -0,0 +1,890 @@ + + + + + + + + + + + + + + + + Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+

MISPR 0.0.4 DocumentationΒΆ

+

MISPR is a Python library for computational materials science and contains +preset workflows for running complex hierarchical density functional +theory (DFT) and classical molecular dynamics (MD) simulations to compute +properties of materials.

+
+_images/summary.jpeg +
+

InstallationΒΆ

+
+
+
+

Install using pip:

+
pip install mispr
+
+
+
+
+
+
+

Important

+

Before you can start using MISPR, there are additional steps you need to follow. +Please refer to the installation guide for complete setup instructions, +including any dependencies or configuration files required.

+
+

Learning ResourcesΒΆ

+
+
+
+
+
+

About MISPR

+
+ +
+
+ +
+
+
+

How-tos

+
+ +
+
+
+
+
+

Code documentation

+
+
+ +
+
+
+
+
+

Contributing / Reporting / SupportΒΆ

+

Contirbuting to MISPR can be in the form of:

+
    +
  • Requesting or adding new workflows and features

  • +
  • Reporting or fixing bugs and issues

  • +
  • Contributing to the documentation and/or examples

  • +
+

If you want to add or change something in the code, you can do this by +forking MISPR on GitHub and +submitting a pull request.

+

If you submit a bug report, we will review it and move it to GitHub issues, +where its progress can be tracked.

+

For other inquiries, please contact us at rasha.atwi@stonybrook.edu.

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/installation/configuration.html b/html/installation/configuration.html new file mode 100644 index 00000000..365c9961 --- /dev/null +++ b/html/installation/configuration.html @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + Configuration Files - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Configuration FilesΒΆ

+

After setting up the environment and installing the software, you will +need to configure the software to work with your system. This is done by +creating the following set of configuration files.

+
+

Note

+

This page is intended to help you get set-up for the first time using +FireWorks and MISPR so you can learn how these software work. Please +refer to the FireWorks +documentation for more information on these files and how FireWorks works. +Here, we will only discuss the basic configuration options which are +sufficient for using MISPR as in this tutorial.

+
+

Writing the Configuration FilesΒΆ

+
+ +
+

This file contains the basic MongoDB information like the +credentials required to connect to the database where the +calculation outputs will be stored. Note that +JSON strings require double quotes except for the value of +β€œport” which is an integer.

+
{
+    "admin_user": "|ADMIN_USERNAME|",
+    "admin_password": "|ADMIN_PASSWORD|",
+    "aliases": {},
+    "collection": "|COLLECTION|",
+    "database": "|DB_NAME|",
+    "host": "|HOSTNAME|",
+    "port": |PORT|,
+}
+
+
+
+ +
+

This file stores your FireWorker’s credentials. In +the FireWorks, a +FireWorker can be as simple as the workstation used to host the +LaunchPad or complicated like a supercomputing center with a +queueing system.

+
name: |WORKER_NAME|
+category: ''
+query: '{}'
+env:
+    db_file: |CODES_DIR|/config/db.json
+    scratch_dir: null
+
+
+

The following parameters are defined in the file:

+
    +
  • name: the name of the worker where your job will be run; +this is helpful when you have multiple workers; see +FireWorks documentation on controlling the Worker +if you need more information on setting up this file if you are +using more than one worker.

  • +
  • category and queue: these parameters can control which +calculations are run on which worker; the default settings will +allow all calculations to be run

  • +
  • env: defines worker-specific settings like the path to the +db file and the scratch directory for fast disk access

  • +
+
+ +
+

This is the FireWorks LaunchPad file that contains the MongoDB +credentials required to connect to the database for storing +and managing workflows within FireWorks. Note that the db.json +file we created earlier is used to connect to the database +where the results are stored and is used by MISPR while +my_launchpad.yaml is used by FireWorks. The two databases +can be the same or different databases. If they are the same databases, +then the information here will be mostly the same as that in the +db.json file.

+
host: |HOSTNAME|
+port: |PORT|
+name: |LAUNCHPAD_NAME|
+username: |ADMIN_USERNAME|
+password: |ADMIN_PASSWORD|
+logdir: null
+strm_lvl: INFO
+user_indices: []
+wf_user_indices: []
+authsource: null
+uri_mode: |URI_MODE|
+mongoclient_kwargs: {}
+
+
+

The following parameters need to be defined in the file:

+
    +
  • host: the hostname of the MongoDB server

  • +
  • port: the port number of the MongoDB server

  • +
  • name: the name of the MongoDB server

  • +
  • username: the username to connect to the MongoDB server

  • +
  • password: the password to connect to the MongoDB server

  • +
+

Note that if the uri_mode is set to true, the host +should be the full URI string. +In this case, the username and password are not used.

+

If you want to pass other custom keyword arguments +(e.g., SSL/TLS arguments) to the MongoClient connection, you +can do that via mongoclient_kwargs. See +pymongo documentation +for more details.

+
+ +
+

This is the queue adapter file required by FireWorks to +automatically communicate with the queueing system. +The example provided here is for SLURM machines and does not +include a full list of possible parameters, but you can +check the rest of the parameters or parameters that can be +specified for other queue systems (e.g., PBS, SGE, etc.) +here.

+
_fw_name: CommonAdapter
+_fw_q_type: SLURM
+rocket_launch: rlaunch -w |CODES_DIR|/config singleshot
+nodes: 1
+walltime: 24:00:00
+queue: null
+account: null
+job_name: null
+pre_rocket: null
+post_rocket: null
+logdir: |CODES_DIR|/logs
+
+
+

The following parameters are defined in the file:

+
    +
  • _fw_name: CommonAdapter means that the queue is one of +the built-in queue systems

  • +
  • _fw_q_type: the queue system type (e.g., SLURM, PBS, SGE, etc.)

  • +
  • rocket_launch: the method to use for launching Rockets

  • +
  • nodes, walltime, queue, account, job_name: +parameters you normally specify in your SLURM script for +allocating resources

  • +
  • pre_rocket and post_rocket: the commands to run +before and after launching the Rocket (e.g., module load +packages)

  • +
  • logdir: path to the log directory

  • +
+
+

Note

+

Specifying singleshot in the file will limit each +reserved job to running only one firework at a time even if other +fireworks are waiting to be run. This can be changed to rapidfire +to run all fireworks in parallel. You can go over the FireWorks +documentation to learn the difference between these launching modes.

+
+
+ +
+

This file contains the commands to run Gaussian, LAMMPS, and AmberTools. +These commands are specific to your computing resources you are +running on. The example provided here is meant to show how these +commands should be defined, but you need to change them to match your +system.

+
[RunCalc]
+gcmd: g16 < "$input_path$" > "$output_path$"
+formchkcmd: formchk "$input_path$" "$output_path$"
+
+[LammpsRunCalc]
+lcmd: mpirun -np $SLURM_NTASKS lmp_mpi -in $control_path$
+lammps_gpu_cmd: null
+
+[AmbertoolsRunCalc]
+acmd: antechamber -i $input_file$ -fi $input_type$ -o $output_file$ -fo $output_type$ -c $charge_method$ -s 2
+pcmd: parmchk2 -i $input_file$ -f mol2 -o $output_file$
+tcmd: tleap -f $input_file$
+
+[MaestroCalc]
+mae_cmd: $SCHRODINGER/utilities/structconvert $input_file$ $output_file$
+ffld_cmd: $SCHRODINGER/utilities/ffld_server -imae $input_file$ -version 14 -print_parameters -out_file $output_file$
+
+
+

The following commands are defined in the file:

+
    +
  • gcmd: the command to run Gaussian

  • +
  • formchkcmd: the command to run Gaussian formchk to convert +a Gaussian checkpoint file into formatted forms

  • +
  • lcmd: the command to run LAMMPS

  • +
  • lammps_gpu_cmd: the command to run LAMMPS on a GPU

  • +
  • acmd: the command to run Antechamber

  • +
  • pcmd: the command to run Parmchk2

  • +
  • tcmd: the command to run tleap

  • +
+
+

Note

+

Anything between two dollar signs ($ $) is a placeholder for +a variable and should not be changed.

+

Anything between the square brackets ([]), e.g., [RunCalc], +or before the colons (:), e.g., gmcd, should not be changed +since these are used to point MISPR to the commands to run.

+
+
+ +
+

This is the master FireWorks configuration file that controls +FireWorks settings and points to the location of the other +configuration files.

+
CONFIG_FILE_DIR: |CODES_DIR|/config
+
+
+

The CONFIG_FILE_DIR is expected to contain the +other configuration files. For a list of control settings that +can be added to this file, check +FireWorks documentation on modifying the FW config.

+
+
+

Configuring Bash ProfileΒΆ

+

After creating the above six configuration files and replacing the +placeholders with your specific settings, create a directory in +your |CODES_DIR| (see Definition) called config +and move the above configuration files into it. The |CODES_DIR|/config +should look like:

+
config
+β”œβ”€β”€ config.ini
+β”œβ”€β”€ db.json
+β”œβ”€β”€ FW_config.yaml
+β”œβ”€β”€ my_fworker.yaml
+β”œβ”€β”€ my_launchpad.yaml
+└── my_qadapter.yaml
+
+
+

Now, append the following lines to your .bash_profile or .bashrc +file in order to set an environment variable that tells FireWorks where +to find the FW_config.yaml file, which will in turn tell FireWorks +where the rest of the configuration files are:

+
export FW_CONFIG_FILE=|CODES_DIR|/config/FW_config.yaml
+
+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/installation/dependencies.html b/html/installation/dependencies.html new file mode 100644 index 00000000..bdc8df46 --- /dev/null +++ b/html/installation/dependencies.html @@ -0,0 +1,935 @@ + + + + + + + + + + + + + + + + Prerequisites - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

PrerequisitesΒΆ

+

Virtual python environmentΒΆ

+

MISPR depends on a number of third party Python packages, and usually on +specific versions of those packages. In order not to interfere with third +party packages needed by other software on your machine or cluster, we +strongly recommend isolating MISPR in a virtual python environment. In the +following, we describe how to create a virtual python environment using +the virtualenv tool, but +feel free to use your preferred environment manager +(e.g. conda).

+
+

Recommendation

+

We recommend that you use Python version 3.7 since this is the version that we have +tested MISPR with.

+
+

Creating the virtual environmentΒΆ

+

To create and activate a new virtual environment, go to your +|CODES_DIR| (see Definition), and run the following commands:

+
pip install --user --upgrade virtualenv     # install virtualenv tool
+python -m virtualenv mispr_env              # create "mispr_env" environment
+source mispr_env/bin/activate               # activate "mispr_env" environment
+
+
+

This will create a directory in your |CODES_DIR| named mispr_env, +where all the packages will be installed. After activation, your prompt +should have (mispr_env) in front of it, indicating that you are +working inside the virtual environment. The activation script ensures +that python programs have access only to packages installed inside the +virtualenv. +To deactivate the enviornment, simply run:

+
deactivate
+
+
+
+

Note

+

You may need to install pip and setuptools in your virtual +enviornment in case the system or user version of these tools is old:

+
pip install -U setuptools pip
+
+
+
+

Computational chemistry softwareΒΆ

+

At the backend, MISPR uses:

+
    +
  • Gaussian software to perform DFT calculations

  • +
  • AmberTools to generate GAFF parameters

  • +
  • LAMMPS to run MD simulations

  • +
  • Packmol to +create initial configurations for MD simulations. To install packmol, +follow their user guide

  • +
+

Ensure that you have access to the executables of these software +before using MISPR. Gaussian is a commercial software +that requires a license while AmberTools, LAMMPS, and Packmol are open source. +If Gaussian, AmberTools, and LAMMPS are already installed on supercomputing +resources, the user typically needs to load their corresponding modules +before their use.

+

Materials Project base librariesΒΆ

+
    +
  • pymatgen: MISPR uses pymatgen for handling +different molecule representations and i/o operations specific to +Gaussian and LAMMPS. We have made changes to the pymatgen library to +make it compatible with our needs in MISPR. These changes have not +been merged yet with the main pymatgen library. Therefore, in order +to use MISPR, you need to install the MolMD version of pymatgen by +running the following commands in your |CODES_DIR|:

    +
    git clone https://github.com/molmd/pymatgen.git
    +cd pymatgen
    +python setup.py install
    +
    +
    +
  • +
  • FireWorks: MISPR +uses FireWorks to design, manage, and execute workflows. To install, +simply type:

    +
    pip install FireWorks
    +
    +
    +

    Further details can be found in the FireWorks documentation.

    +
    +

    Note

    +

    While FireWorks is used in MISPR for managing the DFT and MD +workflows due to its many advantages, it takes some time to learn +and get used to it.

    +
    +
  • +
  • custodian: MISPR uses +custodian for handling errors that occur during the simulations and +correcting them according to predefined rules. We have added a Gaussian +plug-in to the custodian library, but similar to the pymatgen changes, +these changes have not been merged yet with the main custodian library. +Therefore, in order to use MISPR, you need to install the MolMD version +of custodian by running the following commands in your |CODES_DIR|:

    +
    git clone https://github.com/molmd/custodian.git
    +cd custodian
    +python setup.py install
    +
    +
    +
  • +
+

MongoDBΒΆ

+

Following the design decisions of the Materials Project, MISPR uses +MongoDB as the backend database. +MongoDB is a NoSQL database that is designed to store and retrieve +data in a highly efficient and scalable manner. It stores data in the +form of documents represented in the JSON (JavaScript Object Notation) +format, which is similar to a Python dictionary.

+

MISPR uses MongoDB to:

+
    +
  • Add, remove, and search the status of workflows - feature of +FireWorks (required)

  • +
  • Create computational databases of DFT and MD predicted properties - +Feature of MISPR (optional but strongly recommended)

  • +
+

Setting up MongoDBΒΆ

+

Options for getting MongoDB are:

+
    +
  • Install it yourself locally by following the instructions at +MongoDB. +This is pretty simple and typically works well if you are starting out +with MISPR and want to learn how to use a database. However, with this +option, you are limited with the storage space on your local machine and +you do not have the option to share the database with other users. You +also need to have the necessary privileges to install mongo on your machine.

  • +
  • Set up an account using a commercial service, which is typically +the simplest and easiest to use but is not free of charge for databases +with large size. Examples of such services include Atlas and MongoDB Atlas, +which offer 500 MB databases for free. This is typically enough to get +started for small projects.

  • +
  • Self-host a MongoDB server or ask your supercomputing center to offer +MongoDB hosting. This is more complicated than the other options and +will require continuous maintenance of the server.

  • +
+

After creating a new database, you need to keep record of your credentials. +These will be used later in setting up the configuration files required +by FireWorks.

+
+

Note

+

MongoDB must be accessible from the computers you are using to run +the workflows.

+
+

Testing your MongoDB connectionΒΆ

+

Establishing a Connection to MongoDB Using Pymongo:

+

You need to import MongoClient from pymongo and then create a new MongoClient instance. +This instance is used to connect to your MongoDB instance:

+
from pymongo import MongoClient
+
+client = MongoClient("mongodb://localhost:27017/")
+
+
+

In this example, we’re connecting to a MongoDB instance that runs on the same machine +(localhost) on port 27017, which is the default port for MongoDB.

+

Testing the Connection to MongoDB:

+

We can check the connection by listing all the databases:

+
print(client.list_database_names())
+
+
+

If the connection is successful, this command will return a list of names of the databases that are present in the +MongoDB instance.

+

Remember, for you to connect to a MongoDB instance, the MongoDB server needs to be installed and running. +If it’s not running on localhost:27017, you will need to provide the appropriate connection string.

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/installation/index.html b/html/installation/index.html new file mode 100644 index 00000000..86497e35 --- /dev/null +++ b/html/installation/index.html @@ -0,0 +1,843 @@ + + + + + + + + + + + + + + + + Installation - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

InstallationΒΆ

+

Before installing MISPR, you need to follow the steps below in order:

+
    +
  1. (Optional) Create a Virtual python environment

  2. +
  3. Make sure you have access to the Computational chemistry software +needed to run the DFT and MD simulations

  4. +
  5. Install Materials Project base libraries

  6. +
  7. Set up MongoDB database

  8. +
  9. Install MISPR and MDPropTools

  10. +
  11. Prepare the configuration files

  12. +
  13. Run a test workflow

  14. +
+
+

Note

+

Throughout the installation instructions, it is assumed that you are +familiar with Python and with basic Linux shell commands. If not, +Linux Journey and +Python For Beginners +are some recommended starting points.

+
+

Installing MISPR and MDPropToolsΒΆ

+

MISPR and MDPropTools can be installed either from the python package +index (good for most users) or directly from their GitHub +repositories (good for developers).

+

Installation Method 1: Using pipΒΆ

+

To install, simply type:

+
pip install mispr
+pip install mdproptools
+
+
+

Installation Method 2: Development modeΒΆ

+

To make changes directly to the source and contribute to the development +of MISPR, you can install MISPR and MDPropTools in development mode.

+
+

Note

+

If you had already installed MISPR via pip or conda, you +should uninstall that first before starting the installation in +development mode. This ensures that you will not have any conflicts +resulting from two different code installations.

+
+

The steps for installing the packages in development mode are below.

+
    +
  1. Activate your conda environment or virtual environment

  2. +
  3. Create a codes directory in |CODES_DIR|

  4. +
  5. cd to your newly created |CODES_DIR|/codes directory

  6. +
  7. Clone the packages you want to install in development mode using git:

    +
    git clone https://github.com/molmd/mdproptools.git
    +git clone https://github.com/molmd/mispr.git
    +
    +
    +

    Now you should have mdproptools and mispr directories in your codes +directory.

    +
  8. +
  9. For each of these packages, cd into their folders and run +pip install -e . or use the conda equivalent. Once installed, +if you make changes to the code in these packages, the changes +will take effect immediately without having to reinstall the package.

  10. +
+

Post-installationΒΆ

+
    +
  1. Before you go any further, confirm your package installations are correct. +First start IPython by typing ipython in your terminal, then confirm that +the commands import mdproptools and import mispr execute +without any errors

  2. +
  3. To update these codes later on, execute git pull followed by +pip install -e . or the conda equivalent in the corresponding +folder if you installed in development mode. If you installed via pip, +you can simply execute pip install --upgrade mispr.

  4. +
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/installation/test.html b/html/installation/test.html new file mode 100644 index 00000000..58b858b8 --- /dev/null +++ b/html/installation/test.html @@ -0,0 +1,908 @@ + + + + + + + + + + + + + + + + Running a Test Workflow - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Running a Test WorkflowΒΆ

+

After installing MISPR and its dependencies and setting up the configuration +files, it is important to make sure everything is working correctly. +Therefore, we will now run a very simple test workflow that optimizes the +structure of a molecule. Later in Workflow Tutorials, +we will show how to run more complex workflows.

+
+

Note

+

lpad and qlaunch that are used in this tutorial are part of +FireWorks software. You can refer to FireWorks documentation if you +need additional information.

+
+

Initialize the databaseΒΆ

+

Initialize the database by running the following command:

+
lpad reset
+
+
+
+

Warning

+

This command should only be executed one time when you are first +initializing the database set-up. If you reset your LaunchPad at a +later time, you will erase all existing entries in your FireWorks +database, which includes your fireworks, workflows, and launches +collections.

+
+
+

Note

+

Your Python environment where FireWorks is installed must be active +before you run this command.

+
+

Running the above command will return something like this:

+
Are you sure? This will RESET 0 workflows and all data. (Y/N)y
+2022-08-15 17:04:42,224 INFO Performing db tune-up
+2022-08-15 17:04:42,683 INFO LaunchPad was RESET.
+
+
+

Add a workflowΒΆ

+

The next step is to add a workflow to the database. We will run a +workflow that optimizes the geometry of a monoglyme molecule starting +from its xyz file. Note that you need to have the monoglyme.xyz file in +your working directory. You will need to run the following Python code +by creating a file called optimize_geometry.py:

+
from mispr.gaussian.fireworks.core import CalcFromMolFW
+from fireworks import LaunchPad, Workflow
+
+lpad = LaunchPad.auto_load()
+wf = Workflow([CalcFromMolFW("monoglyme.xyz", "get_from_file",
+                              gaussian_input_params={"route_parameters": {"opt": None}},
+                              save_to_file=True, save_to_db=True)])
+lpad.add_wf(wf)
+
+
+

and then running the following command in terminal:

+
python optimize_geometry.py
+
+
+

This will add a structure optimization workflow to the database.

+

Verify the workflowΒΆ

+

To check the status of this workflow in the database, run the following +command in terminal:

+
lpad get_fws -s READY
+
+
+

It will return something like this:

+
{
+    "fw_id": 1,
+    "created_on": "2022-08-16T20:32:54.554404",
+    "updated_on": "2022-08-16T20:32:54.554716",
+    "state": "READY",
+    "name": "calc_from_mol"
+}
+
+
+

Alternatively, you can query your fireworks collection in the MongoDB +database directly or start FireWorks’ LaunchPad +web gui from your local machine (assuming you have also set up +configuration files there):

+
lpad webgui
+
+
+

Submit the workflowΒΆ

+

To launch this job through queue, use the qlaunch command from FireWorks. +qlaunch has 3 modes: singleshot, rapidfire, and multi:

+
    +
  • singleshot: launches one job at a time

  • +
  • rapidfire: launches multiple jobs at once; you’ll most likely +want to use this mode where it is important to add the -m +flag to specify how many jobs to launch at once to prevent submitting +too many jobs at once.

  • +
  • multi: creates one job with multiple fireworks runs

  • +
+

Here is an example command for launching one job from the terminal in the +same working directory as before:

+
qlaunch singleshot
+
+
+

If you are not running your jobs through a queue, replace the +qlaunch command with rlaunch.

+

Monitor the workflowΒΆ

+

If all went well, you can determine the status of your running jobs by +using the following command in the terminal:

+
lpad get_fws -s RUNNING
+
+
+

or:

+
lpad get_fws -s COMPLETED
+
+
+

If your job has failed, your can rerun it using the following command +(replacing fw_id with 1, which is the id of your firework, since +you only have one firework in your launchpad at this point):

+
lpad rerun_fws -i <fw_id>
+
+
+

Query the database for the resultsΒΆ

+

Once this workflow is completed, you will see the generated Gaussian +input and output files as well as a run.json file that contains a +summary of the job in the same working directory.

+

Additionally, you can query the database for the results of your jobs +by using the InChI representation of the monoglyme molecule as a query +criteria:

+
from mispr.gaussian.utilities.db_utilities import get_db
+
+db = get_db()
+db.retrieve_run(inchi="InChI=1S/C4H10O2/c1-5-3-4-6-2/h3-4H2,1-2H3")[0]
+
+
+

This will return a dictionary of the results as they are saved in the +database. Alternatively, you can the view the results using MongoDB +Compass, and the generated documents from the run will appear like the +following in the runs collection of the gaussian database:

+
+../_images/document.png +
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/keywords.html b/html/keywords.html new file mode 100644 index 00000000..9e68d1d9 --- /dev/null +++ b/html/keywords.html @@ -0,0 +1,798 @@ + + + + + + + + + + + + + + + + Keywords - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

KeywordsΒΆ

+ ++++ + + + + + + + + + + + + + + + + + + + +

Keyword

Definition

|CODES_DIR|

Main directory where the virtual python environment is created and the configuration files are stored

LaunchPad

FireWorks database that controls the workflows. It stores all the tasks to be run and their status (e.g., RUNNING, WAITING, COMPLETED, etc.)

FireTask

Computing task to be performed

FireWork

A list of FireTasks that are to be run in sequence

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/license.html b/html/license.html new file mode 100644 index 00000000..f5c07d9c --- /dev/null +++ b/html/license.html @@ -0,0 +1,784 @@ + + + + + + + + + + + + + + + + License - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

LicenseΒΆ

+

MISPR is released under the MIT License.

+
The MIT License (MIT)
+
+Copyright (c) 2022 Stony Brook University
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.common.html b/html/mispr.common.html new file mode 100644 index 00000000..233c52e0 --- /dev/null +++ b/html/mispr.common.html @@ -0,0 +1,863 @@ + + + + + + + + + + + + + + + + mispr.common package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.common packageΒΆ

+

SubmodulesΒΆ

+

mispr.common.pubchem moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.firetasks.html b/html/mispr.gaussian.firetasks.html new file mode 100644 index 00000000..2a306a8e --- /dev/null +++ b/html/mispr.gaussian.firetasks.html @@ -0,0 +1,951 @@ + + + + + + + + + + + + + + + + mispr.gaussian.firetasks package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.gaussian.firetasks packageΒΆ

+

SubmodulesΒΆ

+

mispr.gaussian.firetasks.geo_transformation moduleΒΆ

+

mispr.gaussian.firetasks.parse_outputs moduleΒΆ

+

mispr.gaussian.firetasks.run_calc moduleΒΆ

+

mispr.gaussian.firetasks.write_inputs moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.fireworks.html b/html/mispr.gaussian.fireworks.html new file mode 100644 index 00000000..122828b9 --- /dev/null +++ b/html/mispr.gaussian.fireworks.html @@ -0,0 +1,949 @@ + + + + + + + + + + + + + + + + mispr.gaussian.fireworks package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.gaussian.fireworks packageΒΆ

+

SubmodulesΒΆ

+

mispr.gaussian.fireworks.break_mol moduleΒΆ

+

mispr.gaussian.fireworks.core moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.html b/html/mispr.gaussian.html new file mode 100644 index 00000000..85f64c00 --- /dev/null +++ b/html/mispr.gaussian.html @@ -0,0 +1,1129 @@ + + + + + + + + + + + + + + + + mispr.gaussian package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.gaussian packageΒΆ

+

SubpackagesΒΆ

+
+ +
+

SubmodulesΒΆ

+

mispr.gaussian.database moduleΒΆ

+

mispr.gaussian.defaults moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.utilities.html b/html/mispr.gaussian.utilities.html new file mode 100644 index 00000000..78c0c2e9 --- /dev/null +++ b/html/mispr.gaussian.utilities.html @@ -0,0 +1,1219 @@ + + + + + + + + + + + + + + + + mispr.gaussian.utilities package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.gaussian.utilities packageΒΆ

+

SubmodulesΒΆ

+

mispr.gaussian.utilities.db_utilities moduleΒΆ

+

mispr.gaussian.utilities.dbdoc moduleΒΆ

+

Define functions for cleaning up JSON documents.

+
+
+mispr.gaussian.utilities.dbdoc.add_solvent_to_prop_dict(prop_dict, solvent_gaussian_inputs, solvent_properties)[source]ΒΆ
+

Add solvent properties to a property dictionary (e.g. BDE, BE, etc.).

+
+
Parameters:ΒΆ
+
+
prop_dict : dictΒΆ

Property dictionary.

+
+
solvent_gaussian_inputs : strΒΆ

Gaussian input parameters corresponding to the +implicit solvent model used in the Gaussian calculations, e.g. +β€œ(Solvent=TetraHydroFuran)”.

+
+
solvent_properties : dictΒΆ

Additional solvent input parameters used in the +Gaussian calculations; e.g., {β€œEPS”:12}.

+
+
+
+
Returns:ΒΆ
+

Property dictionary with solvent properties added.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +

mispr.gaussian.utilities.files moduleΒΆ

+

Define utility functions for handling files and paths.

+
+
+mispr.gaussian.utilities.files.bibtex_parser(bib_file, working_dir)[source]ΒΆ
+

Parse a bibtex file and returns a dictionary of the entries.

+
+
Parameters:ΒΆ
+
+
bib_file : strΒΆ

Relative or absolute path to the bibtex file.

+
+
working_dir : strΒΆ

Name of the working directory where the bibtex file is +located if bib_file path is relative; else None.

+
+
+
+
Returns:ΒΆ
+

Dictionary of the entries in the bibtex file.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +
+
+mispr.gaussian.utilities.files.recursive_relative_to_absolute_path(operand, working_dir)[source]ΒΆ
+

Convert recursively relative paths to absolute paths.

+
+
Parameters:ΒΆ
+
+
operand : str, list, dictΒΆ

File, list of files, or a dictionary where the values +are the files; the file(s) path can be relative or absolute.

+
+
working_dir : strΒΆ

Name of the working directory where the file(s) is/are +located if operand path is relative; else None.

+
+
+
+
Returns:ΒΆ
+

+
File, list of files, or dict where the values are the

absolute paths.

+
+
+

+
+
Return type:ΒΆ
+

str or list or dict

+
+
+
+ +

mispr.gaussian.utilities.fw_utilities moduleΒΆ

+

mispr.gaussian.utilities.gout moduleΒΆ

+

mispr.gaussian.utilities.inputs moduleΒΆ

+

Define functions for handling gaussian inputs.

+
+
+mispr.gaussian.utilities.inputs.handle_gaussian_inputs(gaussian_inputs, solvent_gaussian_inputs=None, solvent_properties=None)[source]ΒΆ
+

Wrapper function to cleanup/modify the Gaussian input parameters for one or more +job in a workflow. Checks for implicit solvent parameters and adds missing keywords +for a given job.

+
+
Parameters:ΒΆ
+
+
gaussian_inputs : dictΒΆ

Dictionary of dictionaries of Gaussian inputs, e.g.

+
{"opt": {opt_gaussian_inputs}, "freq": {freq_gaussian_inputs}}
+
+
+

+
+
solvent_gaussian_inputs : str, optionalΒΆ

String of Gaussian inputs for the +solvent, e.g.

+
"(Solvent=Generic, Read)"
+
+
+

+
+
solvent_properties : dict, optionalΒΆ

Dictionary of solvent properties, e.g.

+
{"Eps": 4.33, "EpsInf": 1.69}
+
+
+

+
+
+
+
Returns:ΒΆ
+

Dictionary of dictionaries of reformatted Gaussian inputs.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +

mispr.gaussian.utilities.metadata moduleΒΆ

+

Define functions for creating db schema.

+
+
+mispr.gaussian.utilities.metadata.get_chem_schema(mol)[source]ΒΆ
+

Return a dictionary of chemical schema for a given molecule to use in building db +documents or json file.

+
+
Parameters:ΒΆ
+
+
mol : MoleculeΒΆ

Molecule object.

+
+
+
+
Returns:ΒΆ
+

Chemical schema.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +
+
+mispr.gaussian.utilities.metadata.get_job_name(mol, name)[source]ΒΆ
+

Append a molecule label to the name of a workflow for easy monitoring and +identification.

+
+
Parameters:ΒΆ
+
+
mol : Molecule or strΒΆ

If a Molecule is provided, the appended label will be +the molecular formula; otherwise the label will be the provided string.

+
+
name : strΒΆ

Original name of the workflow.

+
+
+
+
Returns:ΒΆ
+

Job name with molecule label.

+
+
Return type:ΒΆ
+

str

+
+
+
+ +
+
+mispr.gaussian.utilities.metadata.get_mol_formula(mol)[source]ΒΆ
+

Get the alphabetical molecular formula for a molecule.

+
+
Parameters:ΒΆ
+
+
mol : MoleculeΒΆ

Molecule object

+
+
+
+
Returns:ΒΆ
+

Alphabetical molecular formula.

+
+
Return type:ΒΆ
+

str

+
+
+
+ +

mispr.gaussian.utilities.misc moduleΒΆ

+

Define miscellaneous functions useful in many of the mispr levels.

+
+
+mispr.gaussian.utilities.misc.pass_gout_dict(fw_spec, key)[source]ΒΆ
+

Helper function used in the Gaussian Fireworks to pass Gaussian output dictionaries +from one task to the other, while checking that the criteria for starting the +following task are met (e.g. normal termination of the previous job, lack of +imaginary frequencies, etc.).

+
+
Parameters:ΒΆ
+
+
fw_spec : dictΒΆ

Firework spec dictionary.

+
+
key : strΒΆ

Unique key for the Gaussian output dictionary in fw_spec.

+
+
+
+
Returns:ΒΆ
+

Gaussian output dictionary.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +
+
+mispr.gaussian.utilities.misc.recursive_compare_dicts(dict1, dict2, dict1_name, dict2_name, path='')[source]ΒΆ
+

Compare recursively two dictionaries and returns the differences.

+
+
Parameters:ΒΆ
+
+
dict1 : dictΒΆ

First dictionary to compare.

+
+
dict2 : dictΒΆ

Second dictionary to compare.

+
+
dict1_name : strΒΆ

Name of the first dictionary (for messages on the differences).

+
+
dict2_name : strΒΆ

Name of the second dictionary (for messages on the differences).

+
+
path : str, optionalΒΆ

Used internally to keep track of the keys in nested dicts, +meant to be β€œβ€ for the top level

+
+
+
+
Returns:ΒΆ
+

Differences between the two dictionaries (if any).

+
+
Return type:ΒΆ
+

str

+
+
+
+ +
+
+mispr.gaussian.utilities.misc.recursive_signature_remove(d)[source]ΒΆ
+

Remove Recursively the signature β€œ@” from a dictionary (e.g. those in the name of +a module). Used when processing Gaussian runs before saving them to the db.

+
+
Parameters:ΒΆ
+
+
d : dictΒΆ

Dictionary to remove the signature from.

+
+
+
+
Returns:ΒΆ
+

Dictionary with the signature removed.

+
+
Return type:ΒΆ
+

dict

+
+
+
+ +

mispr.gaussian.utilities.mol moduleΒΆ

+

mispr.gaussian.utilities.rdkit moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.workflows.base.html b/html/mispr.gaussian.workflows.base.html new file mode 100644 index 00000000..240e8bee --- /dev/null +++ b/html/mispr.gaussian.workflows.base.html @@ -0,0 +1,993 @@ + + + + + + + + + + + + + + + + mispr.gaussian.workflows.base package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.gaussian.workflows.base packageΒΆ

+

SubmodulesΒΆ

+

mispr.gaussian.workflows.base.bde moduleΒΆ

+

mispr.gaussian.workflows.base.binding_energy moduleΒΆ

+

mispr.gaussian.workflows.base.core moduleΒΆ

+

mispr.gaussian.workflows.base.esp moduleΒΆ

+

mispr.gaussian.workflows.base.ip_ea moduleΒΆ

+

mispr.gaussian.workflows.base.nmr moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.gaussian.workflows.html b/html/mispr.gaussian.workflows.html new file mode 100644 index 00000000..a5603060 --- /dev/null +++ b/html/mispr.gaussian.workflows.html @@ -0,0 +1,1037 @@ + + + + + + + + + + + + + + + + mispr.gaussian.workflows package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.html b/html/mispr.html new file mode 100644 index 00000000..b90815d6 --- /dev/null +++ b/html/mispr.html @@ -0,0 +1,1051 @@ + + + + + + + + + + + + + + + + mispr package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr packageΒΆ

+

SubpackagesΒΆ

+
+ +
+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.hybrid.firetasks.html b/html/mispr.hybrid.firetasks.html new file mode 100644 index 00000000..d35525d4 --- /dev/null +++ b/html/mispr.hybrid.firetasks.html @@ -0,0 +1,918 @@ + + + + + + + + + + + + + + + + mispr.hybrid.firetasks package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.hybrid.firetasks packageΒΆ

+

SubmodulesΒΆ

+

mispr.hybrid.firetasks.nmr_from_md moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.hybrid.html b/html/mispr.hybrid.html new file mode 100644 index 00000000..ff806005 --- /dev/null +++ b/html/mispr.hybrid.html @@ -0,0 +1,978 @@ + + + + + + + + + + + + + + + + mispr.hybrid package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.hybrid.workflows.html b/html/mispr.hybrid.workflows.html new file mode 100644 index 00000000..abbfdbb0 --- /dev/null +++ b/html/mispr.hybrid.workflows.html @@ -0,0 +1,919 @@ + + + + + + + + + + + + + + + + mispr.hybrid.workflows package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.hybrid.workflows packageΒΆ

+

SubmodulesΒΆ

+

mispr.hybrid.workflows.core moduleΒΆ

+

mispr.hybrid.workflows.nmr moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.firetasks.html b/html/mispr.lammps.firetasks.html new file mode 100644 index 00000000..dfa20825 --- /dev/null +++ b/html/mispr.lammps.firetasks.html @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + mispr.lammps.firetasks package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.lammps.firetasks packageΒΆ

+

SubmodulesΒΆ

+

mispr.lammps.firetasks.parse_outputs moduleΒΆ

+

mispr.lammps.firetasks.run moduleΒΆ

+

mispr.lammps.firetasks.write_inputs moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.fireworks.html b/html/mispr.lammps.fireworks.html new file mode 100644 index 00000000..9bfd7c6a --- /dev/null +++ b/html/mispr.lammps.fireworks.html @@ -0,0 +1,963 @@ + + + + + + + + + + + + + + + + mispr.lammps.fireworks package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.lammps.fireworks packageΒΆ

+

SubmodulesΒΆ

+

mispr.lammps.fireworks.core moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.html b/html/mispr.lammps.html new file mode 100644 index 00000000..73d88d24 --- /dev/null +++ b/html/mispr.lammps.html @@ -0,0 +1,1077 @@ + + + + + + + + + + + + + + + + mispr.lammps package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.tests.html b/html/mispr.lammps.tests.html new file mode 100644 index 00000000..42de1fe8 --- /dev/null +++ b/html/mispr.lammps.tests.html @@ -0,0 +1,975 @@ + + + + + + + + + + + + + + + + mispr.lammps.tests package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.lammps.tests packageΒΆ

+

SubmodulesΒΆ

+

mispr.lammps.tests.antechamber moduleΒΆ

+

mispr.lammps.tests.base_test moduleΒΆ

+

mispr.lammps.tests.control moduleΒΆ

+

mispr.lammps.tests.custom_data_workflow moduleΒΆ

+

mispr.lammps.tests.data moduleΒΆ

+

mispr.lammps.tests.electrolyte_wf moduleΒΆ

+

mispr.lammps.tests.esp_to_ff_dict_custom moduleΒΆ

+

mispr.lammps.tests.esp_to_ff_dict_function moduleΒΆ

+

mispr.lammps.tests.liquid_wf_local moduleΒΆ

+

mispr.lammps.tests.parmchk moduleΒΆ

+

mispr.lammps.tests.prmtop moduleΒΆ

+

mispr.lammps.tests.run_lammps moduleΒΆ

+

mispr.lammps.tests.tleap moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.utilities.html b/html/mispr.lammps.utilities.html new file mode 100644 index 00000000..e7c81fff --- /dev/null +++ b/html/mispr.lammps.utilities.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + + + + mispr.lammps.utilities package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.lammps.utilities packageΒΆ

+

SubmodulesΒΆ

+

mispr.lammps.utilities.opls moduleΒΆ

+

mispr.lammps.utilities.utilities moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/mispr.lammps.workflows.html b/html/mispr.lammps.workflows.html new file mode 100644 index 00000000..bf82a7c6 --- /dev/null +++ b/html/mispr.lammps.workflows.html @@ -0,0 +1,963 @@ + + + + + + + + + + + + + + + + mispr.lammps.workflows package - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

mispr.lammps.workflows packageΒΆ

+

SubmodulesΒΆ

+

mispr.lammps.workflows.base moduleΒΆ

+

Module contentsΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/modules.html b/html/modules.html new file mode 100644 index 00000000..75cc252d --- /dev/null +++ b/html/modules.html @@ -0,0 +1,769 @@ + + + + + + + + + + + + + + + + mispr - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/objects.inv b/html/objects.inv new file mode 100644 index 00000000..44b08d6c Binary files /dev/null and b/html/objects.inv differ diff --git a/html/overview.html b/html/overview.html new file mode 100644 index 00000000..acbd3781 --- /dev/null +++ b/html/overview.html @@ -0,0 +1,832 @@ + + + + + + + + + + + + + + + + Overview - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

OverviewΒΆ

+

MISPR (Materials Informatics for Structure-Property Relationships) is a +high-throughput computational infrastructure aimed at guiding and +accelerating materials discovery, optimization, and deployment for +liquid solutions by seamlessly integrating density functional theory +(DFT) with classical molecular dynamics (MD) techniques.

+

MISPR is motivated by the Materials Genome Initiative (MGI) principles and is +built on top of open-source Python packages developed for the Materials +Project such as pymatgen, +FireWorks , +and custodian, as +well as MDPropTools, which +is an in-house package for analyzing MD output and trajectory files.

+
+_images/overview.png +
+

Features of MISPR include:

+
    +
  • Automation of DFT and MD simulations and all their underlying tasks +from file management and job submission to supercomputing resources, +to output parsing and data analytics; a task that can be done to a +single molecule/system or to a large number of systems in parallel

  • +
  • Creation of computational databases of force field parameters and DFT +and MD derived properties of molecular systems for establishing +structure-property relations and maintaining data provenance and +reproducibility

  • +
  • Detection of the inevitable errors that occur during the simulations +and their on-the-fly correction based on template responses that have +been designed relying on human intuition coupled with extensive +experience to significantly improve the success rate of high-throughput +simulations while eliminating human intervention

  • +
  • Support for flexible and well-tested DFT workflows that compute various +properties of individual molecular species or complexes such as bond +dissociation energy, binding energy, redox potential, and nuclear +magnetic resonance (NMR) tensors

  • +
  • Derivation of many molecular ensemble properties such as radial +distribution functions, diffusion coefficients, viscosity, and +conductivity of liquid solutions, which are critical to understanding +complex inter- and intra-atomic interactions controlling the performance +of solutions within various chemistry, biology, and materials science +applications

  • +
  • Seamless integration of DFT and MD simulations through hybrid +workflows that enable force field generation and information flow +between the two length scales to allow exploring wide chemical and +parameter spaces (e.g., temperature, pressure, concentration, etc.), +a task that can be infeasible experimentally and challenging using +manual calculations

  • +
  • Automatic extraction of hundreds of thousands of solvation structures +from MD ensembles and their use in DFT workflows to accurately represent +the electronic environment, which is crucial to derive reliable energetics +and other properties such as NMR chemical shifts and redox potentials +and match them to experimental data

  • +
+
+

Note

+

MISPR is primarily built to work with Gaussian +electronic structure software for DFT calculation and +LAMMPS +open-source software for MD simulations.

+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/py-modindex.html b/html/py-modindex.html new file mode 100644 index 00000000..d25a9966 --- /dev/null +++ b/html/py-modindex.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + None - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +None + + + + + + +
+
+ + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/resources/faq.html b/html/resources/faq.html new file mode 100644 index 00000000..1ca021e4 --- /dev/null +++ b/html/resources/faq.html @@ -0,0 +1,776 @@ + + + + + + + + + + + + + + + + FAQ - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

FAQΒΆ

+

This page is under construction.

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/resources/resources.html b/html/resources/resources.html new file mode 100644 index 00000000..3dd3f244 --- /dev/null +++ b/html/resources/resources.html @@ -0,0 +1,858 @@ + + + + + + + + + + + + + + + + Helpful Links - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Helpful LinksΒΆ

+

Code DocumentationΒΆ

+ +

Code CapsulesΒΆ

+
    +
  • MISPR workshop for high-school students: +a compute capsule that stores the Python environment for the workshop +and includes Jupyter notebooks for predicting various materials +properties using MISPR

  • +
  • NMR tutorial: a compute +capsule that shows how to use the hybrid NMR workflow in MISPR to +sample solvation structures from MD simulations and predict their +NMR chemical shifts in a fully automated manner

  • +
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/searchindex.js b/html/searchindex.js new file mode 100644 index 00000000..91b54fb1 --- /dev/null +++ b/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"titles": ["Changelog", "Citing MISPR", "MISPR documentation", "Configuration Files", "Prerequisites", "Installation", "Running a Test Workflow", "Keywords", "License", "mispr package", "mispr.common package", "mispr.gaussian package", "mispr.gaussian.firetasks package", "mispr.gaussian.fireworks package", "mispr.gaussian.utilities package", "mispr.gaussian.workflows package", "mispr.gaussian.workflows.base package", "mispr.hybrid package", "mispr.hybrid.firetasks package", "mispr.hybrid.workflows package", "mispr.lammps package", "mispr.lammps.firetasks package", "mispr.lammps.fireworks package", "mispr.lammps.tests package", "mispr.lammps.utilities package", "mispr.lammps.workflows package", "mispr", "Overview", "FAQ", "Helpful Links", "Workflow Basics", "Creating Custom Workflows", "Supported Workflows", "Workflow Tutorials"], "terms": {"v0": 0, "0": [0, 6, 33], "1": [0, 1, 3, 6, 14, 33], "initi": [0, 4, 27, 30, 32], "releas": [0, 8], "r": [0, 33], "atwi": [0, 1, 2], "m": [0, 4, 6], "bliss": [0, 1], "4": [0, 6, 14, 33], "support": [0, 27, 33], "retriev": [0, 4, 33], "molecul": [0, 4, 6, 14, 27, 30, 33], "from": [0, 4, 5, 6, 8, 14, 27, 29, 30, 32, 33], "pubchem": [0, 9, 26, 33], "directli": [0, 5, 6, 33], "us": [0, 1, 2, 3, 4, 6, 8, 14, 27, 29, 30, 32, 33], "them": [0, 3, 4, 14, 27, 30, 32], "workflow": [0, 1, 2, 3, 4, 5, 7, 9, 11, 14, 17, 20, 27, 29], "opl": [0, 9, 20, 32], "2005": 0, "ff": 0, "run": [0, 2, 3, 4, 5, 7, 9, 14, 20, 30, 32], "maestro": 0, "backend": [0, 4], "option": [0, 3, 4, 5, 14, 30, 33], "charg": [0, 4, 8, 30, 32, 33], "scale": [0, 27], "ionic": 0, "speci": [0, 27], "when": [0, 3, 6, 14], "prepar": [0, 5], "lammp": [0, 3, 4, 9, 26, 27, 29, 30, 32], "data": [0, 4, 6, 9, 20, 27, 30], "file": [0, 2, 4, 5, 6, 7, 8, 9, 11, 27, 30, 32, 33], "automat": [0, 3, 27], "identif": [0, 14], "system": [0, 3, 4, 27, 30, 33], "element": 0, "type": [0, 3, 4, 5, 11, 14, 32], "creat": [0, 3, 5, 6, 7, 14, 30, 32, 33], "dump": 0, "simul": [0, 1, 2, 4, 5, 27, 29, 32], "addit": [0, 2, 6, 14], "mdproptool": [0, 27], "packag": [0, 3, 4, 5, 26, 27, 30], "analysi": [0, 30, 32, 33], "md": [0, 1, 2, 4, 5, 27, 29, 30, 32], "trajectori": [0, 27, 32], "depend": [0, 2, 4, 6, 30], "If": [1, 2, 3, 4, 5, 6, 14, 33], "you": [1, 2, 3, 4, 5, 6, 33], "find": [1, 3, 33], "your": [1, 3, 5, 6], "research": 1, "pleas": [1, 2, 3], "consid": 1, "follow": [1, 2, 3, 4, 5, 6, 8, 14, 30, 33], "paper": 1, "articl": 1, "atwi2022mispr": 1, "titl": 1, "an": [1, 3, 4, 6, 8, 27, 30], "autom": [1, 27, 29, 30], "infrastructur": [1, 27, 30], "high": [1, 27, 29], "throughput": [1, 27], "dft": [1, 2, 4, 5, 27, 30, 32], "author": [1, 8], "rasha": [1, 2], "matthew": 1, "makeev": 1, "maxim": 1, "rajput": 1, "nav": 1, "nidhi": 1, "year": 1, "2022": [1, 6, 8, 32], "download": [1, 33], "bibtex": [1, 14], "2": [1, 3, 6, 33], "hybrid": [1, 9, 26, 27, 29, 32], "nmr": [1, 9, 11, 15, 17, 27, 29, 32], "atwi2022autom": 1, "framework": 1, "predict": [1, 4, 29, 30], "chemic": [1, 14, 27, 29, 30, 32], "shift": [1, 27, 29, 32], "within": [1, 3, 27], "liquid": [1, 27], "solut": [1, 27], "chen": 1, "ying": 1, "han": 1, "kee": 1, "sung": 1, "mueller": 1, "karl": 1, "t": 1, "murugesan": 1, "vijayakumar": 1, "journal": 1, "natur": 1, "comput": [1, 2, 3, 5, 7, 27, 29, 30], "scienc": [1, 2, 27, 30], "volum": 1, "number": [1, 3, 4, 27, 32, 33], "page": [1, 3, 28, 31, 33], "112": 1, "122": 1, "publish": [1, 8], "group": 1, "i": [2, 3, 4, 5, 6, 7, 8, 14, 27, 28, 30, 31, 33], "python": [2, 5, 6, 7, 27, 29, 30, 33], "librari": [2, 5], "materi": [2, 5, 27, 29], "contain": [2, 3, 6, 30, 33], "preset": [2, 30, 32], "complex": [2, 6, 27], "hierarch": 2, "densiti": [2, 27], "function": [2, 14, 27, 30], "theori": [2, 27], "classic": [2, 27], "molecular": [2, 14, 27, 30], "dynam": [2, 27], "properti": [2, 4, 14, 27, 29, 30], "pip": [2, 4], "befor": [2, 3, 4, 5, 6, 14], "can": [2, 3, 4, 5, 6, 14, 27, 30, 32, 33], "start": [2, 4, 5, 6, 14], "ar": [2, 3, 4, 5, 6, 7, 14, 27, 30, 32, 33], "step": [2, 5, 6, 30, 32, 33], "need": [2, 3, 4, 5, 6], "refer": [2, 3, 6, 33], "guid": [2, 4, 27], "complet": [2, 6, 7, 30], "setup": [2, 4, 30], "instruct": [2, 4, 5], "includ": [2, 3, 4, 6, 8, 27, 29, 30], "ani": [2, 5, 8, 14, 32], "configur": [2, 4, 5, 6, 7, 32], "requir": [2, 3, 4], "about": [2, 30], "overview": 2, "prerequisit": 2, "basic": [2, 3, 5], "extern": 2, "how": [2, 3, 4, 6, 29], "tos": 2, "tutori": [2, 3, 6, 29], "faq": 2, "code": [2, 5, 6], "subpackag": [2, 26], "contirbut": 2, "form": [2, 3, 4, 30, 33], "request": [2, 33], "ad": [2, 3, 4, 14], "new": [2, 4, 30], "featur": [2, 4, 27], "fix": 2, "bug": 2, "issu": 2, "exampl": [2, 3, 4, 6, 30, 33], "want": [2, 3, 4, 5, 6], "add": [2, 4, 14, 33], "chang": [2, 3, 4, 5], "someth": [2, 6], "do": [2, 3, 4, 8], "thi": [2, 3, 4, 5, 6, 8, 28, 31, 33], "fork": 2, "github": [2, 4, 5], "submit": [2, 33], "pull": [2, 5], "we": [2, 3, 4, 6, 30, 33], "review": 2, "move": [2, 3], "where": [2, 3, 4, 6, 7, 14, 30], "its": [2, 4, 6], "progress": 2, "track": [2, 14], "For": [2, 3, 5, 30, 33], "other": [2, 3, 4, 8, 14, 27, 30, 32, 33], "inquiri": 2, "contact": 2, "u": [2, 4], "stonybrook": 2, "edu": 2, "after": [3, 4, 6, 30], "set": [3, 5, 6], "up": [3, 5, 6, 14], "environ": [3, 5, 6, 7, 27, 29], "instal": [3, 4, 6], "softwar": [3, 5, 6, 8, 27, 30], "work": [3, 4, 6, 14, 27, 33], "done": [3, 27], "intend": 3, "help": 3, "get": [3, 4, 14], "first": [3, 5, 6, 14], "time": [3, 4, 6, 30], "firework": [3, 4, 6, 7, 9, 11, 14, 20, 27, 29, 30, 33], "mispr": [3, 4, 6, 8, 27, 29, 30, 32, 33], "so": [3, 8, 30], "learn": [3, 4], "document": [3, 4, 6, 8, 14, 30], "more": [3, 4, 6, 14, 30], "inform": [3, 6, 27, 30], "here": [3, 6], "onli": [3, 4, 6], "discuss": 3, "which": [3, 4, 6, 27], "suffici": 3, "db": [3, 6, 14], "json": [3, 4, 6, 14, 30, 33], "mongodb": [3, 5, 6, 30], "like": [3, 6, 30], "credenti": [3, 4], "connect": [3, 8], "databas": [3, 4, 5, 7, 9, 26, 27, 30, 33], "calcul": [3, 4, 14, 27, 30, 33], "output": [3, 6, 14, 27, 30, 32, 33], "store": [3, 4, 7, 29, 30], "string": [3, 4, 14], "doubl": 3, "quot": 3, "except": 3, "valu": [3, 14], "port": [3, 4], "integ": 3, "admin_us": 3, "admin_usernam": 3, "admin_password": 3, "alias": 3, "collect": [3, 6, 30], "db_name": 3, "host": [3, 4], "hostnam": 3, "my_fwork": 3, "yaml": 3, "": [3, 4, 6, 14], "In": [3, 4, 30, 33], "simpl": [3, 4, 6], "workstat": 3, "launchpad": [3, 6, 7, 33], "complic": [3, 4], "supercomput": [3, 4, 27], "center": [3, 4], "queue": [3, 6, 33], "name": [3, 4, 6, 14, 30, 33], "worker_nam": 3, "categori": 3, "queri": [3, 33], "env": 3, "db_file": 3, "codes_dir": [3, 4, 5, 7], "config": 3, "scratch_dir": 3, "null": 3, "The": [3, 4, 5, 6, 8, 30, 32, 33], "paramet": [3, 4, 11, 14, 27, 30, 32], "defin": [3, 14, 30], "worker": 3, "job": [3, 6, 14, 27, 30, 33], "have": [3, 4, 5, 6, 27], "multipl": [3, 6, 30], "see": [3, 4, 6], "control": [3, 7, 9, 20, 27], "than": [3, 4], "one": [3, 6, 14, 30], "default": [3, 4, 9, 26], "allow": [3, 27], "all": [3, 4, 6, 7, 8, 27, 30], "specif": [3, 4], "path": [3, 14], "scratch": 3, "directori": [3, 4, 5, 6, 7, 14, 33], "fast": 3, "disk": 3, "access": [3, 4, 5], "my_launchpad": 3, "manag": [3, 4, 27], "earlier": 3, "result": [3, 5, 30, 33], "while": [3, 4, 14, 27, 30], "two": [3, 5, 14, 27], "same": [3, 4, 6], "differ": [3, 4, 5, 14, 30], "thei": [3, 6], "mostli": 3, "launchpad_nam": 3, "usernam": 3, "password": 3, "logdir": 3, "strm_lvl": 3, "info": [3, 6], "user_indic": 3, "wf_user_indic": 3, "authsourc": 3, "uri_mod": 3, "mongoclient_kwarg": 3, "server": [3, 4], "true": [3, 6, 33], "should": [3, 4, 5, 6], "full": [3, 30], "uri": 3, "case": [3, 4], "pass": [3, 14], "custom": [3, 30, 32], "keyword": [3, 14], "argument": [3, 33], "e": [3, 4, 5, 7, 14, 27, 30, 32], "g": [3, 4, 7, 14, 27, 30, 32], "ssl": 3, "tl": 3, "mongocli": [3, 4], "via": [3, 5, 33], "pymongo": [3, 4], "detail": [3, 4], "my_qadapt": 3, "adapt": 3, "commun": [3, 30], "provid": [3, 4, 8, 14, 30, 32, 33], "slurm": 3, "machin": [3, 4, 6], "doe": 3, "list": [3, 4, 7, 14, 33], "possibl": 3, "check": [3, 4, 6, 14], "rest": 3, "specifi": [3, 6], "pb": 3, "sge": 3, "etc": [3, 7, 14, 27, 30, 32], "_fw_name": 3, "commonadapt": 3, "_fw_q_type": 3, "rocket_launch": 3, "rlaunch": [3, 6], "w": 3, "singleshot": [3, 6], "node": 3, "walltim": 3, "24": 3, "00": 3, "account": [3, 4], "job_nam": 3, "pre_rocket": 3, "post_rocket": 3, "log": 3, "mean": 3, "built": [3, 27], "method": 3, "launch": [3, 6, 33], "rocket": 3, "normal": [3, 14], "script": [3, 4, 30, 33], "alloc": 3, "resourc": [3, 4, 27, 30], "command": [3, 4, 5, 6, 33], "modul": [3, 4, 26], "load": [3, 4, 33], "limit": [3, 4, 8], "each": [3, 5, 30], "reserv": 3, "even": 3, "wait": [3, 7], "rapidfir": [3, 6, 33], "parallel": [3, 27, 30], "go": [3, 4, 5], "over": 3, "between": [3, 14, 27, 30], "mode": [3, 6], "ini": 3, "gaussian": [3, 4, 6, 9, 26, 27, 29, 30, 32, 33], "ambertool": [3, 4], "These": [3, 4], "meant": [3, 14], "show": [3, 6, 29, 30, 33], "match": [3, 27], "runcalc": 3, "gcmd": 3, "g16": 3, "input_path": 3, "output_path": 3, "formchkcmd": 3, "formchk": 3, "lammpsruncalc": 3, "lcmd": 3, "mpirun": 3, "np": 3, "slurm_ntask": 3, "lmp_mpi": 3, "control_path": 3, "lammps_gpu_cmd": 3, "ambertoolsruncalc": 3, "acmd": 3, "antechamb": [3, 9, 20], "input_fil": 3, "fi": 3, "input_typ": 3, "o": [3, 4, 33], "output_fil": 3, "fo": 3, "output_typ": 3, "c": [3, 8, 33], "charge_method": 3, "pcmd": 3, "parmchk2": 3, "f": [3, 33], "mol2": 3, "tcmd": 3, "tleap": [3, 9, 20], "maestrocalc": 3, "mae_cmd": 3, "schroding": 3, "util": [3, 6, 9, 11, 20, 33], "structconvert": 3, "ffld_cmd": 3, "ffld_server": 3, "ima": 3, "version": [3, 4, 30], "14": [3, 33], "print_paramet": 3, "out_fil": 3, "convert": [3, 14], "checkpoint": 3, "format": [3, 4], "gpu": 3, "anyth": 3, "dollar": 3, "sign": 3, "placehold": 3, "variabl": 3, "squar": 3, "bracket": 3, "colon": 3, "gmcd": 3, "sinc": [3, 4, 6], "point": [3, 5, 6, 33], "fw_config": 3, "master": 3, "locat": [3, 14], "config_file_dir": 3, "expect": 3, "modifi": [3, 8, 14], "fw": 3, "abov": [3, 6, 8, 30, 32, 33], "six": 3, "replac": [3, 6], "definit": [3, 4, 7], "call": [3, 6, 30], "look": 3, "now": [3, 5, 6], "append": [3, 14], "line": 3, "bash_profil": 3, "bashrc": 3, "order": [3, 4, 5, 30], "tell": 3, "turn": 3, "export": 3, "fw_config_fil": 3, "third": 4, "parti": 4, "usual": 4, "those": [4, 14], "interfer": 4, "cluster": 4, "strongli": 4, "isol": 4, "describ": 4, "virtualenv": 4, "tool": 4, "feel": 4, "free": [4, 8], "prefer": 4, "conda": [4, 5], "3": [4, 6, 33], "7": [4, 33], "To": [4, 5, 6], "activ": [4, 5, 6], "user": [4, 5, 30], "upgrad": [4, 5], "mispr_env": 4, "sourc": [4, 5, 14, 27], "bin": 4, "prompt": 4, "front": 4, "indic": 4, "insid": [4, 33], "ensur": [4, 5], "program": 4, "deactiv": 4, "enviorn": 4, "simpli": [4, 5], "mai": 4, "setuptool": 4, "old": 4, "At": [4, 30], "perform": [4, 6, 7, 27, 30, 33], "gener": [4, 6, 14, 27, 30, 32], "gaff": [4, 32], "packmol": 4, "execut": [4, 5, 6, 30], "commerci": 4, "licens": 4, "open": [4, 27, 33], "alreadi": [4, 5, 33], "typic": 4, "correspond": [4, 5, 14, 30, 33], "pymatgen": [4, 27, 29], "handl": [4, 14], "represent": [4, 6], "oper": [4, 30, 33], "made": 4, "make": [4, 5, 6], "compat": 4, "our": 4, "been": [4, 27], "merg": [4, 8], "yet": 4, "main": [4, 7], "therefor": [4, 6], "molmd": [4, 5], "git": [4, 5], "clone": [4, 5], "http": [4, 5], "com": [4, 5], "cd": [4, 5], "py": [4, 6, 33], "design": [4, 27], "further": [4, 5], "found": 4, "due": 4, "mani": [4, 6, 14, 27], "advantag": 4, "take": [4, 5], "some": [4, 5, 30, 32], "custodian": [4, 27, 29], "error": [4, 5, 27], "occur": [4, 27], "dure": [4, 27, 33], "correct": [4, 5, 27, 30], "accord": [4, 33], "predefin": 4, "rule": 4, "plug": 4, "similar": 4, "decis": 4, "nosql": 4, "highli": 4, "effici": 4, "scalabl": 4, "manner": [4, 29], "It": [4, 6, 7, 30], "repres": [4, 27, 30], "javascript": 4, "object": [4, 14, 30], "notat": 4, "dictionari": [4, 6, 14], "remov": [4, 14], "search": [4, 33], "statu": [4, 6, 7], "yourself": 4, "local": [4, 6], "pretti": 4, "well": [4, 6, 27, 33], "out": [4, 8], "howev": [4, 30], "storag": 4, "space": [4, 27], "share": 4, "also": [4, 6, 30, 33], "necessari": 4, "privileg": 4, "mongo": 4, "servic": 4, "simplest": 4, "easiest": 4, "larg": [4, 27, 33], "size": 4, "atla": 4, "offer": 4, "500": 4, "mb": 4, "enough": 4, "small": 4, "self": 4, "ask": 4, "continu": 4, "mainten": 4, "keep": [4, 14], "record": 4, "later": [4, 5, 6], "must": [4, 6], "establish": [4, 27], "import": [4, 5, 6, 33], "instanc": 4, "client": 4, "localhost": 4, "27017": 4, "re": 4, "print": [4, 33], "list_database_nam": 4, "success": [4, 27], "return": [4, 6, 11, 14], "present": 4, "rememb": 4, "appropri": 4, "below": [5, 30], "virtual": [5, 7], "sure": [5, 6], "chemistri": [5, 27], "project": [5, 27], "base": [5, 9, 11, 15, 20, 27, 32, 33], "test": [5, 9, 20, 27], "throughout": 5, "assum": [5, 6], "familiar": 5, "linux": 5, "shell": [5, 30], "journei": 5, "beginn": 5, "recommend": 5, "either": 5, "index": 5, "good": 5, "most": [5, 6], "repositori": 5, "contribut": 5, "had": 5, "uninstal": 5, "conflict": 5, "newli": 5, "folder": 5, "equival": 5, "onc": [5, 6, 30, 33], "effect": 5, "immedi": 5, "without": [5, 8], "reinstal": 5, "confirm": 5, "ipython": 5, "termin": [5, 6, 14], "updat": 5, "everyth": 6, "correctli": 6, "veri": 6, "optim": [6, 27, 32, 33], "structur": [6, 27, 29, 30, 32, 33], "lpad": [6, 33], "qlaunch": [6, 33], "part": 6, "reset": 6, "eras": 6, "exist": 6, "entri": [6, 14], "y": 6, "n": 6, "08": 6, "15": [6, 33], "17": 6, "04": 6, "42": 6, "224": 6, "tune": 6, "683": 6, "wa": 6, "next": 6, "geometri": [6, 33], "monoglym": [6, 33], "xyz": 6, "optimize_geometri": 6, "core": [6, 9, 11, 15, 17, 20, 32], "calcfrommolfw": 6, "auto_load": [6, 33], "wf": [6, 33], "get_from_fil": 6, "gaussian_input_param": 6, "route_paramet": 6, "opt": [6, 14], "none": [6, 14], "save_to_fil": [6, 33], "save_to_db": [6, 33], "add_wf": [6, 33], "get_fw": 6, "readi": 6, "fw_id": 6, "created_on": 6, "16t20": 6, "32": 6, "54": 6, "554404": 6, "updated_on": 6, "554716": 6, "state": 6, "calc_from_mol": 6, "altern": 6, "web": 6, "gui": 6, "webgui": 6, "through": [6, 27, 33], "ha": 6, "multi": 6, "ll": 6, "flag": 6, "prevent": 6, "too": 6, "went": 6, "determin": 6, "fail": 6, "rerun": 6, "id": 6, "rerun_fw": 6, "input": [6, 9, 11, 30, 32, 33], "summari": [6, 30], "addition": 6, "inchi": [6, 30], "criteria": [6, 14, 33], "db_util": [6, 9, 11], "get_db": 6, "retrieve_run": 6, "c4h10o2": [6, 33], "c1": 6, "5": [6, 33], "6": [6, 33], "h3": 6, "4h2": 6, "2h3": 6, "save": [6, 14, 30], "view": 6, "compass": 6, "appear": 6, "task": [7, 14, 27], "firetask": [7, 9, 11, 17, 20, 30], "A": [7, 8, 30], "sequenc": [7, 30], "under": [8, 28, 31, 33], "mit": 8, "copyright": 8, "stoni": 8, "brook": 8, "univers": 8, "permiss": 8, "herebi": 8, "grant": 8, "person": 8, "obtain": 8, "copi": 8, "associ": 8, "deal": 8, "restrict": 8, "right": 8, "distribut": [8, 27], "sublicens": 8, "sell": 8, "permit": 8, "whom": 8, "furnish": 8, "subject": 8, "condit": 8, "notic": 8, "shall": 8, "substanti": 8, "portion": 8, "THE": 8, "AS": 8, "warranti": 8, "OF": 8, "kind": 8, "express": 8, "OR": 8, "impli": 8, "BUT": 8, "NOT": 8, "TO": 8, "merchant": 8, "fit": [8, 33], "FOR": 8, "particular": 8, "purpos": 8, "AND": 8, "noninfring": 8, "IN": 8, "NO": 8, "event": 8, "holder": 8, "BE": [8, 14], "liabl": 8, "claim": 8, "damag": 8, "liabil": 8, "whether": 8, "action": 8, "contract": 8, "tort": 8, "otherwis": [8, 14], "aris": 8, "WITH": 8, "common": [9, 26, 33], "submodul": [9, 15, 26], "geo_transform": [9, 11], "parse_output": [9, 11, 20], "run_calc": [9, 11], "write_input": [9, 11, 20], "break_mol": [9, 11], "dbdoc": [9, 11], "fw_util": [9, 11], "gout": [9, 11], "metadata": [9, 11, 30], "misc": [9, 11], "mol": [9, 11, 33], "rdkit": [9, 11], "nmr_from_md": [9, 17], "base_test": [9, 20], "custom_data_workflow": [9, 20], "electrolyte_wf": [9, 20], "esp_to_ff_dict_custom": [9, 20], "esp_to_ff_dict_funct": [9, 20], "liquid_wf_loc": [9, 20], "parmchk": [9, 20], "prmtop": [9, 20], "run_lammp": [9, 20], "add_solvent_to_prop_dict": [11, 14], "bibtex_pars": [11, 14], "recursive_relative_to_absolute_path": [11, 14], "handle_gaussian_input": [11, 14], "get_chem_schema": [11, 14], "get_job_nam": [11, 14], "get_mol_formula": [11, 14], "pass_gout_dict": [11, 14], "recursive_compare_dict": [11, 14], "recursive_signature_remov": [11, 14], "bde": [11, 14, 15, 30], "binding_energi": [11, 15], "esp": [11, 15, 30, 32], "ip_ea": [11, 15], "clean": 14, "prop_dict": 14, "solvent_gaussian_input": 14, "solvent_properti": 14, "solvent": 14, "dict": 14, "str": 14, "implicit": 14, "model": [14, 30], "tetrahydrofuran": 14, "ep": 14, "12": [14, 33], "bib_fil": 14, "working_dir": 14, "pars": [14, 27, 30], "rel": 14, "absolut": 14, "els": 14, "operand": 14, "recurs": 14, "gaussian_input": 14, "wrapper": 14, "cleanup": 14, "miss": 14, "given": [14, 30], "opt_gaussian_input": 14, "freq": 14, "freq_gaussian_input": 14, "read": [14, 33], "33": 14, "epsinf": 14, "69": 14, "reformat": 14, "schema": 14, "build": [14, 30, 32], "label": 14, "easi": 14, "monitor": 14, "formula": [14, 30], "origin": 14, "alphabet": 14, "miscellan": 14, "level": 14, "fw_spec": 14, "kei": 14, "helper": 14, "met": 14, "previou": 14, "lack": 14, "imaginari": 14, "frequenc": [14, 33], "spec": 14, "uniqu": 14, "dict1": 14, "dict2": 14, "dict1_nam": 14, "dict2_nam": 14, "compar": 14, "second": 14, "messag": 14, "intern": 14, "nest": 14, "top": [14, 27], "d": 14, "signatur": 14, "process": [14, 30, 33], "content": [26, 33], "informat": 27, "relationship": [27, 30], "aim": 27, "acceler": 27, "discoveri": 27, "deploy": 27, "seamlessli": 27, "integr": 27, "techniqu": 27, "motiv": 27, "genom": 27, "mgi": 27, "principl": 27, "develop": 27, "hous": 27, "analyz": [27, 30], "underli": 27, "submiss": 27, "analyt": 27, "singl": [27, 30], "creation": 27, "forc": [27, 32, 33], "field": [27, 32], "deriv": [27, 30, 32], "relat": 27, "maintain": [27, 33], "proven": 27, "reproduc": 27, "detect": 27, "inevit": 27, "fly": 27, "templat": 27, "respons": 27, "reli": 27, "human": 27, "intuit": 27, "coupl": 27, "extens": 27, "experi": 27, "significantli": 27, "improv": 27, "rate": 27, "elimin": 27, "intervent": 27, "flexibl": 27, "variou": [27, 29, 30], "individu": [27, 32], "bond": [27, 30, 32], "dissoci": [27, 30, 32], "energi": [27, 30, 32], "bind": [27, 32], "redox": [27, 32], "potenti": [27, 32, 33], "nuclear": 27, "magnet": 27, "reson": 27, "tensor": 27, "ensembl": 27, "radial": 27, "diffus": [27, 32], "coeffici": [27, 32], "viscos": 27, "conduct": 27, "critic": 27, "understand": 27, "inter": 27, "intra": 27, "atom": [27, 30, 33], "interact": 27, "biologi": 27, "applic": 27, "seamless": 27, "enabl": 27, "flow": 27, "length": 27, "explor": 27, "wide": 27, "temperatur": 27, "pressur": 27, "concentr": 27, "infeas": 27, "experiment": 27, "challeng": 27, "manual": 27, "extract": [27, 32], "hundr": 27, "thousand": 27, "solvat": [27, 29, 32], "accur": 27, "electron": 27, "crucial": 27, "reliabl": 27, "energet": 27, "primarili": 27, "construct": [28, 31, 33], "workshop": 29, "school": 29, "student": 29, "jupyt": 29, "notebook": 29, "sampl": 29, "fulli": 29, "scientif": 30, "descript": 30, "procedur": 30, "lead": 30, "final": 30, "desir": 30, "consist": 30, "rang": 30, "post": 30, "interest": 30, "encod": 30, "recip": 30, "direct": 30, "acycl": 30, "graph": 30, "chain": 30, "link": 30, "sequenti": 30, "transfer": 30, "write": 30, "delet": 30, "shown": 30, "goal": 30, "relev": 30, "simplifi": 30, "implement": 30, "block": [30, 32], "end": 30, "report": 30, "wall": 30, "took": 30, "smile": 30, "summar": 30, "raw": 30, "electrostat": [30, 32, 33], "partial": [30, 32, 33], "plot": 30, "besid": 30, "intermedi": 30, "diagram": [30, 33], "alwai": 30, "last": 30, "avail": 32, "juli": 32, "rdf": 32, "coordin": 32, "mixtur": 32, "compon": 32, "stabl": 32, "One": 32, "own": 32, "reus": 32, "therebi": 32, "skip": [32, 33], "select": 33, "merz": 33, "singh": 33, "kollman": 33, "scheme": 33, "mark": 33, "dash": 33, "border": 33, "get_esp_charg": 33, "_": 33, "mol_operation_typ": 33, "get_from_pubchem": 33, "format_chk": 33, "additional_prop_doc_field": 33, "tag": 33, "mispr_tutori": 33, "process_mol": 33, "esp_tutori": 33, "And": 33, "certain": 33, "current": 33, "subdirectori": 33, "converg": 33, "png": 33, "figur": 33, "displac": 33, "cours": 33, "374646": 33, "373831": 33, "132166": 33, "132716": 33, "034284": 33, "031733": 33, "h": 33, "033853": 33, "8": 33, "034024": 33, "9": 33, "034218": 33, "10": 33, "034388": 33, "11": 33, "070724": 33, "03474": 33, "13": 33, "03438": 33, "034621": 33, "071656": 33, "16": 33, "034974": 33}, "objects": {"": [[9, 0, 0, 1, "mispr", ""]], "mispr": [[10, 0, 0, 1, "common", ""], [11, 0, 0, 1, "gaussian", ""], [17, 0, 0, 1, "hybrid", ""], [20, 0, 0, 1, "lammps", ""]], "mispr.gaussian": [[11, 0, 0, 1, "defaults", ""], [12, 0, 0, 1, "firetasks", ""], [13, 0, 0, 1, "fireworks", ""], [14, 0, 0, 1, "utilities", ""], [15, 0, 0, 1, "workflows", ""]], "mispr.gaussian.utilities": [[14, 0, 0, 1, "dbdoc", ""], [14, 0, 0, 1, "files", ""], [14, 0, 0, 1, "inputs", ""], [14, 0, 0, 1, "metadata", ""], [14, 0, 0, 1, "misc", ""]], "mispr.gaussian.utilities.dbdoc": [[14, 1, 1, 0, "add_solvent_to_prop_dict", "Add solvent properties to a property dictionary (e.g. BDE, BE, etc.)."]], "mispr.gaussian.utilities.dbdoc.add_solvent_to_prop_dict": [[14, 2, 2, 0, "prop_dict", "Property dictionary."], [14, 2, 2, 0, "solvent_gaussian_inputs", "Gaussian input parameters corresponding to the implicit solvent model used in the Gaussian calculations, e.g. \"(Solvent=TetraHydroFuran)\"."], [14, 2, 2, 0, "solvent_properties", "Additional solvent input parameters used in the Gaussian calculations; e.g., {\"EPS\":12}."]], "mispr.gaussian.utilities.files": [[14, 1, 1, 0, "bibtex_parser", "Parse a bibtex file and returns a dictionary of the entries."], [14, 1, 1, 0, "recursive_relative_to_absolute_path", "Convert recursively relative paths to absolute paths."]], "mispr.gaussian.utilities.files.bibtex_parser": [[14, 2, 2, 0, "bib_file", "Relative or absolute path to the bibtex file."], [14, 2, 2, 0, "working_dir", "Name of the working directory where the bibtex file is located if bib_file path is relative; else None."]], "mispr.gaussian.utilities.files.recursive_relative_to_absolute_path": [[14, 2, 2, 0, "operand", "File, list of files, or a dictionary where the values are the files; the file(s) path can be relative or absolute."], [14, 2, 2, 0, "working_dir", "Name of the working directory where the file(s) is/are located if operand path is relative; else None."]], "mispr.gaussian.utilities.inputs": [[14, 1, 1, 0, "handle_gaussian_inputs", "Wrapper function to cleanup/modify the Gaussian input parameters for one or more job in a workflow. Checks for implicit solvent parameters and adds missing keywords for a given job."]], "mispr.gaussian.utilities.inputs.handle_gaussian_inputs": [[14, 2, 2, 0, "gaussian_inputs", "Dictionary of dictionaries of Gaussian inputs, e.g."], [14, 2, 2, 0, "solvent_gaussian_inputs", "String of Gaussian inputs for the solvent, e.g."], [14, 2, 2, 0, "solvent_properties", "Dictionary of solvent properties, e.g."]], "mispr.gaussian.utilities.metadata": [[14, 1, 1, 0, "get_chem_schema", "Return a dictionary of chemical schema for a given molecule to use in building db documents or json file."], [14, 1, 1, 0, "get_job_name", "Append a molecule label to the name of a workflow for easy monitoring and identification."], [14, 1, 1, 0, "get_mol_formula", "Get the alphabetical molecular formula for a molecule."]], "mispr.gaussian.utilities.metadata.get_chem_schema": [[14, 2, 2, 0, "mol", "Molecule object."]], "mispr.gaussian.utilities.metadata.get_job_name": [[14, 2, 2, 0, "mol", "If a Molecule is provided, the appended label will be the molecular formula; otherwise the label will be the provided string."], [14, 2, 2, 0, "name", "Original name of the workflow."]], "mispr.gaussian.utilities.metadata.get_mol_formula": [[14, 2, 2, 0, "mol", "Molecule object"]], "mispr.gaussian.utilities.misc": [[14, 1, 1, 0, "pass_gout_dict", "Helper function used in the Gaussian Fireworks to pass Gaussian output dictionaries from one task to the other, while checking that the criteria for starting the following task are met (e.g. normal termination of the previous job, lack of imaginary frequencies, etc.)."], [14, 1, 1, 0, "recursive_compare_dicts", "Compare recursively two dictionaries and returns the differences."], [14, 1, 1, 0, "recursive_signature_remove", "Remove Recursively the signature \"@\" from a dictionary (e.g. those in the name of a module). Used when processing Gaussian runs before saving them to the db."]], "mispr.gaussian.utilities.misc.pass_gout_dict": [[14, 2, 2, 0, "fw_spec", "Firework spec dictionary."], [14, 2, 2, 0, "key", "Unique key for the Gaussian output dictionary in fw_spec."]], "mispr.gaussian.utilities.misc.recursive_compare_dicts": [[14, 2, 2, 0, "dict1", "First dictionary to compare."], [14, 2, 2, 0, "dict1_name", "Name of the first dictionary (for messages on the differences)."], [14, 2, 2, 0, "dict2", "Second dictionary to compare."], [14, 2, 2, 0, "dict2_name", "Name of the second dictionary (for messages on the differences)."], [14, 2, 2, 0, "path", "Used internally to keep track of the keys in nested dicts, meant to be \"\" for the top level"]], "mispr.gaussian.utilities.misc.recursive_signature_remove": [[14, 2, 2, 0, "d", "Dictionary to remove the signature from."]], "mispr.gaussian.workflows": [[16, 0, 0, 1, "base", ""]], "mispr.hybrid": [[17, 0, 0, 1, "defaults", ""], [18, 0, 0, 1, "firetasks", ""], [19, 0, 0, 1, "workflows", ""]], "mispr.lammps": [[20, 0, 0, 1, "defaults", ""], [21, 0, 0, 1, "firetasks", ""], [22, 0, 0, 1, "fireworks", ""], [23, 0, 0, 1, "tests", ""], [24, 0, 0, 1, "utilities", ""], [25, 0, 0, 1, "workflows", ""]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:parameter"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "parameter", "Python parameter"]}, "titleterms": {"changelog": 0, "cite": 1, "mispr": [1, 2, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "0": 2, "4": 2, "document": [2, 29], "instal": [2, 5], "import": 2, "learn": 2, "resourc": 2, "contribut": 2, "report": 2, "support": [2, 32], "configur": 3, "file": [3, 14], "note": [3, 4, 5, 6, 27, 30, 32, 33], "write": 3, "bash": 3, "profil": 3, "prerequisit": 4, "virtual": 4, "python": 4, "environ": 4, "recommend": 4, "creat": [4, 31], "comput": 4, "chemistri": 4, "softwar": 4, "materi": 4, "project": 4, "base": [4, 16, 25], "librari": 4, "mongodb": 4, "set": 4, "up": 4, "test": [4, 6, 23], "your": 4, "connect": 4, "mdproptool": 5, "method": 5, "1": 5, "us": 5, "pip": 5, "2": 5, "develop": 5, "mode": 5, "post": 5, "run": [6, 21, 33], "workflow": [6, 15, 16, 19, 25, 30, 31, 32, 33], "initi": 6, "databas": [6, 11, 20], "warn": 6, "add": 6, "verifi": 6, "submit": 6, "monitor": 6, "queri": 6, "result": 6, "keyword": 7, "licens": 8, "packag": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "subpackag": [9, 11, 15, 17, 20], "modul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "content": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "common": 10, "submodul": [10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "pubchem": 10, "gaussian": [11, 12, 13, 14, 15, 16], "default": [11, 17, 20], "firetask": [12, 18, 21], "geo_transform": 12, "parse_output": [12, 21], "run_calc": 12, "write_input": [12, 21], "firework": [13, 22], "break_mol": 13, "core": [13, 16, 19, 22], "util": [14, 24], "db_util": 14, "dbdoc": 14, "fw_util": 14, "gout": 14, "input": 14, "metadata": 14, "misc": 14, "mol": 14, "rdkit": 14, "bde": [16, 33], "binding_energi": 16, "esp": [16, 33], "ip_ea": 16, "nmr": [16, 19], "hybrid": [17, 18, 19, 33], "nmr_from_md": 18, "lammp": [20, 21, 22, 23, 24, 25], "antechamb": 23, "base_test": 23, "control": 23, "custom_data_workflow": 23, "data": 23, "electrolyte_wf": 23, "esp_to_ff_dict_custom": 23, "esp_to_ff_dict_funct": 23, "liquid_wf_loc": 23, "parmchk": 23, "prmtop": 23, "run_lammp": 23, "tleap": 23, "opl": 24, "overview": 27, "faq": 28, "help": 29, "link": 29, "code": 29, "capsul": 29, "basic": 30, "custom": 31, "tutori": 33, "an": 33, "md": 33}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 56}, "docurls": ["changelog.html", "citing.html", "index.html", "installation/configuration.html", "installation/dependencies.html", "installation/index.html", "installation/test.html", "keywords.html", "license.html", "mispr.html", "mispr.common.html", "mispr.gaussian.html", "mispr.gaussian.firetasks.html", "mispr.gaussian.fireworks.html", "mispr.gaussian.utilities.html", "mispr.gaussian.workflows.html", "mispr.gaussian.workflows.base.html", "mispr.hybrid.html", "mispr.hybrid.firetasks.html", "mispr.hybrid.workflows.html", "mispr.lammps.html", "mispr.lammps.firetasks.html", "mispr.lammps.fireworks.html", "mispr.lammps.tests.html", "mispr.lammps.utilities.html", "mispr.lammps.workflows.html", "modules.html", "overview.html", "resources/faq.html", "resources/resources.html", "workflows/basics.html", "workflows/custom.html", "workflows/supported.html", "workflows/tutorials.html"]}) \ No newline at end of file diff --git a/html/workflows/basics.html b/html/workflows/basics.html new file mode 100644 index 00000000..b6bcf8bb --- /dev/null +++ b/html/workflows/basics.html @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + Workflow Basics - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Workflow BasicsΒΆ

+

A scientific workflow in MISPR provides a complete description of the +procedure leading to the final data used to predict the desired property +of a given molecule or system. It consists of multiple steps ranging +from the initial setup of a molecule or system of molecules to a +sequence of calculations with dependencies and optional automated +post-processing of parsed data to derive properties of interest.

+
+

Note

+

The workflow model we use to encode DFT and MD recipes in MISPR is +defined by the FireWorks workflow software.

+
+

A workflow in FireWorks is modeled as a Directed Acyclic Graph +representing the chain of relationships between +computational operations. A workflow consists of one or more Fireworks +(jobs) with dependencies. The workflow contains information +about the links between Fireworks to execute them in the correct order. +Each Firework consists of one or more Firetasks that run sequentially. +A Firetask is an atomic computing job that can call shell scripts, +transfer files, write/delete files, or execute other Python functions. +An example of the structure of a DFT workflow in MISPR is shown below:

+
+../_images/workflow.png +
+

Once a Workflow object is created, the user can use the FireWorks package +to execute the calculations on various computing resources. The goal of +MISPR infrastructure is to provide preset workflows for +computing properties relevant to the molecular science community and to +simplify the process of creating new workflows by using the implemented +FireWorks and Firetasks in MISPR as building blocks for custom workflows.

+

At the end of each workflow in MISPR, an analysis FireTask is performed +to analyze the results and generate a report. The report is in the form +of a JSON file and/or MongoDB document. It contains all the input parameters +used in the calculations, the output data, general information about the +calculation like the software version used (Gaussian, LAMMPS, MISPR, etc.), +the wall time the full run took, and chemical metadata about the molecule +or system of molecules (e.g. SMILES, InChI, molecular formula, etc.).

+

In general, each property predicted by MISPR workflows is the result of +multiple Gaussian or LAMMPS calculations, and the predicted property is +represented by a single file/document summarizing data and β€œraw” information +collected from different calculation steps. The MongoDB document +corresponding to a predicted property is stored in a MongoDB collection +named after the property. For example, bond dissociation energies are +stored in a bde collection in the database while electrostatic +partial charges are saved in an esp collection and so on. Some of +the analysis FireTasks also include optional plotting of the results. +Besides the final summary file/document, MISPR stores data from the +intermediate calculation steps into a collection called runs in the +database.

+

The following diagram summarizes the process in MISPR workflows to generate +the analysis files/documents:

+
+../_images/analysis.png +
+
+

Note

+

The above diagram shows one example of the structure of a workflow +where the Fireworks are executed sequentially. Some workflows contain +parallel Fireworks. However, the analysis Firework +is always the last Firework in all the workflows in MISPR.

+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/workflows/custom.html b/html/workflows/custom.html new file mode 100644 index 00000000..d5f8b04d --- /dev/null +++ b/html/workflows/custom.html @@ -0,0 +1,776 @@ + + + + + + + + + + + + + + + + Creating Custom Workflows - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Creating Custom WorkflowsΒΆ

+

This page is under construction.

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/workflows/supported.html b/html/workflows/supported.html new file mode 100644 index 00000000..7bd404b2 --- /dev/null +++ b/html/workflows/supported.html @@ -0,0 +1,821 @@ + + + + + + + + + + + + + + + + Supported Workflows - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Supported WorkflowsΒΆ

+

Some of the workflows available as of July 2022 are:

+
    +
  • +
    DFT:
      +
    • Electrostatic partial charges (ESP)

    • +
    • NMR shifts

    • +
    • Redox potentials

    • +
    • Binding energies

    • +
    • Bond dissociation energies

    • +
    +
    +
    +
  • +
  • +
    MD:
      +
    • Initial configuration building, generation of GAFF +or OPLS parameters, +running of MD simulations

    • +
    • Analysis of output and trajectory files (e.g. RDF, coordination +number, diffusion coefficients, etc.)

    • +
    +
    +
    +
  • +
  • +
    Hybrid:
      +
    • Core workflow for optimizing the individual structure of the +mixture of components, generating their ESP charges, and using +them in MD simulations

    • +
    • NMR: deriving NMR chemicals for stable solvation structures +extracted from MD simulations

    • +
    +
    +
    +
  • +
+

One can customize any of the above workflows or create their own by reusing +the building blocks provided by MISPR. The above preset workflows are in +mispr/gaussian/workflows/base, mispr/lammps/workflows/base, and +mispr/hybrid/workflows.

+
+

Note

+

Other types of force field parameters can be provided as +inputs to the MD workflow, thereby skipping the force field +generation step.

+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/workflows/tutorials.html b/html/workflows/tutorials.html new file mode 100644 index 00000000..64c73b46 --- /dev/null +++ b/html/workflows/tutorials.html @@ -0,0 +1,1025 @@ + + + + + + + + + + + + + + + + Workflow Tutorials - Materials informatics for structure-property relationships + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + +

Workflow TutorialsΒΆ

+

This page is under construction.

+

Running an ESP workflowΒΆ

+

The ESP workflow calculates the partial charges on atoms of a molecule. The charges are +fit to the electrostatic potential at points selected according to the Merz-Singh-Kollman +scheme, but other schemes supported by Gaussian can be used as well.

+

The ESP workflow performs the following steps:

+
+ %%{ +init: { + 'theme': 'base', + 'themeVariables': { + 'primaryTextColor': 'black', + 'lineColor': 'lightgrey', + 'secondaryColor': 'pink', + 'tertiaryColor': 'lightgrey' + } +} +}%% + +graph TD + A[(Input Structure)] -->|Preprocessing| DFT + DFT -->| | B[Geometry Optimization] + B -->| | C[Frequency Calculation] + C -->| | D[ESP Calculation] + D -->|Postprocessing| E[(Output)] + + subgraph DFT + B[Geometry Optimization] + C[Frequency Calculation] + D[ESP Calculation] + end + + style A fill:#EBEBEB,stroke:#BB2528 + style DFT fill:#DDEEFF,stroke:#DDEEFF,font-weight:bold + style B fill:#fff,stroke-dasharray: 5, 5, stroke:#BB2528 + style C fill:#fff,stroke-dasharray: 5, 5, stroke:#BB2528 + style D fill:#fff,stroke:#BB2528 + style E fill:#EBEBEB,stroke:#BB2528 +
+

Note

+

The geometry optimization and frequency calculation steps (marked with a dashed +border in the above diagram) are optional. If the input structure is already +optimized, the workflow will skip these steps.

+
+

In the following example, we will run the ESP workflow on a monoglyme molecule.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
from fireworks import LaunchPad
+
+from mispr.gaussian.workflows.base.esp import get_esp_charges
+
+lpad = LaunchPad.auto_load()
+
+wf, _ = get_esp_charges(
+    mol_operation_type="get_from_pubchem", # (1)!
+    mol="monoglyme",
+    format_chk=True,
+    save_to_db=True,
+    save_to_file=True,
+    additional_prop_doc_fields={"name": "monoglyme"},
+    tag="mispr_tutorial",
+)
+lpad.add_wf(wf) # (2)!
+
+
    +
  1. mol_operation_type refers to the operation to be performed on the input to process the molecule.

    +

    In this example, we are requesting to directly retrieve the molecule from PubChem by providing a +common name for the molecule to be used as query criteria for searching the PubChem database via +the mol input argument. For a list of supported mol_operation_type and the corresponding +mol, refer to mispr.gaussian.utilities.mol.process_mol().

    +
  2. +
  3. Adds the workflow to the launchpad.

  4. +
+
+

Download esp_tutorial.py.

+

Run the script using the following command:

+
python esp_tutorial.py
+
+
+

And then launch the job through the queueing system using the following command:

+
qlaunch rapidfire # (1)!
+
+
    +
  1. This command can submit a large number of jobs at once +or maintain a certain number of jobs in the queue.

  2. +
+
+

The workflow will run and create a directory named C4H10O2 in the current working +directory. The directory will contain the following subdirectories:

+
C4H10O2
+β”œβ”€β”€ Optimization
+β”œβ”€β”€ Frequency
+β”œβ”€β”€ ESP
+β”œβ”€β”€ analysis
+
+
+

Inside the Optimization, Frequency, and ESP subdirectories, you +will find the Gaussian input and output files for the corresponding step. Inside the +Optimization subdirectory, you will also find a β€œconvergence.png” figure that +shows the forces and displacement convergence during the course of the optimization.

+
+../_images/convergence.png +
+

The analysis subdirectory contains the results of the workflow in the form of a +esp.json file. You can read the content of the esp.json file using the +following commands:

+
1
+2
+3
+4
+5
+6
import json
+
+with open("C4H10O2/analysis/esp.json", "r") as f:
+    esp = json.load(f)
+
+print(esp["esp"])
+
+
+

This will output the partial charges on the atoms of the molecule:

+
{
+"1": ["O", -0.374646],
+"2": ["O", -0.373831],
+"3": ["C", 0.132166],
+"4": ["C", 0.132716],
+"5": ["C", 0.034284],
+"6": ["C", 0.031733],
+"7": ["H", 0.033853],
+"8": ["H", 0.034024],
+"9": ["H", 0.034218],
+"10": ["H", 0.034388],
+"11": ["H", 0.070724],
+"12": ["H", 0.03474],
+"13": ["H", 0.03438],
+"14": ["H", 0.034621],
+"15": ["H", 0.071656],
+"16": ["H", 0.034974],
+}
+
+
+

Running a BDE workflowΒΆ

+

Running an MD workflowΒΆ

+

Running a hybrid workflowΒΆ

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..5896b1de --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + \ No newline at end of file