Repository: fast-aircraft-design/FAST-OAD (language: python)

Issue:
Incompatibility with ruamel.yaml>=0.17.5
With fast-oad 1.0.3 and ruamel.yaml 0.17.5 installed, the 01_tutorial.ipynb notebook fails when running `oad.generate_inputs(CONFIGURATION_FILE, SOURCE_FILE, overwrite=True)`, with following error message:

```
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-d3eed771488a> in <module>
----> 1 oad.generate_inputs(CONFIGURATION_FILE, SOURCE_FILE, overwrite=True)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/cmd/api.py in generate_inputs(configuration_file_path, source_path, source_path_schema, overwrite)
    105         conf.write_needed_inputs(source_path, VariableLegacy1XmlFormatter())
    106     else:
--> 107         conf.write_needed_inputs(source_path)
    108 
    109     _LOGGER.info("Problem inputs written in %s", input_file_path)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/io/configuration/configuration.py in write_needed_inputs(self, source_file_path, source_formatter)
    213         """
    214         problem = self.get_problem(read_inputs=False)
--> 215         problem.setup()
    216         variables = DataFile(self.input_file_path, load_data=False)
    217         variables.update(

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/openmdao/core/problem.py in setup(self, check, logger, mode, force_alloc_complex, distributed_vector_class, local_vector_class, derivatives)
    913                                               # src data for inputs)
    914         }
--> 915         model._setup(model_comm, mode, self._metadata)
    916 
    917         # set static mode back to True in all systems in this Problem

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/openmdao/core/system.py in _setup(self, comm, mode, prob_meta)
    766 
    767         # Besides setting up the processors, this method also builds the model hierarchy.
--> 768         self._setup_procs(self.pathname, comm, mode, self._problem_meta)
    769 
    770         prob_meta['config_info'] = _ConfigInfo()

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/openmdao/core/group.py in _setup_procs(self, pathname, comm, mode, prob_meta)
    592         allsubs = self._subsystems_allprocs
    593         for subsys in self._subsystems_myproc:
--> 594             subsys._setup_procs(subsys.pathname, sub_comm, mode, prob_meta)
    595 
    596         # build a list of local subgroups to speed up later loops

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/openmdao/core/group.py in _setup_procs(self, pathname, comm, mode, prob_meta)
    536 
    537         # Call setup function for this group.
--> 538         self.setup()
    539         self._setup_check()
    540 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/module_management/service_registry.py in setup(self)
    297 
    298         # Call the original setup method
--> 299         self.__setup_before_option_decorator()
    300 
    301     # Move the (already bound) method "setup" to "__setup_before_option_decorator"

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/models/performances/mission/openmdao/mission.py in setup(self)
    125             file_name = self.options["mission_file_path"][i + 2 :] + ".yml"
    126             with path(resources, file_name) as mission_input_file:
--> 127                 self.options["mission_file_path"] = MissionDefinition(mission_input_file)
    128         mission_wrapper = MissionWrapper(self.options["mission_file_path"])
    129         if self.options["mission_name"] is None:

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/models/performances/mission/mission_definition/schema.py in __init__(self, file_path)
     72         super().__init__()
     73         if file_path:
---> 74             self.load(file_path)
     75 
     76     def load(self, file_path: Union[str, PathLike]):

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/fastoad/models/performances/mission/mission_definition/schema.py in load(self, file_path)
     84         self.clear()
     85         with open(file_path) as yaml_file:
---> 86             content = load(yaml_file.read(), self._get_schema())
     87 
     88         self._validate(content)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/strictyaml/parser.py in load(yaml_string, schema, label)
    316     and produce corresponding YAML object.
    317     """
--> 318     return generic_load(yaml_string, schema=schema, label=label)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/strictyaml/parser.py in generic_load(yaml_string, schema, label, allow_flow_style)
    278 
    279     try:
--> 280         document = ruamelyaml.load(yaml_string, Loader=DynamicStrictYAMLLoader)
    281     except ruamelyaml.YAMLError as parse_error:
    282         if parse_error.context_mark is not None:

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/main.py in load(stream, Loader, version, preserve_quotes)
   1069     loader = Loader(stream, version, preserve_quotes=preserve_quotes)  # type: Any
   1070     try:
-> 1071         return loader._constructor.get_single_data()
   1072     finally:
   1073         loader._parser.dispose()

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in get_single_data(self)
    120         node = self.composer.get_single_node()
    121         if node is not None:
--> 122             return self.construct_document(node)
    123         return None
    124 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_document(self, node)
    130             self.state_generators = []
    131             for generator in state_generators:
--> 132                 for _dummy in generator:
    133                     pass
    134         self.constructed_objects = {}

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_yaml_map(self, node)
   1615         data._yaml_set_line_col(node.start_mark.line, node.start_mark.column)
   1616         yield data
-> 1617         self.construct_mapping(node, data, deep=True)
   1618         self.set_collection_style(data, node)
   1619 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/strictyaml/parser.py in construct_mapping(self, node, maptyp, deep)
     81                         key_node.start_mark,
     82                     )
---> 83             value = self.construct_object(value_node, deep=deep)
     84             if key_node.comment:
     85                 maptyp._yaml_add_comment(key_node.comment, key=key)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_object(self, node, deep)
    153             # )
    154         self.recursive_objects[node] = None
--> 155         data = self.construct_non_recursive_object(node)
    156 
    157         self.constructed_objects[node] = data

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_non_recursive_object(self, node, tag)
    195             data = next(generator)
    196             if self.deep_construct:
--> 197                 for _dummy in generator:
    198                     pass
    199             else:

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_yaml_map(self, node)
   1615         data._yaml_set_line_col(node.start_mark.line, node.start_mark.column)
   1616         yield data
-> 1617         self.construct_mapping(node, data, deep=True)
   1618         self.set_collection_style(data, node)
   1619 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/strictyaml/parser.py in construct_mapping(self, node, maptyp, deep)
     81                         key_node.start_mark,
     82                     )
---> 83             value = self.construct_object(value_node, deep=deep)
     84             if key_node.comment:
     85                 maptyp._yaml_add_comment(key_node.comment, key=key)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_object(self, node, deep)
    153             # )
    154         self.recursive_objects[node] = None
--> 155         data = self.construct_non_recursive_object(node)
    156 
    157         self.constructed_objects[node] = data

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_non_recursive_object(self, node, tag)
    195             data = next(generator)
    196             if self.deep_construct:
--> 197                 for _dummy in generator:
    198                     pass
    199             else:

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_yaml_map(self, node)
   1615         data._yaml_set_line_col(node.start_mark.line, node.start_mark.column)
   1616         yield data
-> 1617         self.construct_mapping(node, data, deep=True)
   1618         self.set_collection_style(data, node)
   1619 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/strictyaml/parser.py in construct_mapping(self, node, maptyp, deep)
     81                         key_node.start_mark,
     82                     )
---> 83             value = self.construct_object(value_node, deep=deep)
     84             if key_node.comment:
     85                 maptyp._yaml_add_comment(key_node.comment, key=key)

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_object(self, node, deep)
    153             # )
    154         self.recursive_objects[node] = None
--> 155         data = self.construct_non_recursive_object(node)
    156 
    157         self.constructed_objects[node] = data

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_non_recursive_object(self, node, tag)
    195             data = next(generator)
    196             if self.deep_construct:
--> 197                 for _dummy in generator:
    198                     pass
    199             else:

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_yaml_seq(self, node)
   1607         #    data._yaml_add_comment(node.comment)
   1608         yield data
-> 1609         data.extend(self.construct_rt_sequence(node, data))
   1610         self.set_collection_style(data, node)
   1611 

~/PycharmProjects/FAST-OAD_test/.venv/lib/python3.9/site-packages/ruamel/yaml/constructor.py in construct_rt_sequence(self, node, seqtyp, deep)
   1318             )
   1319         ret_val = []
-> 1320         if self.loader and self.loader.comment_handling is None:
   1321             if node.comment:
   1322                 seqtyp._yaml_add_comment(node.comment[:2])

AttributeError: 'DynamicStrictYAMLLoader' object has no attribute 'comment_handling'
```




Discussion / hints:

Fix patch:
diff --git a/docs/documentation/mission_module/mission_file/segments.rst b/docs/documentation/mission_module/mission_file/segments.rst
index e04e14a28..ac91c3634 100644
--- a/docs/documentation/mission_module/mission_file/segments.rst
+++ b/docs/documentation/mission_module/mission_file/segments.rst
@@ -297,8 +297,8 @@ A basic example would be:
 
     segment: cruise
     polar:
-      CL: 0.0, 0.5, 1.0
-      CD: 0.01, 0.03, 0.12
+      CL: [0.0, 0.5, 1.0]
+      CD: [0.01, 0.03, 0.12]
 
 But generally, polar values will be obtained through variable names, because they
 will be computed during the process, or provided in the input file. This should give:
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 65c25e9c3..331a46cda 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,44 +1,44 @@
-alabaster==0.7.12; python_version >= "3.5"
+alabaster==0.7.12; python_version >= "3.6"
 appdirs==1.4.4; python_version >= "3.6" and python_full_version >= "3.6.1"
 appnope==0.1.2; platform_system == "Darwin" and python_version >= "3.7" and sys_platform == "darwin"
 argon2-cffi==20.1.0; python_version >= "3.6"
-astroid==2.5.3; python_version >= "3.6" and python_version < "4.0"
+astroid==2.5.6; python_version >= "3.6" and python_version < "4.0"
 async-generator==1.10; python_full_version >= "3.6.1" and python_version >= "3.6"
 atomicwrites==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
-attrs==20.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-babel==2.9.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.5"
+attrs==21.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
+babel==2.9.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
 backcall==0.2.0; python_version >= "3.7"
 black==19.10b0; python_version >= "3.6"
 bleach==3.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-certifi==2020.12.5; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
+certifi==2021.5.30; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 cffi==1.14.5; python_version >= "3.6" and python_full_version >= "3.6.1" and implementation_name == "pypy"
-cfgv==3.2.0; python_full_version >= "3.6.1"
+cfgv==3.3.0; python_full_version >= "3.6.1"
 chardet==4.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-click==7.1.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" and python_version < "4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0" and python_version < "4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
+click==8.0.1; python_version >= "3.6"
+colorama==0.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" and python_version < "4.0" and platform_system == "Windows" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0" and python_version < "4.0" and platform_system == "Windows" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
 coverage==5.5; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4"
 cycler==0.10.0; python_version >= "3.7"
 decorator==4.4.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.2.0" and python_version >= "3.7"
 defusedxml==0.7.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-distlib==0.3.1; python_full_version >= "3.6.1"
+distlib==0.3.2; python_full_version >= "3.6.1"
 docutils==0.16; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 ensure==1.0.0
 entrypoints==0.3; python_version >= "3.6"
 filelock==3.0.12; python_full_version >= "3.6.1"
-identify==2.2.3; python_full_version >= "3.6.1"
+identify==2.2.7; python_full_version >= "3.6.1"
 idna==2.10; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-imagesize==1.2.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.5"
-importlib-metadata==3.10.1; python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.6.1" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.4.0" and python_version >= "3.6" and python_version < "3.8") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
+imagesize==1.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
+importlib-metadata==4.4.0; python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.6.1" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.4.0" and python_version >= "3.6" and python_version < "3.8") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
 iniconfig==1.1.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 ipopo==1.0.1
-ipykernel==5.5.3; python_version >= "3.6"
+ipykernel==5.5.5; python_version >= "3.6"
 ipysheet==0.4.4
 ipython-genutils==0.2.0; python_version >= "3.7"
-ipython==7.22.0; python_version >= "3.7"
+ipython==7.24.0; python_version >= "3.7"
 ipywidgets==7.6.3
 isort==5.8.0; python_version >= "3.6" and python_version < "4.0"
 jedi==0.18.0; python_version >= "3.7"
-jinja2==2.11.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
+jinja2==3.0.1; python_version >= "3.6"
 jsonrpclib-pelix==0.4.2
 jsonschema==3.2.0
 jupyter-client==6.2.0; python_full_version >= "3.6.1" and python_version >= "3.6"
@@ -49,8 +49,9 @@ kiwisolver==1.3.1; python_version >= "3.7"
 latexcodec==2.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
 lazy-object-proxy==1.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0"
 lxml==4.6.3; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
-markupsafe==1.1.1; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5"
-matplotlib==3.4.1; python_version >= "3.7"
+markupsafe==2.0.1; python_version >= "3.6"
+matplotlib-inline==0.1.2; python_version >= "3.7"
+matplotlib==3.4.2; python_version >= "3.7"
 mccabe==0.6.1; python_version >= "3.6" and python_version < "4.0"
 mistune==0.8.4; python_version >= "3.6"
 nbclient==0.5.3; python_full_version >= "3.6.1" and python_version >= "3.6"
@@ -60,10 +61,10 @@ nbval==0.9.6
 nest-asyncio==1.5.1; python_version >= "3.6" and python_full_version >= "3.6.1"
 networkx==2.5.1; python_version >= "3.6"
 nodeenv==1.6.0; python_full_version >= "3.6.1"
-notebook==6.3.0; python_version >= "3.6"
-numpy==1.20.2; python_version >= "3.7"
-openmdao-extensions==1.0.1; python_version >= "3.6"
-openmdao==3.8.0; python_version >= "3.6"
+notebook==6.4.0; python_version >= "3.6"
+numpy==1.20.3; python_version >= "3.7"
+openmdao-extensions==1.0.2; python_version >= "3.6"
+openmdao==3.9.2; python_version >= "3.6"
 packaging==20.9; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 pandas==1.1.5; python_full_version >= "3.6.1"
 pandocfilters==1.4.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
@@ -74,8 +75,8 @@ pickleshare==0.7.5; python_version >= "3.7"
 pillow==8.2.0; python_version >= "3.7"
 plotly==4.14.3
 pluggy==0.13.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
-pre-commit==2.12.0; python_full_version >= "3.6.1"
-prometheus-client==0.10.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
+pre-commit==2.13.0; python_full_version >= "3.6.1"
+prometheus-client==0.11.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
 prompt-toolkit==3.0.18; python_full_version >= "3.6.1" and python_version >= "3.7"
 ptyprocess==0.7.0; sys_platform != "win32" and python_version >= "3.7" and os_name != "nt"
 py==1.10.0; python_full_version >= "3.6.1" and python_version >= "3.6" and implementation_name == "pypy"
@@ -83,52 +84,51 @@ pybtex-docutils==1.0.0; python_version >= "3.6"
 pybtex==0.24.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6"
 pycparser==2.20; python_version >= "3.6" and python_full_version >= "3.6.1" and implementation_name == "pypy"
 pydoe2==1.3.0; python_version >= "3.6"
-pygments==2.8.1; python_version >= "3.7"
-pylint==2.7.4; python_version >= "3.6" and python_version < "4.0"
+pygments==2.9.0; python_version >= "3.7"
+pylint==2.8.3; python_version >= "3.6" and python_version < "4.0"
 pyparsing==2.4.7; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
 pyrsistent==0.17.3; python_version >= "3.5"
-pytest-cov==2.11.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
-pytest==6.2.3; python_version >= "3.6"
-python-dateutil==2.8.1; python_full_version >= "3.6.1" and python_version >= "3.7" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0")
-pytz==2021.1; python_full_version >= "3.6.1" and python_version >= "3.5"
-pywin32==300; sys_platform == "win32" and python_version >= "3.6"
-pywinpty==0.5.7; os_name == "nt" and python_version >= "3.6"
+pytest-cov==2.12.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
+pytest==6.2.4; python_version >= "3.6"
+python-dateutil==2.8.1; python_full_version >= "3.6.1" and python_version >= "3.7"
+pytz==2021.1; python_full_version >= "3.6.1" and python_version >= "3.6"
+pywin32==301; sys_platform == "win32" and python_version >= "3.6"
+pywinpty==1.1.1; os_name == "nt" and python_version >= "3.6"
 pyyaml==5.4.1; python_full_version >= "3.6.1" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
-pyzmq==22.0.3; python_version >= "3.6" and python_full_version >= "3.6.1"
+pyzmq==22.1.0; python_version >= "3.6" and python_full_version >= "3.6.1"
 regex==2021.4.4; python_version >= "3.6"
 requests==2.25.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 retrying==1.3.3
 ruamel.yaml.clib==0.2.2; platform_python_implementation == "CPython" and python_version < "3.10" and python_version >= "3"
-ruamel.yaml==0.17.4; python_version >= "3"
+ruamel.yaml==0.17.7; python_version >= "3"
 scipy==1.6.1; python_version >= "3.7"
 send2trash==1.5.0; python_version >= "3.6"
-six==1.15.0; python_full_version >= "3.6.1" and python_version >= "3.7" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
-snowballstemmer==2.1.0; python_version >= "3.5"
+six==1.16.0; python_full_version >= "3.6.1" and python_version >= "3.7" and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6") and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
+snowballstemmer==2.1.0; python_version >= "3.6"
 sphinx-rtd-theme==0.5.2
-sphinx==3.5.4; python_version >= "3.5"
-sphinxcontrib-applehelp==1.0.2; python_version >= "3.5"
-sphinxcontrib-bibtex==2.2.0; python_version >= "3.6"
-sphinxcontrib-devhelp==1.0.2; python_version >= "3.5"
-sphinxcontrib-htmlhelp==1.0.3; python_version >= "3.5"
-sphinxcontrib-jsmath==1.0.1; python_version >= "3.5"
-sphinxcontrib-qthelp==1.0.3; python_version >= "3.5"
-sphinxcontrib-serializinghtml==1.1.4; python_version >= "3.5"
-strictyaml==1.4.0
+sphinx==4.0.2; python_version >= "3.6"
+sphinxcontrib-applehelp==1.0.2; python_version >= "3.6"
+sphinxcontrib-bibtex==2.3.0; python_version >= "3.6"
+sphinxcontrib-devhelp==1.0.2; python_version >= "3.6"
+sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.6"
+sphinxcontrib-jsmath==1.0.1; python_version >= "3.6"
+sphinxcontrib-qthelp==1.0.3; python_version >= "3.6"
+sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.6"
 tabulate==0.8.9
-terminado==0.9.4; python_version >= "3.6"
-testpath==0.4.4; python_version >= "3.6"
+terminado==0.10.0; python_version >= "3.6"
+testpath==0.5.0; python_version >= "3.6"
 toml==0.10.2; python_full_version >= "3.6.1" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6") and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.3.0") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
-tomlkit==0.7.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
+tomlkit==0.7.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
 tornado==6.1; python_version >= "3.6" and python_full_version >= "3.6.1"
 traitlets==5.0.5; python_version >= "3.7" and python_full_version >= "3.6.1"
 typed-ast==1.4.3; implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.6"
-typing-extensions==3.7.4.3; python_version >= "3.6" and python_version < "3.8"
-urllib3==1.26.4; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6"
-virtualenv==20.4.3; python_full_version >= "3.6.1"
+typing-extensions==3.10.0.0; python_version >= "3.6" and python_version < "3.8"
+urllib3==1.26.5; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6"
+virtualenv==20.4.7; python_full_version >= "3.6.1"
 wcwidth==0.2.5; python_full_version >= "3.6.1" and python_version >= "3.7"
 webencodings==0.5.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
 widgetsnbextension==3.5.1
-wop==1.12.1; python_version >= "3.6"
+wop==1.13.1; python_version >= "3.6"
 wrapt==1.12.1; python_version >= "3.6" and python_version < "4.0"
-xdsmjs==1.0.0; python_version >= "3.6"
+xdsmjs==1.0.1; python_version >= "3.6"
 zipp==3.4.1; python_version >= "3.6" and python_version < "3.8"
diff --git a/poetry.lock b/poetry.lock
index f77a0588b..f5e9b1134 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -41,11 +41,11 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
 
 [[package]]
 name = "astroid"
-version = "2.5.3"
+version = "2.5.6"
 description = "An abstract syntax tree for Python with inference support."
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = "~=3.6"
 
 [package.dependencies]
 lazy-object-proxy = ">=1.4.0"
@@ -70,21 +70,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "attrs"
-version = "20.3.0"
+version = "21.2.0"
 description = "Classes Without Boilerplate"
 category = "main"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.extras]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"]
-docs = ["furo", "sphinx", "zope.interface"]
-tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
-tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
 
 [[package]]
 name = "babel"
-version = "2.9.0"
+version = "2.9.1"
 description = "Internationalization utilities"
 category = "dev"
 optional = false
@@ -136,7 +136,7 @@ webencodings = "*"
 
 [[package]]
 name = "certifi"
-version = "2020.12.5"
+version = "2021.5.30"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "main"
 optional = false
@@ -155,7 +155,7 @@ pycparser = "*"
 
 [[package]]
 name = "cfgv"
-version = "3.2.0"
+version = "3.3.0"
 description = "Validate configuration and produce human readable error messages."
 category = "dev"
 optional = false
@@ -171,11 +171,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [[package]]
 name = "click"
-version = "7.1.2"
+version = "8.0.1"
 description = "Composable command line interface toolkit"
 category = "main"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.6"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
 
 [[package]]
 name = "colorama"
@@ -225,7 +229,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [[package]]
 name = "distlib"
-version = "0.3.1"
+version = "0.3.2"
 description = "Distribution utilities"
 category = "dev"
 optional = false
@@ -268,7 +272,7 @@ python-versions = "*"
 
 [[package]]
 name = "identify"
-version = "2.2.3"
+version = "2.2.7"
 description = "File identification library for Python"
 category = "dev"
 optional = false
@@ -295,7 +299,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "importlib-metadata"
-version = "3.10.1"
+version = "4.4.0"
 description = "Read metadata from Python packages"
 category = "main"
 optional = false
@@ -338,7 +342,7 @@ zeroconf = ["zeroconf (==0.19)"]
 
 [[package]]
 name = "ipykernel"
-version = "5.5.3"
+version = "5.5.5"
 description = "IPython Kernel for Jupyter"
 category = "main"
 optional = false
@@ -370,7 +374,7 @@ all = ["flexx"]
 
 [[package]]
 name = "ipython"
-version = "7.22.0"
+version = "7.24.0"
 description = "IPython: Productive Interactive Computing"
 category = "main"
 optional = false
@@ -382,6 +386,7 @@ backcall = "*"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
 decorator = "*"
 jedi = ">=0.16"
+matplotlib-inline = "*"
 pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
 pickleshare = "*"
 prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0"
@@ -389,7 +394,7 @@ pygments = "*"
 traitlets = ">=4.2"
 
 [package.extras]
-all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.16)", "pygments", "qtconsole", "requests", "testpath"]
+all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"]
 doc = ["Sphinx (>=1.3)"]
 kernel = ["ipykernel"]
 nbconvert = ["nbconvert"]
@@ -397,7 +402,7 @@ nbformat = ["nbformat"]
 notebook = ["notebook", "ipywidgets"]
 parallel = ["ipyparallel"]
 qtconsole = ["qtconsole"]
-test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.16)"]
+test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
 
 [[package]]
 name = "ipython-genutils"
@@ -456,17 +461,17 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"]
 
 [[package]]
 name = "jinja2"
-version = "2.11.3"
+version = "3.0.1"
 description = "A very fast and expressive template engine."
 category = "main"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.6"
 
 [package.dependencies]
-MarkupSafe = ">=0.23"
+MarkupSafe = ">=2.0"
 
 [package.extras]
-i18n = ["Babel (>=0.8)"]
+i18n = ["Babel (>=2.7)"]
 
 [[package]]
 name = "jsonrpclib-pelix"
@@ -588,15 +593,15 @@ source = ["Cython (>=0.29.7)"]
 
 [[package]]
 name = "markupsafe"
-version = "1.1.1"
+version = "2.0.1"
 description = "Safely add untrusted strings to HTML/XML markup."
 category = "main"
 optional = false
-python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "matplotlib"
-version = "3.4.1"
+version = "3.4.2"
 description = "Python plotting package"
 category = "main"
 optional = false
@@ -610,6 +615,17 @@ pillow = ">=6.2.0"
 pyparsing = ">=2.2.1"
 python-dateutil = ">=2.7"
 
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.2"
+description = "Inline Matplotlib backend for Jupyter"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+traitlets = "*"
+
 [[package]]
 name = "mccabe"
 version = "0.6.1"
@@ -752,7 +768,7 @@ python-versions = "*"
 
 [[package]]
 name = "notebook"
-version = "6.3.0"
+version = "6.4.0"
 description = "A web-based notebook environment for interactive computing"
 category = "main"
 optional = false
@@ -775,13 +791,13 @@ tornado = ">=6.1"
 traitlets = ">=4.2.1"
 
 [package.extras]
-docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme"]
+docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"]
 json-logging = ["json-logging"]
 test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"]
 
 [[package]]
 name = "numpy"
-version = "1.20.2"
+version = "1.20.3"
 description = "NumPy is the fundamental package for array computing with Python."
 category = "main"
 optional = false
@@ -789,7 +805,7 @@ python-versions = ">=3.7"
 
 [[package]]
 name = "openmdao"
-version = "3.8.0"
+version = "3.9.2"
 description = "OpenMDAO framework infrastructure"
 category = "main"
 optional = false
@@ -804,15 +820,15 @@ requests = "*"
 scipy = "*"
 
 [package.extras]
-all = ["aiounittest", "bokeh (>=1.3.4)", "colorama", "matplotlib", "notebook", "numpydoc (>=0.9.1)", "numpydoc (>=0.9.1)", "parameterized", "pycodestyle (>=2.4.0)", "pydocstyle (==2.0.0)", "pyppeteer", "redbaron", "sphinx (>=1.8.5)", "tabulate", "tabulate", "testflo (>=1.3.6websockets)"]
-docs = ["matplotlib", "numpydoc (>=0.9.1)", "redbaron", "sphinx (>=1.8.5)", "tabulate"]
-notebooks = ["notebook", "tabulate"]
+all = ["aiounittest", "bokeh (>=1.3.4)", "colorama", "ipython", "ipython", "matplotlib", "notebook", "numpydoc (>=0.9.1)", "numpydoc (>=0.9.1)", "parameterized", "pycodestyle (>=2.4.0)", "pydocstyle (==2.0.0)", "pyppeteer", "redbaron", "sphinx (>=1.8.5,<4.0)", "tabulate", "tabulate", "testflo (>=1.3.6websockets)"]
+docs = ["matplotlib", "numpydoc (>=0.9.1)", "redbaron", "sphinx (>=1.8.5,<4.0)", "tabulate", "ipython"]
+notebooks = ["notebook", "tabulate", "ipython"]
 test = ["parameterized", "numpydoc (>=0.9.1)", "pycodestyle (>=2.4.0)", "pydocstyle (==2.0.0)", "testflo (>=1.3.6websockets)", "pyppeteer", "aiounittest"]
 visualization = ["bokeh (>=1.3.4)", "colorama"]
 
 [[package]]
 name = "openmdao-extensions"
-version = "1.0.1"
+version = "1.0.2"
 description = "Additional solvers and drivers for OpenMDAO framework"
 category = "main"
 optional = false
@@ -931,7 +947,7 @@ dev = ["pre-commit", "tox"]
 
 [[package]]
 name = "pre-commit"
-version = "2.12.0"
+version = "2.13.0"
 description = "A framework for managing and maintaining multi-language pre-commit hooks."
 category = "dev"
 optional = false
@@ -948,7 +964,7 @@ virtualenv = ">=20.0.8"
 
 [[package]]
 name = "prometheus-client"
-version = "0.10.1"
+version = "0.11.0"
 description = "Python client for the Prometheus monitoring system."
 category = "main"
 optional = false
@@ -1034,7 +1050,7 @@ scipy = "*"
 
 [[package]]
 name = "pygments"
-version = "2.8.1"
+version = "2.9.0"
 description = "Pygments is a syntax highlighting package written in Python."
 category = "main"
 optional = false
@@ -1042,22 +1058,19 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "pylint"
-version = "2.7.4"
+version = "2.8.3"
 description = "python code static checker"
 category = "dev"
 optional = false
 python-versions = "~=3.6"
 
 [package.dependencies]
-astroid = ">=2.5.2,<2.7"
+astroid = "2.5.6"
 colorama = {version = "*", markers = "sys_platform == \"win32\""}
 isort = ">=4.2.5,<6"
 mccabe = ">=0.6,<0.7"
 toml = ">=0.7.1"
 
-[package.extras]
-docs = ["sphinx (==3.5.1)", "python-docs-theme (==2020.12)"]
-
 [[package]]
 name = "pyparsing"
 version = "2.4.7"
@@ -1076,7 +1089,7 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "pytest"
-version = "6.2.3"
+version = "6.2.4"
 description = "pytest: simple powerful testing with Python"
 category = "dev"
 optional = false
@@ -1098,7 +1111,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm
 
 [[package]]
 name = "pytest-cov"
-version = "2.11.1"
+version = "2.12.1"
 description = "Pytest plugin for measuring coverage."
 category = "dev"
 optional = false
@@ -1107,9 +1120,10 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 [package.dependencies]
 coverage = ">=5.2.1"
 pytest = ">=4.6"
+toml = "*"
 
 [package.extras]
-testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"]
+testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
 
 [[package]]
 name = "python-dateutil"
@@ -1132,7 +1146,7 @@ python-versions = "*"
 
 [[package]]
 name = "pywin32"
-version = "300"
+version = "301"
 description = "Python for Window Extensions"
 category = "main"
 optional = false
@@ -1140,11 +1154,11 @@ python-versions = "*"
 
 [[package]]
 name = "pywinpty"
-version = "0.5.7"
-description = "Python bindings for the winpty library"
+version = "1.1.1"
+description = "Pseudo terminal support for Windows from Python."
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "pyyaml"
@@ -1156,7 +1170,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 
 [[package]]
 name = "pyzmq"
-version = "22.0.3"
+version = "22.1.0"
 description = "Python bindings for 0MQ"
 category = "main"
 optional = false
@@ -1205,7 +1219,7 @@ six = ">=1.7.0"
 
 [[package]]
 name = "ruamel.yaml"
-version = "0.17.4"
+version = "0.17.7"
 description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
 category = "main"
 optional = false
@@ -1247,7 +1261,7 @@ python-versions = "*"
 
 [[package]]
 name = "six"
-version = "1.15.0"
+version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
 category = "main"
 optional = false
@@ -1263,17 +1277,17 @@ python-versions = "*"
 
 [[package]]
 name = "sphinx"
-version = "3.5.4"
+version = "4.0.2"
 description = "Python documentation generator"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.dependencies]
 alabaster = ">=0.7,<0.8"
 babel = ">=1.3"
 colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
-docutils = ">=0.12,<0.17"
+docutils = ">=0.14,<0.18"
 imagesize = "*"
 Jinja2 = ">=2.3"
 packaging = "*"
@@ -1321,7 +1335,7 @@ test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-bibtex"
-version = "2.2.0"
+version = "2.3.0"
 description = "Sphinx extension for BibTeX style citations."
 category = "dev"
 optional = false
@@ -1347,11 +1361,11 @@ test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-htmlhelp"
-version = "1.0.3"
+version = "2.0.0"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.extras]
 lint = ["flake8", "mypy", "docutils-stubs"]
@@ -1382,7 +1396,7 @@ test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-serializinghtml"
-version = "1.1.4"
+version = "1.1.5"
 description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
 category = "dev"
 optional = false
@@ -1392,18 +1406,6 @@ python-versions = ">=3.5"
 lint = ["flake8", "mypy", "docutils-stubs"]
 test = ["pytest"]
 
-[[package]]
-name = "strictyaml"
-version = "1.4.0"
-description = "Strict, typed YAML parser"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-python-dateutil = ">=2.6.0"
-"ruamel.yaml" = ">=0.14.2"
-
 [[package]]
 name = "tabulate"
 version = "0.8.9"
@@ -1417,7 +1419,7 @@ widechars = ["wcwidth"]
 
 [[package]]
 name = "terminado"
-version = "0.9.4"
+version = "0.10.0"
 description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
 category = "main"
 optional = false
@@ -1425,7 +1427,7 @@ python-versions = ">=3.6"
 
 [package.dependencies]
 ptyprocess = {version = "*", markers = "os_name != \"nt\""}
-pywinpty = {version = ">=0.5", markers = "os_name == \"nt\""}
+pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""}
 tornado = ">=4"
 
 [package.extras]
@@ -1433,14 +1435,14 @@ test = ["pytest"]
 
 [[package]]
 name = "testpath"
-version = "0.4.4"
+version = "0.5.0"
 description = "Test utilities for code working with files and commands"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">= 3.5"
 
 [package.extras]
-test = ["pathlib2"]
+test = ["pytest", "pathlib2"]
 
 [[package]]
 name = "toml"
@@ -1452,7 +1454,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "tomlkit"
-version = "0.7.0"
+version = "0.7.2"
 description = "Style preserving TOML library"
 category = "main"
 optional = false
@@ -1490,7 +1492,7 @@ python-versions = "*"
 
 [[package]]
 name = "typing-extensions"
-version = "3.7.4.3"
+version = "3.10.0.0"
 description = "Backported and Experimental Type Hints for Python 3.5+"
 category = "main"
 optional = false
@@ -1498,20 +1500,20 @@ python-versions = "*"
 
 [[package]]
 name = "urllib3"
-version = "1.26.4"
+version = "1.26.5"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
 [package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
-brotli = ["brotlipy (>=0.6.0)"]
 
 [[package]]
 name = "virtualenv"
-version = "20.4.3"
+version = "20.4.7"
 description = "Virtual Python Environment builder"
 category = "dev"
 optional = false
@@ -1557,7 +1559,7 @@ notebook = ">=4.4.1"
 
 [[package]]
 name = "wop"
-version = "1.12.1"
+version = "1.13.1"
 description = "WhatsOpt web application command line client"
 category = "main"
 optional = false
@@ -1582,7 +1584,7 @@ python-versions = "*"
 
 [[package]]
 name = "xdsmjs"
-version = "1.0.0"
+version = "1.0.1"
 description = "XDSMjs Python module"
 category = "main"
 optional = false
@@ -1603,7 +1605,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "be4675cba2c40c1a1a59c319a236ee9952176c5dae64f163b4b3881f614b5bda"
+content-hash = "8ad7b598b0bd2b04e1d97f899535bf4cf12fb1b6bf573b61960dc844544ffc94"
 
 [metadata.files]
 alabaster = [
@@ -1635,10 +1637,12 @@ argon2-cffi = [
     {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"},
     {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"},
     {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"},
+    {file = "argon2_cffi-20.1.0-cp39-cp39-win32.whl", hash = "sha256:e2db6e85c057c16d0bd3b4d2b04f270a7467c147381e8fd73cbbe5bc719832be"},
+    {file = "argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a84934bd818e14a17943de8099d41160da4a336bcc699bb4c394bbb9b94bd32"},
 ]
 astroid = [
-    {file = "astroid-2.5.3-py3-none-any.whl", hash = "sha256:bea3f32799fbb8581f58431c12591bc20ce11cbc90ad82e2ea5717d94f2080d5"},
-    {file = "astroid-2.5.3.tar.gz", hash = "sha256:ad63b8552c70939568966811a088ef0bc880f99a24a00834abd0e3681b514f91"},
+    {file = "astroid-2.5.6-py3-none-any.whl", hash = "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e"},
+    {file = "astroid-2.5.6.tar.gz", hash = "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975"},
 ]
 async-generator = [
     {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"},
@@ -1649,12 +1653,12 @@ atomicwrites = [
     {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
 ]
 attrs = [
-    {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"},
-    {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"},
+    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
 ]
 babel = [
-    {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"},
-    {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"},
+    {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
+    {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
 ]
 backcall = [
     {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
@@ -1669,8 +1673,8 @@ bleach = [
     {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"},
 ]
 certifi = [
-    {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
-    {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
+    {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
+    {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
 ]
 cffi = [
     {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"},
@@ -1712,16 +1716,16 @@ cffi = [
     {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"},
 ]
 cfgv = [
-    {file = "cfgv-3.2.0-py2.py3-none-any.whl", hash = "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d"},
-    {file = "cfgv-3.2.0.tar.gz", hash = "sha256:cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1"},
+    {file = "cfgv-3.3.0-py2.py3-none-any.whl", hash = "sha256:b449c9c6118fe8cca7fa5e00b9ec60ba08145d281d52164230a69211c5d597a1"},
+    {file = "cfgv-3.3.0.tar.gz", hash = "sha256:9e600479b3b99e8af981ecdfc80a0296104ee610cab48a5ae4ffd0b668650eb1"},
 ]
 chardet = [
     {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
     {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
 ]
 click = [
-    {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
-    {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
+    {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"},
+    {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"},
 ]
 colorama = [
     {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
@@ -1794,8 +1798,8 @@ defusedxml = [
     {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
 ]
 distlib = [
-    {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"},
-    {file = "distlib-0.3.1.zip", hash = "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"},
+    {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"},
+    {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"},
 ]
 docutils = [
     {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
@@ -1814,8 +1818,8 @@ filelock = [
     {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"},
 ]
 identify = [
-    {file = "identify-2.2.3-py2.py3-none-any.whl", hash = "sha256:398cb92a7599da0b433c65301a1b62b9b1f4bb8248719b84736af6c0b22289d6"},
-    {file = "identify-2.2.3.tar.gz", hash = "sha256:4537474817e0bbb8cea3e5b7504b7de6d44e3f169a90846cbc6adb0fc8294502"},
+    {file = "identify-2.2.7-py2.py3-none-any.whl", hash = "sha256:92d6ad08eca19ceb17576733759944b94c0761277ddc3acf65e75e57ef190e32"},
+    {file = "identify-2.2.7.tar.gz", hash = "sha256:c29e74c3671fe9537715cb695148231d777170ca1498e1c30c675d4ea782afe9"},
 ]
 idna = [
     {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
@@ -1826,8 +1830,8 @@ imagesize = [
     {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
 ]
 importlib-metadata = [
-    {file = "importlib_metadata-3.10.1-py3-none-any.whl", hash = "sha256:2ec0faae539743ae6aaa84b49a169670a465f7f5d64e6add98388cc29fd1f2f6"},
-    {file = "importlib_metadata-3.10.1.tar.gz", hash = "sha256:c9356b657de65c53744046fa8f7358afe0714a1af7d570c00c3835c2d724a7c1"},
+    {file = "importlib_metadata-4.4.0-py3-none-any.whl", hash = "sha256:960d52ba7c21377c990412aca380bf3642d734c2eaab78a2c39319f67c6a5786"},
+    {file = "importlib_metadata-4.4.0.tar.gz", hash = "sha256:e592faad8de1bda9fe920cf41e15261e7131bcf266c30306eec00e8e225c1dd5"},
 ]
 iniconfig = [
     {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
@@ -1838,16 +1842,16 @@ ipopo = [
     {file = "iPOPO-1.0.1.tar.gz", hash = "sha256:79882efe394658cce6e104c84bf77a3ff2c6a970ad1810481401f4bcdee7eeb4"},
 ]
 ipykernel = [
-    {file = "ipykernel-5.5.3-py3-none-any.whl", hash = "sha256:21abd584543759e49010975a4621603b3cf871b1039cb3879a14094717692614"},
-    {file = "ipykernel-5.5.3.tar.gz", hash = "sha256:a682e4f7affd86d9ce9b699d21bcab6d5ec9fbb2bfcb194f2706973b252bc509"},
+    {file = "ipykernel-5.5.5-py3-none-any.whl", hash = "sha256:29eee66548ee7c2edb7941de60c0ccf0a7a8dd957341db0a49c5e8e6a0fcb712"},
+    {file = "ipykernel-5.5.5.tar.gz", hash = "sha256:e976751336b51082a89fc2099fb7f96ef20f535837c398df6eab1283c2070884"},
 ]
 ipysheet = [
     {file = "ipysheet-0.4.4-py2.py3-none-any.whl", hash = "sha256:7666e89504df57fc34fd9860b1928bb53269204fe41a73602b167b7964c64e48"},
     {file = "ipysheet-0.4.4.tar.gz", hash = "sha256:54e9dffb4384db8586d3ca6be6fd5679157f6cf98ecc9ad368fa938f889e58b2"},
 ]
 ipython = [
-    {file = "ipython-7.22.0-py3-none-any.whl", hash = "sha256:c0ce02dfaa5f854809ab7413c601c4543846d9da81010258ecdab299b542d199"},
-    {file = "ipython-7.22.0.tar.gz", hash = "sha256:9c900332d4c5a6de534b4befeeb7de44ad0cc42e8327fa41b7685abde58cec74"},
+    {file = "ipython-7.24.0-py3-none-any.whl", hash = "sha256:f86788eef439891438af3498525094cc2acbdbea4f2aa2f8895782d4ff471341"},
+    {file = "ipython-7.24.0.tar.gz", hash = "sha256:a171caa3d3d4c819a1c0742e3abecfd5a2b8ab525ca1c9f114b40b76b0679ab1"},
 ]
 ipython-genutils = [
     {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"},
@@ -1866,8 +1870,8 @@ jedi = [
     {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"},
 ]
 jinja2 = [
-    {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
-    {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"},
+    {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
+    {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
 ]
 jsonrpclib-pelix = [
     {file = "jsonrpclib-pelix-0.4.2.tar.gz", hash = "sha256:340915c17ebef7451948341542bf4789fc8d8c9fe604e86f00b722b6074a89f0"},
@@ -1994,60 +1998,65 @@ lxml = [
     {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"},
 ]
 markupsafe = [
-    {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"},
-    {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"},
-    {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"},
-    {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"},
-    {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"},
-    {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"},
-    {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"},
-    {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"},
-    {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"},
-    {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"},
-    {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
-    {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
-    {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
-    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
-    {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
-    {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
-    {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
-    {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
-    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
-    {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
-    {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
-    {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
-    {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
-    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
-    {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
-    {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
-    {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
-    {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
+    {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
 ]
 matplotlib = [
-    {file = "matplotlib-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a54efd6fcad9cb3cd5ef2064b5a3eeb0b63c99f26c346bdcf66e7c98294d7cc"},
-    {file = "matplotlib-3.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:86dc94e44403fa0f2b1dd76c9794d66a34e821361962fe7c4e078746362e3b14"},
-    {file = "matplotlib-3.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:574306171b84cd6854c83dc87bc353cacc0f60184149fb00c9ea871eca8c1ecb"},
-    {file = "matplotlib-3.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:84a10e462120aa7d9eb6186b50917ed5a6286ee61157bfc17c5b47987d1a9068"},
-    {file = "matplotlib-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:81e6fe8b18ef5be67f40a1d4f07d5a4ed21d3878530193898449ddef7793952f"},
-    {file = "matplotlib-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c45e7bf89ea33a2adaef34774df4e692c7436a18a48bcb0e47a53e698a39fa39"},
-    {file = "matplotlib-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1f83a32e4b6045191f9d34e4dc68c0a17c870b57ef9cca518e516da591246e79"},
-    {file = "matplotlib-3.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a18cc1ab4a35b845cf33b7880c979f5c609fd26c2d6e74ddfacb73dcc60dd956"},
-    {file = "matplotlib-3.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ac2a30a09984c2719f112a574b6543ccb82d020fd1b23b4d55bf4759ba8dd8f5"},
-    {file = "matplotlib-3.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a97781453ac79409ddf455fccf344860719d95142f9c334f2a8f3fff049ffec3"},
-    {file = "matplotlib-3.4.1-cp38-cp38-win32.whl", hash = "sha256:2eee37340ca1b353e0a43a33da79d0cd4bcb087064a0c3c3d1329cdea8fbc6f3"},
-    {file = "matplotlib-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:90dbc007f6389bcfd9ef4fe5d4c78c8d2efe4e0ebefd48b4f221cdfed5672be2"},
-    {file = "matplotlib-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f16660edf9a8bcc0f766f51c9e1b9d2dc6ceff6bf636d2dbd8eb925d5832dfd"},
-    {file = "matplotlib-3.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a989022f89cda417f82dbf65e0a830832afd8af743d05d1414fb49549287ff04"},
-    {file = "matplotlib-3.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:be4430b33b25e127fc4ea239cc386389de420be4d63e71d5359c20b562951ce1"},
-    {file = "matplotlib-3.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7561fd541477d41f3aa09457c434dd1f7604f3bd26d7858d52018f5dfe1c06d1"},
-    {file = "matplotlib-3.4.1-cp39-cp39-win32.whl", hash = "sha256:9f374961a3996c2d1b41ba3145462c3708a89759e604112073ed6c8bdf9f622f"},
-    {file = "matplotlib-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:53ceb12ef44f8982b45adc7a0889a7e2df1d758e8b360f460e435abe8a8cd658"},
-    {file = "matplotlib-3.4.1.tar.gz", hash = "sha256:84d4c4f650f356678a5d658a43ca21a41fca13f9b8b00169c0b76e6a6a948908"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c541ee5a3287efe066bbe358320853cf4916bc14c00c38f8f3d8d75275a405a9"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3a5c18dbd2c7c366da26a4ad1462fe3e03a577b39e3b503bbcf482b9cdac093c"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a9d8cb5329df13e0cdaa14b3b43f47b5e593ec637f13f14db75bb16e46178b05"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:7ad19f3fb6145b9eb41c08e7cbb9f8e10b91291396bee21e9ce761bb78df63ec"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:7a58f3d8fe8fac3be522c79d921c9b86e090a59637cb88e3bc51298d7a2c862a"},
+    {file = "matplotlib-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6382bc6e2d7e481bcd977eb131c31dee96e0fb4f9177d15ec6fb976d3b9ace1a"},
+    {file = "matplotlib-3.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a6a44f27aabe720ec4fd485061e8a35784c2b9ffa6363ad546316dfc9cea04e"},
+    {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1c1779f7ab7d8bdb7d4c605e6ffaa0614b3e80f1e3c8ccf7b9269a22dbc5986b"},
+    {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5826f56055b9b1c80fef82e326097e34dc4af8c7249226b7dd63095a686177d1"},
+    {file = "matplotlib-3.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0bea5ec5c28d49020e5d7923c2725b837e60bc8be99d3164af410eb4b4c827da"},
+    {file = "matplotlib-3.4.2-cp38-cp38-win32.whl", hash = "sha256:6475d0209024a77f869163ec3657c47fed35d9b6ed8bccba8aa0f0099fbbdaa8"},
+    {file = "matplotlib-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:21b31057bbc5e75b08e70a43cefc4c0b2c2f1b1a850f4a0f7af044eb4163086c"},
+    {file = "matplotlib-3.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b26535b9de85326e6958cdef720ecd10bcf74a3f4371bf9a7e5b2e659c17e153"},
+    {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:32fa638cc10886885d1ca3d409d4473d6a22f7ceecd11322150961a70fab66dd"},
+    {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:956c8849b134b4a343598305a3ca1bdd3094f01f5efc8afccdebeffe6b315247"},
+    {file = "matplotlib-3.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:85f191bb03cb1a7b04b5c2cca4792bef94df06ef473bc49e2818105671766fee"},
+    {file = "matplotlib-3.4.2-cp39-cp39-win32.whl", hash = "sha256:b1d5a2cedf5de05567c441b3a8c2651fbde56df08b82640e7f06c8cd91e201f6"},
+    {file = "matplotlib-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:df815378a754a7edd4559f8c51fc7064f779a74013644a7f5ac7a0c31f875866"},
+    {file = "matplotlib-3.4.2.tar.gz", hash = "sha256:d8d994cefdff9aaba45166eb3de4f5211adb4accac85cbf97137e98f26ea0219"},
+]
+matplotlib-inline = [
+    {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"},
+    {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"},
 ]
 mccabe = [
     {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
@@ -2086,40 +2095,40 @@ nodeenv = [
     {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"},
 ]
 notebook = [
-    {file = "notebook-6.3.0-py3-none-any.whl", hash = "sha256:cb271af1e8134e3d6fc6d458bdc79c40cbfc84c1eb036a493f216d58f0880e92"},
-    {file = "notebook-6.3.0.tar.gz", hash = "sha256:cbc9398d6c81473e9cdb891d2cae9c0d3718fca289dda6d26df5cb660fcadc7d"},
+    {file = "notebook-6.4.0-py3-none-any.whl", hash = "sha256:f7f0a71a999c7967d9418272ae4c3378a220bd28330fbfb49860e46cf8a5838a"},
+    {file = "notebook-6.4.0.tar.gz", hash = "sha256:9c4625e2a2aa49d6eae4ce20cbc3d8976db19267e32d2a304880e0c10bf8aef9"},
 ]
 numpy = [
-    {file = "numpy-1.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e9459f40244bb02b2f14f6af0cd0732791d72232bbb0dc4bab57ef88e75f6935"},
-    {file = "numpy-1.20.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a8e6859913ec8eeef3dbe9aed3bf475347642d1cdd6217c30f28dee8903528e6"},
-    {file = "numpy-1.20.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9cab23439eb1ebfed1aaec9cd42b7dc50fc96d5cd3147da348d9161f0501ada5"},
-    {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9c0fab855ae790ca74b27e55240fe4f2a36a364a3f1ebcfd1fb5ac4088f1cec3"},
-    {file = "numpy-1.20.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:61d5b4cf73622e4d0c6b83408a16631b670fc045afd6540679aa35591a17fe6d"},
-    {file = "numpy-1.20.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d15007f857d6995db15195217afdbddfcd203dfaa0ba6878a2f580eaf810ecd6"},
-    {file = "numpy-1.20.2-cp37-cp37m-win32.whl", hash = "sha256:d76061ae5cab49b83a8cf3feacefc2053fac672728802ac137dd8c4123397677"},
-    {file = "numpy-1.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bad70051de2c50b1a6259a6df1daaafe8c480ca98132da98976d8591c412e737"},
-    {file = "numpy-1.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:719656636c48be22c23641859ff2419b27b6bdf844b36a2447cb39caceb00935"},
-    {file = "numpy-1.20.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:aa046527c04688af680217fffac61eec2350ef3f3d7320c07fd33f5c6e7b4d5f"},
-    {file = "numpy-1.20.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2428b109306075d89d21135bdd6b785f132a1f5a3260c371cee1fae427e12727"},
-    {file = "numpy-1.20.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e8e4fbbb7e7634f263c5b0150a629342cc19b47c5eba8d1cd4363ab3455ab576"},
-    {file = "numpy-1.20.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:edb1f041a9146dcf02cd7df7187db46ab524b9af2515f392f337c7cbbf5b52cd"},
-    {file = "numpy-1.20.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c73a7975d77f15f7f68dacfb2bca3d3f479f158313642e8ea9058eea06637931"},
-    {file = "numpy-1.20.2-cp38-cp38-win32.whl", hash = "sha256:6c915ee7dba1071554e70a3664a839fbc033e1d6528199d4621eeaaa5487ccd2"},
-    {file = "numpy-1.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:471c0571d0895c68da309dacee4e95a0811d0a9f9f532a48dc1bea5f3b7ad2b7"},
-    {file = "numpy-1.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4703b9e937df83f5b6b7447ca5912b5f5f297aba45f91dbbbc63ff9278c7aa98"},
-    {file = "numpy-1.20.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:abc81829c4039e7e4c30f7897938fa5d4916a09c2c7eb9b244b7a35ddc9656f4"},
-    {file = "numpy-1.20.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:377751954da04d4a6950191b20539066b4e19e3b559d4695399c5e8e3e683bf6"},
-    {file = "numpy-1.20.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6e51e417d9ae2e7848314994e6fc3832c9d426abce9328cf7571eefceb43e6c9"},
-    {file = "numpy-1.20.2-cp39-cp39-win32.whl", hash = "sha256:780ae5284cb770ade51d4b4a7dce4faa554eb1d88a56d0e8b9f35fca9b0270ff"},
-    {file = "numpy-1.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:924dc3f83de20437de95a73516f36e09918e9c9c18d5eac520062c49191025fb"},
-    {file = "numpy-1.20.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:97ce8b8ace7d3b9288d88177e66ee75480fb79b9cf745e91ecfe65d91a856042"},
-    {file = "numpy-1.20.2.zip", hash = "sha256:878922bf5ad7550aa044aa9301d417e2d3ae50f0f577de92051d739ac6096cee"},
+    {file = "numpy-1.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:70eb5808127284c4e5c9e836208e09d685a7978b6a216db85960b1a112eeace8"},
+    {file = "numpy-1.20.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6ca2b85a5997dabc38301a22ee43c82adcb53ff660b89ee88dded6b33687e1d8"},
+    {file = "numpy-1.20.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c5bf0e132acf7557fc9bb8ded8b53bbbbea8892f3c9a1738205878ca9434206a"},
+    {file = "numpy-1.20.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db250fd3e90117e0312b611574cd1b3f78bec046783195075cbd7ba9c3d73f16"},
+    {file = "numpy-1.20.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:637d827248f447e63585ca3f4a7d2dfaa882e094df6cfa177cc9cf9cd6cdf6d2"},
+    {file = "numpy-1.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b7bb4b9280da3b2856cb1fc425932f46fba609819ee1c62256f61799e6a51d2"},
+    {file = "numpy-1.20.3-cp37-cp37m-win32.whl", hash = "sha256:67d44acb72c31a97a3d5d33d103ab06d8ac20770e1c5ad81bdb3f0c086a56cf6"},
+    {file = "numpy-1.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:43909c8bb289c382170e0282158a38cf306a8ad2ff6dfadc447e90f9961bef43"},
+    {file = "numpy-1.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f1452578d0516283c87608a5a5548b0cdde15b99650efdfd85182102ef7a7c17"},
+    {file = "numpy-1.20.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6e51534e78d14b4a009a062641f465cfaba4fdcb046c3ac0b1f61dd97c861b1b"},
+    {file = "numpy-1.20.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e515c9a93aebe27166ec9593411c58494fa98e5fcc219e47260d9ab8a1cc7f9f"},
+    {file = "numpy-1.20.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1c09247ccea742525bdb5f4b5ceeacb34f95731647fe55774aa36557dbb5fa4"},
+    {file = "numpy-1.20.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:66fbc6fed94a13b9801fb70b96ff30605ab0a123e775a5e7a26938b717c5d71a"},
+    {file = "numpy-1.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ea9cff01e75a956dbee133fa8e5b68f2f92175233de2f88de3a682dd94deda65"},
+    {file = "numpy-1.20.3-cp38-cp38-win32.whl", hash = "sha256:f39a995e47cb8649673cfa0579fbdd1cdd33ea497d1728a6cb194d6252268e48"},
+    {file = "numpy-1.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:1676b0a292dd3c99e49305a16d7a9f42a4ab60ec522eac0d3dd20cdf362ac010"},
+    {file = "numpy-1.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:830b044f4e64a76ba71448fce6e604c0fc47a0e54d8f6467be23749ac2cbd2fb"},
+    {file = "numpy-1.20.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55b745fca0a5ab738647d0e4db099bd0a23279c32b31a783ad2ccea729e632df"},
+    {file = "numpy-1.20.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d050e1e4bc9ddb8656d7b4f414557720ddcca23a5b88dd7cff65e847864c400"},
+    {file = "numpy-1.20.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9c65473ebc342715cb2d7926ff1e202c26376c0dcaaee85a1fd4b8d8c1d3b2f"},
+    {file = "numpy-1.20.3-cp39-cp39-win32.whl", hash = "sha256:16f221035e8bd19b9dc9a57159e38d2dd060b48e93e1d843c49cb370b0f415fd"},
+    {file = "numpy-1.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:6690080810f77485667bfbff4f69d717c3be25e5b11bb2073e76bb3f578d99b4"},
+    {file = "numpy-1.20.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e465afc3b96dbc80cf4a5273e5e2b1e3451286361b4af70ce1adb2984d392f9"},
+    {file = "numpy-1.20.3.zip", hash = "sha256:e55185e51b18d788e49fe8305fd73ef4470596b33fc2c1ceb304566b99c71a69"},
 ]
 openmdao = [
-    {file = "openmdao-3.8.0.tar.gz", hash = "sha256:223fcd3bbbae52e17a53dae50c04f59e4a8abd1711b50e7d0f1f73d4e2da75fb"},
+    {file = "openmdao-3.9.2.tar.gz", hash = "sha256:15427aac8c2e6a4a334e7f1fbedd05480a4243f4980d311dfb1f8fc00faeb321"},
 ]
 openmdao-extensions = [
-    {file = "openmdao_extensions-1.0.1.tar.gz", hash = "sha256:e71474b1eabd546e0b7c4dc981915068d59490e4ea68a01bae4aceae1892a181"},
+    {file = "openmdao_extensions-1.0.2.tar.gz", hash = "sha256:10d63ba2cb0cb8a30346dca6ebb467df0d8c31555e6505f9a27ed284ad1e3055"},
 ]
 packaging = [
     {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
@@ -2214,12 +2223,12 @@ pluggy = [
     {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
 ]
 pre-commit = [
-    {file = "pre_commit-2.12.0-py2.py3-none-any.whl", hash = "sha256:029d53cb83c241fe7d66eeee1e24db426f42c858f15a38d20bcefd8d8e05c9da"},
-    {file = "pre_commit-2.12.0.tar.gz", hash = "sha256:46b6ffbab37986c47d0a35e40906ae029376deed89a0eb2e446fb6e67b220427"},
+    {file = "pre_commit-2.13.0-py2.py3-none-any.whl", hash = "sha256:b679d0fddd5b9d6d98783ae5f10fd0c4c59954f375b70a58cbe1ce9bcf9809a4"},
+    {file = "pre_commit-2.13.0.tar.gz", hash = "sha256:764972c60693dc668ba8e86eb29654ec3144501310f7198742a767bec385a378"},
 ]
 prometheus-client = [
-    {file = "prometheus_client-0.10.1-py2.py3-none-any.whl", hash = "sha256:030e4f9df5f53db2292eec37c6255957eb76168c6f974e4176c711cf91ed34aa"},
-    {file = "prometheus_client-0.10.1.tar.gz", hash = "sha256:b6c5a9643e3545bcbfd9451766cbaa5d9c67e7303c7bc32c750b6fa70ecb107d"},
+    {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"},
+    {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"},
 ]
 prompt-toolkit = [
     {file = "prompt_toolkit-3.0.18-py3-none-any.whl", hash = "sha256:bf00f22079f5fadc949f42ae8ff7f05702826a97059ffcc6281036ad40ac6f04"},
@@ -2249,12 +2258,12 @@ pydoe2 = [
     {file = "pyDOE2-1.3.0.tar.gz", hash = "sha256:5492b0f984af52da3af20b1cd61deb21b067c858e65243ec3ba573375f0d6720"},
 ]
 pygments = [
-    {file = "Pygments-2.8.1-py3-none-any.whl", hash = "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"},
-    {file = "Pygments-2.8.1.tar.gz", hash = "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94"},
+    {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"},
+    {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
 ]
 pylint = [
-    {file = "pylint-2.7.4-py3-none-any.whl", hash = "sha256:209d712ec870a0182df034ae19f347e725c1e615b2269519ab58a35b3fcbbe7a"},
-    {file = "pylint-2.7.4.tar.gz", hash = "sha256:bd38914c7731cdc518634a8d3c5585951302b6e2b6de60fbb3f7a0220e21eeee"},
+    {file = "pylint-2.8.3-py3-none-any.whl", hash = "sha256:792b38ff30903884e4a9eab814ee3523731abd3c463f3ba48d7b627e87013484"},
+    {file = "pylint-2.8.3.tar.gz", hash = "sha256:0a049c5d47b629d9070c3932d13bff482b12119b6a241a93bc460b0be16953c8"},
 ]
 pyparsing = [
     {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
@@ -2264,12 +2273,12 @@ pyrsistent = [
     {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"},
 ]
 pytest = [
-    {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"},
-    {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"},
+    {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
+    {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
 ]
 pytest-cov = [
-    {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"},
-    {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"},
+    {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
+    {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
 ]
 python-dateutil = [
     {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
@@ -2280,28 +2289,23 @@ pytz = [
     {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
 ]
 pywin32 = [
-    {file = "pywin32-300-cp35-cp35m-win32.whl", hash = "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63"},
-    {file = "pywin32-300-cp35-cp35m-win_amd64.whl", hash = "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64"},
-    {file = "pywin32-300-cp36-cp36m-win32.whl", hash = "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7"},
-    {file = "pywin32-300-cp36-cp36m-win_amd64.whl", hash = "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85"},
-    {file = "pywin32-300-cp37-cp37m-win32.whl", hash = "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc"},
-    {file = "pywin32-300-cp37-cp37m-win_amd64.whl", hash = "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d"},
-    {file = "pywin32-300-cp38-cp38-win32.whl", hash = "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae"},
-    {file = "pywin32-300-cp38-cp38-win_amd64.whl", hash = "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190"},
-    {file = "pywin32-300-cp39-cp39-win32.whl", hash = "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50"},
-    {file = "pywin32-300-cp39-cp39-win_amd64.whl", hash = "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f"},
+    {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"},
+    {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"},
+    {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"},
+    {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"},
+    {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"},
+    {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"},
+    {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"},
+    {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"},
+    {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"},
+    {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"},
 ]
 pywinpty = [
-    {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"},
-    {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"},
-    {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"},
-    {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"},
-    {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"},
-    {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"},
-    {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"},
-    {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"},
-    {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"},
-    {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"},
+    {file = "pywinpty-1.1.1-cp36-none-win_amd64.whl", hash = "sha256:fa2a0af28eaaacc59227c6edbc0f1525704d68b2dfa3e5b47ae21c5aa25d6d78"},
+    {file = "pywinpty-1.1.1-cp37-none-win_amd64.whl", hash = "sha256:0fe3f538860c6b06e6fbe63da0ee5dab5194746b0df1be7ed65b4fce5da21d21"},
+    {file = "pywinpty-1.1.1-cp38-none-win_amd64.whl", hash = "sha256:12c89765b3102d2eea3d39d191d1b0baea68fb5e3bd094c67b2575b3c9ebfa12"},
+    {file = "pywinpty-1.1.1-cp39-none-win_amd64.whl", hash = "sha256:50bce6f7d9857ffe9694847af7e8bf989b198d0ebc2bf30e26d54c4622cb5c50"},
+    {file = "pywinpty-1.1.1.tar.gz", hash = "sha256:4a3ffa2444daf15c5f65a76b5b2864447cc915564e41e2876816b9e4fe849070"},
 ]
 pyyaml = [
     {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
@@ -2310,55 +2314,63 @@ pyyaml = [
     {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
     {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
     {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
     {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
     {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
     {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
     {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
     {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
     {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
     {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
     {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
     {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
     {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
     {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
     {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
     {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
     {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
     {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
 ]
 pyzmq = [
-    {file = "pyzmq-22.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cde362075ee8f3d2b0353b283e203c2200243b5a15d5c5c03b78112a17e7d4"},
-    {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ff1ea14075bbddd6f29bf6beb8a46d0db779bcec6b9820909584081ec119f8fd"},
-    {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26380487eae4034d6c2a3fb8d0f2dff6dd0d9dd711894e8d25aa2d1938950a33"},
-    {file = "pyzmq-22.0.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3e29f9cf85a40d521d048b55c63f59d6c772ac1c4bf51cdfc23b62a62e377c33"},
-    {file = "pyzmq-22.0.3-cp36-cp36m-win32.whl", hash = "sha256:4f34a173f813b38b83f058e267e30465ed64b22cd0cf6bad21148d3fa718f9bb"},
-    {file = "pyzmq-22.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:30df70f81fe210506aa354d7fd486a39b87d9f7f24c3d3f4f698ec5d96b8c084"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7026f0353977431fc884abd4ac28268894bd1a780ba84bb266d470b0ec26d2ed"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6d4163704201fff0f3ab0cd5d7a0ea1514ecfffd3926d62ec7e740a04d2012c7"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:763c175294d861869f18eb42901d500eda7d3fa4565f160b3b2fd2678ea0ebab"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:61e4bb6cd60caf1abcd796c3f48395e22c5b486eeca6f3a8797975c57d94b03e"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-win32.whl", hash = "sha256:b25e5d339550a850f7e919fe8cb4c8eabe4c917613db48dab3df19bfb9a28969"},
-    {file = "pyzmq-22.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3ef50d74469b03725d781a2a03c57537d86847ccde587130fe35caafea8f75c6"},
-    {file = "pyzmq-22.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60e63577b85055e4cc43892fecd877b86695ee3ef12d5d10a3c5d6e77a7cc1a3"},
-    {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:f5831eff6b125992ec65d973f5151c48003b6754030094723ac4c6e80a97c8c4"},
-    {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9221783dacb419604d5345d0e097bddef4459a9a95322de6c306bf1d9896559f"},
-    {file = "pyzmq-22.0.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b62ea18c0458a65ccd5be90f276f7a5a3f26a6dea0066d948ce2fa896051420f"},
-    {file = "pyzmq-22.0.3-cp38-cp38-win32.whl", hash = "sha256:81e7df0da456206201e226491aa1fc449da85328bf33bbeec2c03bb3a9f18324"},
-    {file = "pyzmq-22.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:f52070871a0fd90a99130babf21f8af192304ec1e995bec2a9533efc21ea4452"},
-    {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c5e29fe4678f97ce429f076a2a049a3d0b2660ada8f2c621e5dc9939426056dd"},
-    {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d18ddc6741b51f3985978f2fda57ddcdae359662d7a6b395bc8ff2292fca14bd"},
-    {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4231943514812dfb74f44eadcf85e8dd8cf302b4d0bce450ce1357cac88dbfdc"},
-    {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:23a74de4b43c05c3044aeba0d1f3970def8f916151a712a3ac1e5cd9c0bc2902"},
-    {file = "pyzmq-22.0.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:532af3e6dddea62d9c49062ece5add998c9823c2419da943cf95589f56737de0"},
-    {file = "pyzmq-22.0.3-cp39-cp39-win32.whl", hash = "sha256:33acd2b9790818b9d00526135acf12790649d8d34b2b04d64558b469c9d86820"},
-    {file = "pyzmq-22.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:a558c5bc89d56d7253187dccc4e81b5bb0eac5ae9511eb4951910a1245d04622"},
-    {file = "pyzmq-22.0.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581787c62eaa0e0db6c5413cedc393ebbadac6ddfd22e1cf9a60da23c4f1a4b2"},
-    {file = "pyzmq-22.0.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:38e3dca75d81bec4f2defa14b0a65b74545812bb519a8e89c8df96bbf4639356"},
-    {file = "pyzmq-22.0.3-pp36-pypy36_pp73-win32.whl", hash = "sha256:2f971431aaebe0a8b54ac018e041c2f0b949a43745444e4dadcc80d0f0ef8457"},
-    {file = "pyzmq-22.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da7d4d4c778c86b60949d17531e60c54ed3726878de8a7f8a6d6e7f8cc8c3205"},
-    {file = "pyzmq-22.0.3-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:13465c1ff969cab328bc92f7015ce3843f6e35f8871ad79d236e4fbc85dbe4cb"},
-    {file = "pyzmq-22.0.3-pp37-pypy37_pp73-win32.whl", hash = "sha256:279cc9b51db48bec2db146f38e336049ac5a59e5f12fb3a8ad864e238c1c62e3"},
-    {file = "pyzmq-22.0.3.tar.gz", hash = "sha256:f7f63ce127980d40f3e6a5fdb87abf17ce1a7c2bd8bf2c7560e1bbce8ab1f92d"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e9b9a2f6944acdaf57316436c1acdcb30b8df76726bcf570ad9342bc5001654"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24fb5bb641f0b2aa25fc3832f4b6fc62430f14a7d328229fe994b2bcdc07c93a"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c4674004ed64685a38bee222cd75afa769424ec603f9329f0dd4777138337f48"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:461ed80d741692d9457ab820b1cc057ba9c37c394e67b647b639f623c8b321f6"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-win32.whl", hash = "sha256:de5806be66c9108e4dcdaced084e8ceae14100aa559e2d57b4f0cceb98c462de"},
+    {file = "pyzmq-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a1c77796f395804d6002ff56a6a8168c1f98579896897ad7e35665a9b4a9eec5"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a81c9e6754465d09a87e3acd74d9bb1f0039b2d785c6899622f0afdb41d760"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0f0f27eaab9ba7b92d73d71c51d1a04464a1da6097a252d007922103253d2313"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b8fb1b3174b56fd020e4b10232b1764e52cf7f3babcfb460c5253bdc48adad0"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fff75af4c7af92dce9f81fa2a83ed009c3e1f33ee8b5222db2ef80b94e242e"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-win32.whl", hash = "sha256:cb9f9fe1305ef69b65794655fd89b2209b11bff3e837de981820a8aa051ef914"},
+    {file = "pyzmq-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bf80b2cec42d96117248b99d3c86e263a00469c840a778e6cb52d916f4fdf82c"},
+    {file = "pyzmq-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0ea7f4237991b0f745a4432c63e888450840bf8cb6c48b93fb7d62864f455529"},
+    {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:12ffcf33db6ba7c0e5aaf901e65517f5e2b719367b80bcbfad692f546a297c7a"},
+    {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d3ecfee2ee8d91ab2e08d2d8e89302c729b244e302bbc39c5b5dde42306ff003"},
+    {file = "pyzmq-22.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:68e2c4505992ab5b89f976f89a9135742b18d60068f761bef994a6805f1cae0c"},
+    {file = "pyzmq-22.1.0-cp38-cp38-win32.whl", hash = "sha256:285514956c08c7830da9d94e01f5414661a987831bd9f95e4d89cc8aaae8da10"},
+    {file = "pyzmq-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5e5be93e1714a59a535bbbc086b9e4fd2448c7547c5288548f6fd86353cad9e"},
+    {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b2f707b52e09098a7770503e39294ca6e22ae5138ffa1dd36248b6436d23d78e"},
+    {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18dd2ca4540c476558099891c129e6f94109971d110b549db2a9775c817cedbd"},
+    {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:c6d0c32532a0519997e1ded767e184ebb8543bdb351f8eff8570bd461e874efc"},
+    {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9ee48413a2d3cd867fd836737b4c89c24cea1150a37f4856d82d20293fa7519f"},
+    {file = "pyzmq-22.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4c4fe69c7dc0d13d4ae180ad650bb900854367f3349d3c16f0569f6c6447f698"},
+    {file = "pyzmq-22.1.0-cp39-cp39-win32.whl", hash = "sha256:fc712a90401bcbf3fa25747f189d6dcfccbecc32712701cad25c6355589dac57"},
+    {file = "pyzmq-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:68be16107f41563b9f67d93dff1c9f5587e0f76aa8fd91dc04c83d813bcdab1f"},
+    {file = "pyzmq-22.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:734ea6565c71fc2d03d5b8c7d0d7519c96bb5567e0396da1b563c24a4ac66f0c"},
+    {file = "pyzmq-22.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:1389b615917d4196962a9b469e947ba862a8ec6f5094a47da5e7a8d404bc07a4"},
+    {file = "pyzmq-22.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:41049cff5265e9cd75606aa2c90a76b9c80b98d8fe70ee08cf4af3cedb113358"},
+    {file = "pyzmq-22.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f49755684a963731479ff3035d45a8185545b4c9f662d368bd349c419839886d"},
+    {file = "pyzmq-22.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6355f81947e1fe6e7bb9e123aeb3067264391d3ebe8402709f824ef8673fa6f3"},
+    {file = "pyzmq-22.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:089b974ec04d663b8685ac90e86bfe0e4da9d911ff3cf52cb765ff22408b102d"},
+    {file = "pyzmq-22.1.0.tar.gz", hash = "sha256:7040d6dd85ea65703904d023d7f57fab793d7ffee9ba9e14f3b897f34ff2415d"},
 ]
 regex = [
     {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"},
@@ -2411,8 +2423,8 @@ retrying = [
     {file = "retrying-1.3.3.tar.gz", hash = "sha256:08c039560a6da2fe4f2c426d0766e284d3b736e355f8dd24b37367b0bb41973b"},
 ]
 "ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.4-py3-none-any.whl", hash = "sha256:ac79fb25f5476e8e9ed1c53b8a2286d2c3f5dde49eb37dbcee5c7eb6a8415a22"},
-    {file = "ruamel.yaml-0.17.4.tar.gz", hash = "sha256:44bc6b54fddd45e4bc0619059196679f9e8b79c027f4131bb072e6a22f4d5e28"},
+    {file = "ruamel.yaml-0.17.7-py3-none-any.whl", hash = "sha256:25c3eaf4f0c52bd15c50c39b100a32168891240f4d2177a4690d5d9b85944bbe"},
+    {file = "ruamel.yaml-0.17.7.tar.gz", hash = "sha256:5c3fa739bbedd2f23769656784e671c6335d17a5bf163c3c3901d8663c0af287"},
 ]
 "ruamel.yaml.clib" = [
     {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"},
@@ -2422,20 +2434,29 @@ retrying = [
     {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"},
     {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"},
     {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"},
+    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1236df55e0f73cd138c0eca074ee086136c3f16a97c2ac719032c050f7e0622f"},
     {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"},
     {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"},
     {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"},
     {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"},
+    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2fd336a5c6415c82e2deb40d08c222087febe0aebe520f4d21910629018ab0f3"},
     {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"},
     {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"},
     {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"},
     {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"},
+    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:75f0ee6839532e52a3a53f80ce64925ed4aed697dd3fa890c4c918f3304bd4f4"},
     {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"},
     {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"},
     {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"},
     {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"},
+    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8be05be57dc5c7b4a0b24edcaa2f7275866d9c907725226cdde46da09367d923"},
     {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"},
     {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"},
+    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"},
+    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"},
+    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1f8c0a4577c0e6c99d208de5c4d3fd8aceed9574bb154d7a2b21c16bb924154c"},
+    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win32.whl", hash = "sha256:46d6d20815064e8bb023ea8628cfb7402c0f0e83de2c2227a88097e239a7dffd"},
+    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6c0a5dc52fc74eb87c67374a4e554d4761fd42a4d01390b7e868b30d21f4b8bb"},
     {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"},
 ]
 scipy = [
@@ -2464,16 +2485,16 @@ send2trash = [
     {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"},
 ]
 six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
 snowballstemmer = [
     {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
     {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
 ]
 sphinx = [
-    {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"},
-    {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"},
+    {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"},
+    {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"},
 ]
 sphinx-rtd-theme = [
     {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"},
@@ -2484,16 +2505,16 @@ sphinxcontrib-applehelp = [
     {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"},
 ]
 sphinxcontrib-bibtex = [
-    {file = "sphinxcontrib-bibtex-2.2.0.tar.gz", hash = "sha256:7500843e154d76983c23bca5ca7380965e0725c46b8f484c1322d0b58a6ce3b2"},
-    {file = "sphinxcontrib_bibtex-2.2.0-py3-none-any.whl", hash = "sha256:f35c1a75826c1b0dd1c680bb144c774630dcf5f78f1501a8c68cdfa8381a4e87"},
+    {file = "sphinxcontrib-bibtex-2.3.0.tar.gz", hash = "sha256:1aae1005935ae8e6499750b4ef1c8251a14ba16e025d0c0154fe2b6bf45defc0"},
+    {file = "sphinxcontrib_bibtex-2.3.0-py3-none-any.whl", hash = "sha256:7a09ab652e04f58c7fb988224a7bb8d5c17c334a4b7bba4ea51c4e661cd1562c"},
 ]
 sphinxcontrib-devhelp = [
     {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
     {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
 ]
 sphinxcontrib-htmlhelp = [
-    {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"},
-    {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"},
+    {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"},
+    {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"},
 ]
 sphinxcontrib-jsmath = [
     {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
@@ -2504,31 +2525,28 @@ sphinxcontrib-qthelp = [
     {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
 ]
 sphinxcontrib-serializinghtml = [
-    {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"},
-    {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
-]
-strictyaml = [
-    {file = "strictyaml-1.4.0.tar.gz", hash = "sha256:9f4e5814f96e17e82044a7dbbb8a0976048f2841b073e8114c2a2c025e7f81b9"},
+    {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
+    {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 tabulate = [
     {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"},
     {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"},
 ]
 terminado = [
-    {file = "terminado-0.9.4-py3-none-any.whl", hash = "sha256:daed77f9fad7b32558fa84b226a76f45a02242c20813502f36c4e1ade6d8f1ad"},
-    {file = "terminado-0.9.4.tar.gz", hash = "sha256:9a7dbcfbc2778830eeb70261bf7aa9d98a3eac8631a3afe3febeb57c12f798be"},
+    {file = "terminado-0.10.0-py3-none-any.whl", hash = "sha256:048ce7b271ad1f94c48130844af1de163e54913b919f8c268c89b36a6d468d7c"},
+    {file = "terminado-0.10.0.tar.gz", hash = "sha256:46fd07c9dc7db7321922270d544a1f18eaa7a02fd6cd4438314f27a687cabbea"},
 ]
 testpath = [
-    {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"},
-    {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"},
+    {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"},
+    {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"},
 ]
 toml = [
     {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
     {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
 ]
 tomlkit = [
-    {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"},
-    {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"},
+    {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"},
+    {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"},
 ]
 tornado = [
     {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
@@ -2610,17 +2628,17 @@ typed-ast = [
     {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
 ]
 typing-extensions = [
-    {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
-    {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"},
-    {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"},
+    {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
+    {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
+    {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
 ]
 urllib3 = [
-    {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"},
-    {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
+    {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"},
+    {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"},
 ]
 virtualenv = [
-    {file = "virtualenv-20.4.3-py2.py3-none-any.whl", hash = "sha256:83f95875d382c7abafe06bd2a4cdd1b363e1bb77e02f155ebe8ac082a916b37c"},
-    {file = "virtualenv-20.4.3.tar.gz", hash = "sha256:49ec4eb4c224c6f7dd81bb6d0a28a09ecae5894f4e593c89b0db0885f565a107"},
+    {file = "virtualenv-20.4.7-py2.py3-none-any.whl", hash = "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76"},
+    {file = "virtualenv-20.4.7.tar.gz", hash = "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467"},
 ]
 wcwidth = [
     {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
@@ -2635,13 +2653,13 @@ widgetsnbextension = [
     {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"},
 ]
 wop = [
-    {file = "wop-1.12.1.tar.gz", hash = "sha256:56b0204661826102d3f4b9a1a5176b651db1a7b150128bc7e2ed4d289f638331"},
+    {file = "wop-1.13.1.tar.gz", hash = "sha256:d5f0ffc3b4490ac59fb3cde4cbbd469f20c9261dfeed5f74925ab69b023a73e6"},
 ]
 wrapt = [
     {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
 ]
 xdsmjs = [
-    {file = "xdsmjs-1.0.0.tar.gz", hash = "sha256:02450fe202d3fddf8408d893488ace76fea62c9a631019dd04b5978197be4ca8"},
+    {file = "xdsmjs-1.0.1.tar.gz", hash = "sha256:982411616e7cfd8ac703fd0af7369bf7c01269d69db2dbbcd65672d227e65e8e"},
 ]
 zipp = [
     {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
diff --git a/pyproject.toml b/pyproject.toml
index 191c17c75..0d71eb6ee 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -59,7 +59,6 @@ lxml = "^4.6.3"
 tomlkit = ">=0.5.3 <1"
 "ruamel.yaml" = ">=0.15.78 <0.18"
 jsonschema = "^3.2.0"
-strictyaml = "^1.1.0"
 ensure = "^1.0.0"
 tabulate = "^0.8.9"
 
diff --git a/src/fastoad/io/configuration/configuration.py b/src/fastoad/io/configuration/configuration.py
index 3dbe62c54..2a9b44066 100644
--- a/src/fastoad/io/configuration/configuration.py
+++ b/src/fastoad/io/configuration/configuration.py
@@ -25,7 +25,7 @@
 import openmdao.api as om
 import tomlkit
 from jsonschema import validate
-from ruamel import yaml
+from ruamel.yaml import YAML
 
 from fastoad._utils.files import make_parent_dir
 from fastoad.io import DataFile, IVariableIOFormatter
@@ -529,12 +529,15 @@ def data(self):
         return self._data
 
     def read(self, file_path: str):
+        yaml = YAML(typ="safe")
         with open(file_path) as yaml_file:
-            self._data = yaml.safe_load(yaml_file.read())
+            self._data = yaml.load(yaml_file)
 
     def write(self, file_path: str):
+        yaml = YAML()
+        yaml.default_flow_style = False
         with open(file_path, "w") as file:
-            yaml.round_trip_dump(self._data, file)
+            yaml.dump(self._data, file)
 
 
 class _IConfigurationModifier(ABC):
diff --git a/src/fastoad/models/performances/mission/mission_definition/mission_builder.py b/src/fastoad/models/performances/mission/mission_definition/mission_builder.py
index 69b621d0d..1ea9b53bc 100644
--- a/src/fastoad/models/performances/mission/mission_definition/mission_builder.py
+++ b/src/fastoad/models/performances/mission/mission_definition/mission_builder.py
@@ -301,8 +301,11 @@ def _identify_inputs(
                 name = struct.get("mission", "") + struct.get("route", "") + struct.get("phase", "")
                 prefix_addition = ":" + name if name else ""
 
-                if isinstance(value, str) and value.startswith("~"):
-                    suffix = key if value == "~" else value[1:]
+                if isinstance(value, str) and value.startswith("~") or value is None:
+                    # "~" alone is interpreted as "null" by the yaml parser
+                    # In that case, the parameter name in the mission file is used as suffix.
+                    # Otherwise, the string after the "~" is used as suffix.
+                    suffix = key if value is None else value[1:]
                     value = prefix + prefix_addition + ":" + suffix
                 if isinstance(value, str) and ":" in value:
                     input_definition[value] = (BASE_UNITS.get(key), "Input defined by the mission.")
diff --git a/src/fastoad/models/performances/mission/mission_definition/resources/__init__.py b/src/fastoad/models/performances/mission/mission_definition/resources/__init__.py
new file mode 100644
index 000000000..385ae0611
--- /dev/null
+++ b/src/fastoad/models/performances/mission/mission_definition/resources/__init__.py
@@ -0,0 +1,12 @@
+#  This file is part of FAST-OAD : A framework for rapid Overall Aircraft Design
+#  Copyright (C) 2021 ONERA & ISAE-SUPAERO
+#  FAST is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/src/fastoad/models/performances/mission/mission_definition/resources/mission_schema.json b/src/fastoad/models/performances/mission/mission_definition/resources/mission_schema.json
new file mode 100644
index 000000000..86446354d
--- /dev/null
+++ b/src/fastoad/models/performances/mission/mission_definition/resources/mission_schema.json
@@ -0,0 +1,376 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "http://example.com/product.schema.json",
+  "title": "FAST-OAD mission files",
+  "description": "Schema for FAST-OAD mission files",
+  "type": "object",
+  "definitions": {
+    "inline_string_value": {
+      "type": [
+        "string",
+        "null"
+      ]
+    },
+    "inline_number_value": {
+      "anyOf": [
+        {
+          "$ref": "#/definitions/inline_string_value"
+        },
+        {
+          "type": "number"
+        }
+      ]
+    },
+    "inline_boolean_value": {
+      "anyOf": [
+        {
+          "$ref": "#/definitions/inline_string_value"
+        },
+        {
+          "type": "boolean"
+        }
+      ]
+    },
+    "string_parameter_value": {
+      "anyOf": [
+        {
+          "$ref": "#/definitions/inline_string_value"
+        },
+        {
+          "type": [
+            "object"
+          ],
+          "properties": {
+            "value": {
+              "$ref": "#/definitions/inline_string_value"
+            }
+          },
+          "required": [
+            "value"
+          ],
+          "additionalProperties": false
+        }
+      ]
+    },
+    "boolean_parameter_value": {
+      "anyOf": [
+        {
+          "$ref": "#/definitions/inline_boolean_value"
+        },
+        {
+          "allOf": [
+            {
+              "$ref": "#/definitions/string_parameter_value"
+            },
+            {
+              "type": [
+                "object"
+              ],
+              "properties": {
+                "value": {
+                  "$ref": "#/definitions/inline_boolean_value"
+                }
+              },
+              "required": [
+                "value"
+              ],
+              "additionalProperties": false
+            }
+          ]
+        }
+      ]
+    },
+    "parameter_value_without_unit": {
+      "anyOf": [
+        {
+          "anyOf": [
+            {
+              "$ref": "#/definitions/inline_number_value"
+            },
+            {
+              "type": [
+                "object"
+              ],
+              "properties": {
+                "value": {
+                  "$ref": "#/definitions/inline_number_value"
+                }
+              },
+              "required": [
+                "value"
+              ],
+              "additionalProperties": false
+            }
+          ]
+        }
+      ]
+    },
+    "parameter_value_with_unit": {
+      "anyOf": [
+        {
+          "anyOf": [
+            {
+              "$ref": "#/definitions/inline_number_value"
+            },
+            {
+              "type": [
+                "object"
+              ],
+              "properties": {
+                "value": {
+                  "$ref": "#/definitions/inline_number_value"
+                },
+                "unit": {
+                  "type": "string"
+                }
+              },
+              "required": [
+                "value"
+              ],
+              "additionalProperties": false
+            }
+          ]
+        }
+      ]
+    },
+    "CL_CD": {
+      "type": [
+        "string",
+        "array"
+      ],
+      "items": {
+        "type": "number"
+      }
+    },
+    "target": {
+      "type": "object",
+      "additionalProperties": {
+        "$ref": "#/definitions/parameter_value_with_unit"
+      }
+    },
+    "polar": {
+      "type": [
+        "string",
+        "object"
+      ],
+      "additionalProperties": false,
+      "required": [
+        "CL",
+        "CD"
+      ],
+      "properties": {
+        "CL": {
+          "$ref": "#/definitions/CL_CD"
+        },
+        "CD": {
+          "$ref": "#/definitions/CL_CD"
+        }
+      }
+    },
+    "base_part": {
+      "type": "object",
+      "properties": {
+        "engine_setting": {
+          "$ref": "#/definitions/string_parameter_value"
+        },
+        "polar": {
+          "$ref": "#/definitions/polar"
+        },
+        "thrust_rate": {
+          "$ref": "#/definitions/parameter_value_without_unit"
+        },
+        "climb_thrust_rate": {
+          "$ref": "#/definitions/parameter_value_without_unit"
+        },
+        "time_step": {
+          "$ref": "#/definitions/parameter_value_with_unit"
+        },
+        "maximum_flight_level": {
+          "$ref": "#/definitions/parameter_value_without_unit"
+        },
+        "mass_ratio": {
+          "$ref": "#/definitions/parameter_value_without_unit"
+        },
+        "reserve_mass_ratio": {
+          "$ref": "#/definitions/parameter_value_without_unit"
+        },
+        "use_max_lift_drag_ratio": {
+          "$ref": "#/definitions/boolean_parameter_value"
+        }
+      }
+    },
+    "segment": {
+      "description": "Specification of a flight segment",
+      "allOf": [
+        {
+          "$ref": "#/definitions/base_part"
+        },
+        {
+          "type": "object",
+          "properties": {
+            "segment": {
+              "type": "string"
+            },
+            "target": {
+              "$ref": "#/definitions/target"
+            }
+          },
+          "required": [
+            "segment"
+          ]
+        }
+      ]
+    },
+    "phase": {
+      "description": "Specification of a flight phase",
+      "allOf": [
+        {
+          "$ref": "#/definitions/base_part"
+        },
+        {
+          "type": "object",
+          "description": "Specification of a flight phase",
+          "properties": {
+            "parts": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/segment"
+              }
+            }
+          },
+          "required": [
+            "parts"
+          ]
+        }
+      ]
+    },
+    "route_parts": {
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "phase": {
+            "type": "string"
+          }
+        },
+        "additionalProperties": false
+      }
+    },
+    "route_cruise_part": {
+      "$ref": "#/definitions/segment"
+    },
+    "route": {
+      "type": "object",
+      "properties": {
+        "range": {
+          "$ref": "#/definitions/parameter_value_with_unit"
+        },
+        "climb_parts": {
+          "description": "Flight phases before cruise",
+          "$ref": "#/definitions/route_parts"
+        },
+        "cruise_part": {
+          "description": "Flight segment for cruise",
+          "$ref": "#/definitions/route_cruise_part"
+        },
+        "descent_parts": {
+          "description": "Flight phases after cruise",
+          "$ref": "#/definitions/route_parts"
+        }
+      },
+      "required": [
+        "range"
+      ],
+      "additionalProperties": false
+    },
+    "mission_phase": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "phase": {
+          "type": "string"
+        }
+      }
+    },
+    "mission_route": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "route": {
+          "type": "string"
+        }
+      }
+    },
+    "mission_reserve": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "reserve": {
+          "type": "object",
+          "properties": {
+            "ref": {
+              "type": "string"
+            },
+            "multiplier": {
+              "type": [
+                "number",
+                "string"
+              ]
+            }
+          }
+        }
+      }
+    },
+    "mission": {
+      "type": "object",
+      "properties": {
+        "parts": {
+          "type": "array",
+          "items": {
+            "oneOf": [
+              {
+                "$ref": "#/definitions/mission_phase"
+              },
+              {
+                "$ref": "#/definitions/mission_route"
+              },
+              {
+                "$ref": "#/definitions/mission_reserve"
+              }
+            ]
+          }
+        }
+      },
+      "required": [
+        "parts"
+      ]
+    }
+  },
+  "properties": {
+    "missions": {
+      "description": "Section where missions are defined.",
+      "type": "object",
+      "additionalProperties": {
+        "$ref": "#/definitions/mission"
+      }
+    },
+    "routes": {
+      "description": "Section where flight routes are defined.",
+      "type": "object",
+      "additionalProperties": {
+        "$ref": "#/definitions/route"
+      }
+    },
+    "phases": {
+      "description": "Section where flight phases are defined.",
+      "additionalProperties": {
+        "$ref": "#/definitions/phase"
+      }
+    }
+  },
+  "required": [
+    "missions",
+    "routes"
+  ],
+  "additionalProperties": false
+}
\ No newline at end of file
diff --git a/src/fastoad/models/performances/mission/mission_definition/schema.py b/src/fastoad/models/performances/mission/mission_definition/schema.py
index a69102d9a..ce6093e89 100644
--- a/src/fastoad/models/performances/mission/mission_definition/schema.py
+++ b/src/fastoad/models/performances/mission/mission_definition/schema.py
@@ -14,29 +14,18 @@
 #  You should have received a copy of the GNU General Public License
 #  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
+import json
 from collections import OrderedDict
-from dataclasses import fields
 from enum import Enum
+from importlib.resources import open_text
 from os import PathLike
 from typing import Set, Union
 
 from ensure import Ensure
-from strictyaml import (
-    Bool,
-    CommaSeparated,
-    Float,
-    Map,
-    MapPattern,
-    Optional,
-    ScalarValidator,
-    Seq,
-    Str,
-    Validator,
-    YAML,
-    load,
-)
+from jsonschema import validate
+from ruamel.yaml import YAML
 
-from fastoad.model_base import FlightPoint
+from . import resources
 from ..segments.altitude_change import AltitudeChangeSegment
 from ..segments.cruise import BreguetCruiseSegment, ClimbAndCruiseSegment, OptimalCruiseSegment
 from ..segments.hold import HoldSegment
@@ -44,6 +33,8 @@
 from ..segments.taxi import TaxiSegment
 from ..segments.transition import DummyTransitionSegment
 
+JSON_SCHEMA_NAME = "mission_schema.json"
+
 # Tags
 SEGMENT_TAG = "segment"
 ROUTE_TAG = "route"
@@ -82,14 +73,20 @@ def load(self, file_path: Union[str, PathLike]):
         :param file_path: path of YAML file to read.
         """
         self.clear()
+        yaml = YAML()
+
         with open(file_path) as yaml_file:
-            content = load(yaml_file.read(), self._get_schema())
+            data = yaml.load(yaml_file)
+
+        with open_text(resources, JSON_SCHEMA_NAME) as json_file:
+            json_schema = json.loads(json_file.read())
+        validate(data, json_schema)
 
-        self._validate(content)
-        self.update(content.data)
+        self._validate(data)
+        self.update(data)
 
     @classmethod
-    def _validate(cls, content: YAML):
+    def _validate(cls, content: dict):
         """
         Does a second pass validation of file content.
 
@@ -136,109 +133,16 @@ def _validate(cls, content: YAML):
                 Ensure(part_type).equals(RESERVE_TAG)
 
     @staticmethod
-    def _process_polar_definition(struct: YAML):
+    def _process_polar_definition(struct: dict):
         """
         If "foo:bar:baz" is provided as value for the "polar" key in provided dictionary, it is
         replaced by the dict {"CL":"foo:bar:baz:CL", "CD":"foo:bar:baz:CD"}
         """
         if POLAR_TAG in struct:
-            polar_def = struct[POLAR_TAG].value
+            polar_def = struct[POLAR_TAG]
             if isinstance(polar_def, str) and ":" in polar_def:
                 struct[POLAR_TAG] = OrderedDict({"CL": polar_def + ":CL", "CD": polar_def + ":CD"})
 
-    @classmethod
-    def _get_schema(cls):
-        """Schema of the whole mission file."""
-        return Map(
-            {
-                PHASE_DEFINITIONS_TAG: MapPattern(Str(), cls._get_phase_schema()),
-                ROUTE_DEFINITIONS_TAG: MapPattern(Str(), cls._get_route_schema()),
-                MISSION_DEFINITION_TAG: MapPattern(Str(), cls._get_mission_schema()),
-            }
-        )
-
-    @classmethod
-    def _get_phase_schema(cls) -> Map:
-        """Schema of the phase section."""
-        phase_map = {Optional(PARTS_TAG, default=None): Seq(cls._get_segment_schema())}
-        phase_map.update(cls._get_base_part_mapping())
-        return Map(phase_map)
-
-    @classmethod
-    def _get_route_schema(cls) -> Map:
-        """Schema of the route section."""
-        return Map(
-            {
-                Optional("range", default=None): cls._get_value_schema(),
-                Optional(CLIMB_PARTS_TAG, default=None): Seq(Map({PHASE_TAG: Str()})),
-                CRUISE_PART_TAG: cls._get_segment_schema(),
-                Optional(DESCENT_PARTS_TAG, default=None): Seq(Map({PHASE_TAG: Str()})),
-            }
-        )
-
-    @classmethod
-    def _get_mission_schema(cls) -> Map:
-        """Schema of the mission section."""
-        return Map(
-            {
-                PARTS_TAG: Seq(
-                    Map(
-                        {
-                            Optional(ROUTE_TAG, default=None): Str(),
-                            Optional(PHASE_TAG, default=None): Str(),
-                            Optional(RESERVE_TAG, default=None): Map(
-                                {"ref": Str(), "multiplier": Float() | Str()}
-                            ),
-                        }
-                    )
-                ),
-            }
-        )
-
-    @classmethod
-    def _get_segment_schema(cls, tag=SEGMENT_TAG) -> Map:
-        """Schema for a segment."""
-        segment_map = {tag: Str()}
-        segment_map.update(cls._get_base_part_mapping())
-        return Map(segment_map)
-
-    @classmethod
-    def _get_value_schema(cls, value_type: ScalarValidator = Float(), has_unit=True) -> Validator:
-        """Schema for parameter value."""
-        map_dict = {"value": Float() | Str()}
-        if has_unit:
-            map_dict[Optional("unit", default=None)] = Str()
-
-        return value_type | Str() | Map(map_dict)
-
-    @classmethod
-    def _get_target_schema(cls) -> Map:
-        """Schema for segment target."""
-        target_schema_map = {}
-        for key in [f.name for f in fields(FlightPoint)]:
-            target_schema_map[Optional(key, default=None)] = cls._get_value_schema()
-        return Map(target_schema_map)
-
-    @classmethod
-    def _get_base_part_mapping(cls) -> dict:
-        """Base mapping for segment/phase schemas."""
-        polar_coeff_schema = CommaSeparated(Float()) | Str()
-        polar_schema = Map({"CL": polar_coeff_schema, "CD": polar_coeff_schema}) | Str()
-        return {
-            # TODO: this mapping covers all possible segments, but some options are relevant
-            #  only for some segments. A better check could be done in second-pass validation.
-            Optional("target", default=None): cls._get_target_schema(),
-            Optional("engine_setting", default=None): cls._get_value_schema(Str(), False),
-            Optional(POLAR_TAG, default=None): polar_schema,
-            Optional("thrust_rate", default=None): cls._get_value_schema(has_unit=False),
-            Optional("climb_thrust_rate", default=None): cls._get_value_schema(has_unit=False),
-            Optional("time_step", default=None): cls._get_value_schema(),
-            Optional("maximum_flight_level", default=None): cls._get_value_schema(has_unit=False),
-            Optional("mass_ratio", default=None): cls._get_value_schema(has_unit=False),
-            Optional("reserve_mass_ratio", default=None): cls._get_value_schema(has_unit=False),
-            Optional("use_max_lift_drag_ratio", default=None): cls._get_value_schema(Bool(), False),
-        }
-
 
 class SegmentNames(Enum):
     """


Test patch:
diff --git a/src/fastoad/io/configuration/tests/test_configuration.py b/src/fastoad/io/configuration/tests/test_configuration.py
index 70e831be0..d18c8638d 100644
--- a/src/fastoad/io/configuration/tests/test_configuration.py
+++ b/src/fastoad/io/configuration/tests/test_configuration.py
@@ -22,7 +22,7 @@
 import pytest
 import tomlkit
 from jsonschema import ValidationError
-from ruamel import yaml
+from ruamel.yaml import YAML
 
 from fastoad.io import DataFile
 from fastoad.io.configuration.configuration import FASTOADProblemConfigurator
@@ -245,7 +245,7 @@ def test_set_optimization_definition(cleanup):
             "objective": [{"name": "f"}],
         }
 
-        read = tomlkit.loads if extension == "toml" else yaml.safe_load
+        read = tomlkit.loads if extension == "toml" else YAML(typ="safe").load
 
         with open(reference_file, "r") as file:
             d = file.read()
diff --git a/src/fastoad/models/performances/mission/mission_definition/tests/data/mission.yml b/src/fastoad/models/performances/mission/mission_definition/tests/data/mission.yml
index 380f98447..21455ae41 100644
--- a/src/fastoad/models/performances/mission/mission_definition/tests/data/mission.yml
+++ b/src/fastoad/models/performances/mission/mission_definition/tests/data/mission.yml
@@ -2,8 +2,8 @@ phases:
   initial_climb:
     engine_setting: takeoff
     polar:
-      CL: 0.0, 0.5, 1.0
-      CD: 0., 0.03, 0.12
+      CL: [ 0.0, 0.5, 1.0 ]
+      CD: [ 0., 0.03, 0.12 ]
     thrust_rate:
       value: 1.0
     parts:
diff --git a/src/fastoad/models/performances/mission/mission_definition/tests/test_schema.py b/src/fastoad/models/performances/mission/mission_definition/tests/test_schema.py
index 0c05b0322..546ff6923 100644
--- a/src/fastoad/models/performances/mission/mission_definition/tests/test_schema.py
+++ b/src/fastoad/models/performances/mission/mission_definition/tests/test_schema.py
@@ -20,569 +20,222 @@
 
 
 def test_schema():
-    d = MissionDefinition(pth.join(DATA_FOLDER_PATH, "mission.yml"))
+    obtained_dict = MissionDefinition(pth.join(DATA_FOLDER_PATH, "mission.yml"))
 
-    assert d == {
-        "missions": OrderedDict(
-            [
-                (
-                    "sizing",
-                    OrderedDict(
-                        [
-                            (
-                                "parts",
-                                [
-                                    OrderedDict([("route", "main")]),
-                                    OrderedDict([("route", "diversion")]),
-                                    OrderedDict([("phase", "holding")]),
-                                    OrderedDict([("phase", "taxi_in")]),
-                                ],
-                            )
-                        ]
-                    ),
-                ),
-                (
-                    "operational",
-                    OrderedDict(
-                        [
-                            (
-                                "parts",
-                                [
-                                    OrderedDict([("phase", "taxi_out")]),
-                                    OrderedDict([("route", "main")]),
-                                    OrderedDict([("phase", "taxi_in")]),
-                                ],
-                            )
-                        ]
-                    ),
-                ),
-            ]
-        ),
-        "phases": OrderedDict(
-            [
-                (
-                    "initial_climb",
-                    OrderedDict(
-                        [
-                            ("engine_setting", "takeoff"),
-                            (
-                                "polar",
-                                OrderedDict([("CL", [0.0, 0.5, 1.0]), ("CD", [0.0, 0.03, 0.12])]),
-                            ),
-                            ("thrust_rate", OrderedDict([("value", 1.0)])),
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 400.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "speed_change"),
-                                            (
-                                                "polar",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "CL",
-                                                            "data:aerodynamics:aircraft:takeoff:CL",
-                                                        ),
-                                                        (
-                                                            "CD",
-                                                            "data:aerodynamics:aircraft:takeoff:CD",
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict(
-                                                                [("value", 250.0), ("unit", "kn")]
-                                                            ),
-                                                        )
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "polar",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "CL",
-                                                            "data:aerodynamics:aircraft:takeoff:CL",
-                                                        ),
-                                                        (
-                                                            "CD",
-                                                            "data:aerodynamics:aircraft:takeoff:CD",
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 1500.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                ],
-                            ),
-                        ]
-                    ),
-                ),
-                (
-                    "climb",
-                    OrderedDict(
-                        [
-                            ("engine_setting", "climb"),
-                            (
-                                "polar",
-                                OrderedDict(
-                                    [
-                                        ("CL", "data:aerodynamics:aircraft:cruise:CL"),
-                                        ("CD", "data:aerodynamics:aircraft:cruise:CD"),
-                                    ]
-                                ),
-                            ),
-                            ("thrust_rate", "data:propulsion:climb:thrust_rate"),
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 10000.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "speed_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict(
-                                                                [("value", 300.0), ("unit", "kn")]
-                                                            ),
-                                                        )
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        ("equivalent_airspeed", "constant"),
-                                                        ("mach", "data:TLAR:cruise_mach"),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        ("mach", "constant"),
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict([("value", -20000.0)]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                ],
-                            ),
-                        ]
-                    ),
-                ),
-                (
-                    "diversion_climb",
-                    OrderedDict(
-                        [
-                            ("engine_setting", "climb"),
-                            (
-                                "polar",
-                                OrderedDict(
-                                    [
-                                        ("CL", "data:aerodynamics:aircraft:cruise:CL"),
-                                        ("CD", "data:aerodynamics:aircraft:cruise:CD"),
-                                    ]
-                                ),
-                            ),
-                            ("thrust_rate", 0.93),
-                            ("time_step", OrderedDict([("value", 5.0), ("unit", "s")])),
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 10000.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        ("equivalent_airspeed", "constant"),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "speed_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict(
-                                                                [("value", 300.0), ("unit", "kn")]
-                                                            ),
-                                                        )
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 22000.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        ("equivalent_airspeed", "constant"),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                ],
-                            ),
-                        ]
-                    ),
-                ),
-                (
-                    "descent",
-                    OrderedDict(
-                        [
-                            ("engine_setting", OrderedDict([("value", "idle")])),
-                            (
-                                "polar",
-                                OrderedDict(
-                                    [
-                                        ("CL", "data:aerodynamics:aircraft:cruise:CL"),
-                                        ("CD", "data:aerodynamics:aircraft:cruise:CD"),
-                                    ]
-                                ),
-                            ),
-                            ("thrust_rate", "data:propulsion:descent:thrust_rate"),
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict(
-                                                                [("value", 300.0), ("unit", "kn")]
-                                                            ),
-                                                        ),
-                                                        (
-                                                            "mach",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "altitude",
-                                                            OrderedDict(
-                                                                [("value", 10000.0), ("unit", "ft")]
-                                                            ),
-                                                        ),
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "speed_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict(
-                                                                [("value", 250.0), ("unit", "kn")]
-                                                            ),
-                                                        )
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                    OrderedDict(
-                                        [
-                                            ("segment", "altitude_change"),
-                                            (
-                                                "target",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "equivalent_airspeed",
-                                                            OrderedDict([("value", "constant")]),
-                                                        ),
-                                                        ("altitude", "~final_altitude"),
-                                                    ]
-                                                ),
-                                            ),
-                                        ]
-                                    ),
-                                ],
-                            ),
-                        ]
-                    ),
-                ),
-                (
-                    "holding",
-                    OrderedDict(
-                        [
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "holding"),
-                                            (
-                                                "polar",
-                                                OrderedDict(
-                                                    [
-                                                        (
-                                                            "CL",
-                                                            "data:aerodynamics:aircraft:cruise:CL",
-                                                        ),
-                                                        (
-                                                            "CD",
-                                                            "data:aerodynamics:aircraft:cruise:CD",
-                                                        ),
-                                                    ]
-                                                ),
-                                            ),
-                                            ("target", OrderedDict([("time", "~duration")])),
-                                        ]
-                                    )
-                                ],
-                            )
-                        ]
-                    ),
-                ),
-                (
-                    "taxi_out",
-                    OrderedDict(
-                        [
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "taxi"),
-                                            ("thrust_rate", "~"),
-                                            ("target", OrderedDict([("time", "~duration")])),
-                                        ]
-                                    )
-                                ],
-                            )
-                        ]
-                    ),
-                ),
-                (
-                    "taxi_in",
-                    OrderedDict(
-                        [
-                            ("thrust_rate", "~"),
-                            (
-                                "parts",
-                                [
-                                    OrderedDict(
-                                        [
-                                            ("segment", "taxi"),
-                                            ("target", OrderedDict([("time", "~duration")])),
-                                        ]
-                                    )
-                                ],
-                            ),
-                        ]
-                    ),
-                ),
-            ]
-        ),
-        "routes": OrderedDict(
-            [
-                (
-                    "main",
-                    OrderedDict(
-                        [
-                            ("range", "~"),
-                            (
-                                "climb_parts",
-                                [
-                                    OrderedDict([("phase", "initial_climb")]),
-                                    OrderedDict([("phase", "climb")]),
-                                ],
-                            ),
-                            (
-                                "cruise_part",
-                                OrderedDict(
-                                    [
-                                        ("segment", "optimal_cruise"),
-                                        ("engine_setting", "cruise"),
-                                        (
-                                            "polar",
-                                            OrderedDict(
-                                                [
-                                                    ("CL", "data:aerodynamics:aircraft:cruise:CL"),
-                                                    ("CD", "data:aerodynamics:aircraft:cruise:CD"),
-                                                ]
-                                            ),
-                                        ),
-                                    ]
-                                ),
-                            ),
-                            ("descent_parts", [OrderedDict([("phase", "descent")])]),
-                        ]
-                    ),
-                ),
-                (
-                    "diversion",
-                    OrderedDict(
-                        [
-                            ("range", "~"),
-                            ("climb_parts", [OrderedDict([("phase", "diversion_climb")])]),
-                            (
-                                "cruise_part",
-                                OrderedDict(
-                                    [
-                                        ("segment", "cruise"),
-                                        ("engine_setting", "cruise"),
-                                        (
-                                            "polar",
-                                            OrderedDict(
-                                                [
-                                                    ("CL", "data:aerodynamics:aircraft:cruise:CL"),
-                                                    ("CD", "data:aerodynamics:aircraft:cruise:CD"),
-                                                ]
-                                            ),
-                                        ),
-                                    ]
-                                ),
-                            ),
-                            ("descent_parts", [OrderedDict([("phase", "descent")])]),
-                        ]
-                    ),
-                ),
-            ]
-        ),
+    # As we use Python 3.7+, Python dictionaries are ordered, but they are still
+    # considered equal when the order of key differs.
+    # To check order, we need to convert both dictionaries to OrderedDict (recursively!)
+    obtained_dict = _to_ordered_dict(obtained_dict)
+    expected_dict = _to_ordered_dict(_get_expected_dict())
+
+    assert obtained_dict == expected_dict
+
+
+def _to_ordered_dict(item):
+    """Returns the item with all dictionaries inside transformed to OrderedDict."""
+    if isinstance(item, dict):
+        ordered_dict = OrderedDict(item)
+        for key, value in ordered_dict.items():
+            ordered_dict[key] = _to_ordered_dict(value)
+        return ordered_dict
+    elif isinstance(item, list):
+        for i, value in enumerate(item):
+            item[i] = _to_ordered_dict(value)
+    else:
+        return item
+
+
+def _get_expected_dict():
+    return {
+        "phases": {
+            "initial_climb": {
+                "engine_setting": "takeoff",
+                "polar": {"CL": [0.0, 0.5, 1.0], "CD": [0.0, 0.03, 0.12]},
+                "thrust_rate": {"value": 1.0},
+                "parts": [
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "altitude": {"value": 400.0, "unit": "ft"},
+                            "equivalent_airspeed": {"value": "constant"},
+                        },
+                    },
+                    {
+                        "segment": "speed_change",
+                        "polar": {
+                            "CL": "data:aerodynamics:aircraft:takeoff:CL",
+                            "CD": "data:aerodynamics:aircraft:takeoff:CD",
+                        },
+                        "target": {"equivalent_airspeed": {"value": 250.0, "unit": "kn"}},
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "polar": {
+                            "CL": "data:aerodynamics:aircraft:takeoff:CL",
+                            "CD": "data:aerodynamics:aircraft:takeoff:CD",
+                        },
+                        "target": {
+                            "altitude": {"value": 1500.0, "unit": "ft"},
+                            "equivalent_airspeed": {"value": "constant"},
+                        },
+                    },
+                ],
+            },
+            "climb": {
+                "engine_setting": "climb",
+                "polar": {
+                    "CL": "data:aerodynamics:aircraft:cruise:CL",
+                    "CD": "data:aerodynamics:aircraft:cruise:CD",
+                },
+                "thrust_rate": "data:propulsion:climb:thrust_rate",
+                "parts": [
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "altitude": {"value": 10000.0, "unit": "ft"},
+                            "equivalent_airspeed": {"value": "constant"},
+                        },
+                    },
+                    {
+                        "segment": "speed_change",
+                        "target": {"equivalent_airspeed": {"value": 300.0, "unit": "kn"}},
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "equivalent_airspeed": "constant",
+                            "mach": "data:TLAR:cruise_mach",
+                        },
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "target": {"mach": "constant", "altitude": {"value": -20000.0}},
+                    },
+                ],
+            },
+            "diversion_climb": {
+                "engine_setting": "climb",
+                "polar": {
+                    "CL": "data:aerodynamics:aircraft:cruise:CL",
+                    "CD": "data:aerodynamics:aircraft:cruise:CD",
+                },
+                "thrust_rate": 0.93,
+                "time_step": {"value": 5.0, "unit": "s"},
+                "parts": [
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "altitude": {"value": 10000.0, "unit": "ft"},
+                            "equivalent_airspeed": "constant",
+                        },
+                    },
+                    {
+                        "segment": "speed_change",
+                        "target": {"equivalent_airspeed": {"value": 300.0, "unit": "kn"}},
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "altitude": {"value": 22000.0, "unit": "ft"},
+                            "equivalent_airspeed": "constant",
+                        },
+                    },
+                ],
+            },
+            "descent": {
+                "engine_setting": {"value": "idle"},
+                "polar": {
+                    "CL": "data:aerodynamics:aircraft:cruise:CL",
+                    "CD": "data:aerodynamics:aircraft:cruise:CD",
+                },
+                "thrust_rate": "data:propulsion:descent:thrust_rate",
+                "parts": [
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "equivalent_airspeed": {"value": 300.0, "unit": "kn"},
+                            "mach": {"value": "constant"},
+                        },
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "altitude": {"value": 10000.0, "unit": "ft"},
+                            "equivalent_airspeed": {"value": "constant"},
+                        },
+                    },
+                    {
+                        "segment": "speed_change",
+                        "target": {"equivalent_airspeed": {"value": 250.0, "unit": "kn"}},
+                    },
+                    {
+                        "segment": "altitude_change",
+                        "target": {
+                            "equivalent_airspeed": {"value": "constant"},
+                            "altitude": "~final_altitude",
+                        },
+                    },
+                ],
+            },
+            "holding": {
+                "parts": [
+                    {
+                        "segment": "holding",
+                        "polar": {
+                            "CL": "data:aerodynamics:aircraft:cruise:CL",
+                            "CD": "data:aerodynamics:aircraft:cruise:CD",
+                        },
+                        "target": {"time": "~duration"},
+                    }
+                ]
+            },
+            "taxi_out": {
+                "parts": [{"segment": "taxi", "thrust_rate": None, "target": {"time": "~duration"}}]
+            },
+            "taxi_in": {
+                "thrust_rate": None,
+                "parts": [{"segment": "taxi", "target": {"time": "~duration"}}],
+            },
+        },
+        "routes": {
+            "main": {
+                "range": None,
+                "climb_parts": [{"phase": "initial_climb"}, {"phase": "climb"}],
+                "cruise_part": {
+                    "segment": "optimal_cruise",
+                    "engine_setting": "cruise",
+                    "polar": {
+                        "CL": "data:aerodynamics:aircraft:cruise:CL",
+                        "CD": "data:aerodynamics:aircraft:cruise:CD",
+                    },
+                },
+                "descent_parts": [{"phase": "descent"}],
+            },
+            "diversion": {
+                "range": None,
+                "climb_parts": [{"phase": "diversion_climb"}],
+                "cruise_part": {
+                    "segment": "cruise",
+                    "engine_setting": "cruise",
+                    "polar": {
+                        "CL": "data:aerodynamics:aircraft:cruise:CL",
+                        "CD": "data:aerodynamics:aircraft:cruise:CD",
+                    },
+                },
+                "descent_parts": [{"phase": "descent"}],
+            },
+        },
+        "missions": {
+            "sizing": {
+                "parts": [
+                    {"route": "main"},
+                    {"route": "diversion"},
+                    {"phase": "holding"},
+                    {"phase": "taxi_in"},
+                ]
+            },
+            "operational": {
+                "parts": [{"phase": "taxi_out"}, {"route": "main"}, {"phase": "taxi_in"}]
+            },
+        },
     }