Repository: microsoft/quantum-viz.js (language: python)

Issue:
Qiskit support
**Is your feature request related to a problem? Please describe.**
It would be nice to have a way to generate qviz's json from a [Qiskit](https://quantumai.google/cirq) QuantumCircuit object.

**Describe the solution you'd like**
Something on the lines of adding a creating a `convert_to_qviz()` method that takes a Qiskit's Circuit object and returns a dictionary/ojbect that can be serialized to the json that qviz supports. For example:
```
import json

from qiskit import QuantumCircuit
from quantum_viz import convert_to_qviz

circuit = QuantumCircuit(2, 2)
circuit.name = "Qiskit Sample - Bell circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0,1], [0, 1])

qviz = convert_to_qviz(circuit)
print(json.dumps(qviz))
```

Write up schema for qviz JSON
It would be helpful to document what the input schema should look like so that users can create their own inputs.

This will also be helpful to create qviz objects from other packages such as Q# and Qiskit.


Discussion / hints:

This can be added to our github wiki: https://github.com/microsoft/quantum-viz.js/wiki
Wrote out the full API schema here: https://github.com/microsoft/quantum-viz.js/wiki/API-schema-reference

Fix patch:
diff --git a/.gitignore b/.gitignore
index 0f4ef85f..a0f6f3e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,6 +76,7 @@ web_modules/
 # dotenv environment variables file
 .env
 .env.test
+.*[v]env/
 
 # parcel-bundler cache (https://parceljs.org/)
 .cache
diff --git a/quantum-viz/README.md b/quantum-viz/README.md
index f8579208..25a41f06 100644
--- a/quantum-viz/README.md
+++ b/quantum-viz/README.md
@@ -48,6 +48,39 @@ widget # Display the widget
 
 ![quantum-viz example](https://user-images.githubusercontent.com/4041805/137230540-b523dc76-29c7-48e2-baa3-34d4ee0a17a1.PNG)
 
+## Qiskit Integration
+
+By installing the optional `[qiskit]` dependency, you can leverage Qiskit's `QuantumCircuit` APIs
+to define the circuit and render it using the `Viewer` widget on Jupyter, for example:
+
+```python
+from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
+from quantum_viz import Viewer
+
+qr = QuantumRegister(3, 'q')
+anc = QuantumRegister(1, 'ancilla')
+cr = ClassicalRegister(3, 'c')
+qc = QuantumCircuit(qr, anc, cr)
+
+
+qc.h(qr[0:3])
+qc.x(anc[0])
+qc.h(anc[0])
+qc.cx(qr[0:3], anc[0])
+qc.h(qr[0:3])
+qc.barrier(qr)
+qc.measure(qr, cr)
+
+Viewer(qc)
+```
+
+Optionally, you can also import the `display` method from `quantum_viz.utils` to render the circuit on a new browser window:
+
+```python
+from quantum_viz.utils import display
+display(qc)
+```
+
 ## Contributing
 
 Check out our [contributing guidelines](./CONTRIBUTING.md) to find out how you can contribute to quantum-viz.
diff --git a/quantum-viz/examples/Qiskit.ipynb b/quantum-viz/examples/Qiskit.ipynb
new file mode 100644
index 00000000..7a8ad6f4
--- /dev/null
+++ b/quantum-viz/examples/Qiskit.ipynb
@@ -0,0 +1,100 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Display a Qiskit circuit\n",
+    "\n",
+    "This sample shows how to visualizes a circuit built using Qiskit using the Viewer widget.\n",
+    "\n",
+    "First, create any Qiskit circuit:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit\n",
+    "\n",
+    "qr = QuantumRegister(3, 'q')\n",
+    "anc = QuantumRegister(1, 'ancilla')\n",
+    "cr = ClassicalRegister(3, 'c')\n",
+    "qc = QuantumCircuit(qr, anc, cr)\n",
+    "\n",
+    "\n",
+    "qc.h(qr[0:3])\n",
+    "qc.x(anc[0])\n",
+    "qc.h(anc[0])\n",
+    "qc.cx(qr[0:3], anc[0])\n",
+    "qc.h(qr[0:3])\n",
+    "qc.barrier(qr)\n",
+    "qc.measure(qr, cr)\n",
+    "\n",
+    "qc.draw()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Then use the `Viewer` to render the circuit on Jupyter:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from quantum_viz import Viewer\n",
+    "\n",
+    "Viewer(qc)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Optionally, you can import the `display` method to render the circuit on a new browser window:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from quantum_viz.utils import display\n",
+    "\n",
+    "display(qc)"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "2c5b1a7a6495a30544972baa96a8850cbe45fafa3dce99d03214c29b73e345ae"
+  },
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.12"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/quantum-viz/examples/display_example.py b/quantum-viz/examples/display_example.py
new file mode 100644
index 00000000..54a6352c
--- /dev/null
+++ b/quantum-viz/examples/display_example.py
@@ -0,0 +1,17 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+##
+# This script shows how to display a Qiskit circuit on a new browser window rendered using the Viewer.
+##
+from qiskit.circuit.random import random_circuit
+from qiskit.circuit.reset import Reset
+from quantum_viz.utils import display
+
+qc = random_circuit(4, 5, measure=False, reset=True, conditional=False)
+qc.barrier()
+qc.rccx(0, 3, 2)
+qc.sxdg(1)
+qc.append(Reset(), [1])
+
+print(qc.draw())
+display(qc, skip_barriers=False, style="BlackAndWhite", version="1.0.2")
diff --git a/quantum-viz/noxfile.py b/quantum-viz/noxfile.py
index 2adc47d9..1f462ce2 100644
--- a/quantum-viz/noxfile.py
+++ b/quantum-viz/noxfile.py
@@ -1,3 +1,5 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
 """Nox sessions."""
 import shutil
 import sys
@@ -19,7 +21,7 @@
     raise SystemExit(dedent(message))
 
 
-package = "quantum_viz"
+package = "quantum-viz"
 python_versions = ["3.9", "3.8", "3.7"]
 nox.needs_version = ">= 2021.6.6"
 nox.options.sessions = (
@@ -140,7 +142,7 @@ def mypy(session: Session) -> None:
 @session(python=python_versions)
 def tests(session: Session) -> None:
     """Run the test suite."""
-    session.install(".")
+    session.install(".[qiskit]")
     session.install("coverage[toml]", "pytest", "pygments")
     try:
         session.run("coverage", "run", "--parallel", "-m", "pytest", *session.posargs)
@@ -165,7 +167,7 @@ def coverage(session: Session) -> None:
 @session(python=python_versions)
 def typeguard(session: Session) -> None:
     """Runtime type checking using Typeguard."""
-    session.install(".")
+    session.install(".[qiskit]")
     session.install("pytest", "typeguard", "pygments")
     session.run("pytest", f"--typeguard-packages={package}", *session.posargs)
 
diff --git a/quantum-viz/poetry.lock b/quantum-viz/poetry.lock
index e03338d8..58f5b619 100644
--- a/quantum-viz/poetry.lock
+++ b/quantum-viz/poetry.lock
@@ -16,7 +16,7 @@ python-versions = "*"
 
 [[package]]
 name = "appnope"
-version = "0.1.2"
+version = "0.1.3"
 description = "Disable App Nap on macOS >= 10.9"
 category = "main"
 optional = false
@@ -57,25 +57,25 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "attrs"
-version = "21.2.0"
+version = "21.4.0"
 description = "Classes Without Boilerplate"
 category = "dev"
 optional = false
 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", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+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", "cloudpickle"]
 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"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
 
 [[package]]
 name = "babel"
-version = "2.9.1"
+version = "2.10.1"
 description = "Internationalization utilities"
 category = "dev"
 optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.6"
 
 [package.dependencies]
 pytz = ">=2015.7"
@@ -88,24 +88,9 @@ category = "main"
 optional = false
 python-versions = "*"
 
-[[package]]
-name = "backports.entry-points-selectable"
-version = "1.1.0"
-description = "Compatibility shim providing selectable entry points for older implementations"
-category = "dev"
-optional = false
-python-versions = ">=2.7"
-
-[package.dependencies]
-importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"]
-
 [[package]]
 name = "bandit"
-version = "1.7.0"
+version = "1.7.1"
 description = "Security oriented static analyser for python code."
 category = "dev"
 optional = false
@@ -115,7 +100,6 @@ python-versions = ">=3.5"
 colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
 GitPython = ">=1.0.1"
 PyYAML = ">=5.3.1"
-six = ">=1.10.0"
 stevedore = ">=1.20.0"
 
 [[package]]
@@ -151,11 +135,11 @@ python-versions = "*"
 
 [[package]]
 name = "certifi"
-version = "2021.10.8"
+version = "2022.5.18.1"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "cfgv"
@@ -167,7 +151,7 @@ python-versions = ">=3.6.1"
 
 [[package]]
 name = "charset-normalizer"
-version = "2.0.7"
+version = "2.0.12"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
 category = "dev"
 optional = false
@@ -178,7 +162,7 @@ unicode_backport = ["unicodedata2"]
 
 [[package]]
 name = "click"
-version = "8.0.3"
+version = "8.0.4"
 description = "Composable command line interface toolkit"
 category = "main"
 optional = false
@@ -196,6 +180,17 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package]]
+name = "contextvars"
+version = "2.4"
+description = "PEP 567 Backport"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+immutables = ">=0.9"
+
 [[package]]
 name = "coverage"
 version = "5.5"
@@ -212,7 +207,7 @@ toml = ["toml"]
 
 [[package]]
 name = "darglint"
-version = "1.8.0"
+version = "1.8.1"
 description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
 category = "dev"
 optional = false
@@ -222,21 +217,32 @@ python-versions = ">=3.6,<4.0"
 name = "dataclasses"
 version = "0.8"
 description = "A backport of the dataclasses module for Python 3.6"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6, <3.7"
 
 [[package]]
 name = "decorator"
-version = "5.1.0"
+version = "5.1.1"
 description = "Decorators for Humans"
 category = "main"
 optional = false
 python-versions = ">=3.5"
 
+[[package]]
+name = "dill"
+version = "0.3.4"
+description = "serialize all of python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*"
+
+[package.extras]
+graph = ["objgraph (>=1.7.2)"]
+
 [[package]]
 name = "distlib"
-version = "0.3.3"
+version = "0.3.4"
 description = "Distribution utilities"
 category = "dev"
 optional = false
@@ -268,7 +274,7 @@ pipenv = ["pipenv"]
 
 [[package]]
 name = "executing"
-version = "0.8.2"
+version = "0.8.3"
 description = "Get the currently executing AST node of a frame, and other information"
 category = "main"
 optional = false
@@ -276,7 +282,7 @@ python-versions = "*"
 
 [[package]]
 name = "filelock"
-version = "3.3.0"
+version = "3.4.1"
 description = "A platform independent file lock."
 category = "dev"
 optional = false
@@ -316,7 +322,7 @@ pycodestyle = "*"
 
 [[package]]
 name = "flake8-bugbear"
-version = "21.9.2"
+version = "21.11.29"
 description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
 category = "dev"
 optional = false
@@ -327,7 +333,7 @@ attrs = ">=19.2.0"
 flake8 = ">=3.0.0"
 
 [package.extras]
-dev = ["coverage", "black", "hypothesis", "hypothesmith"]
+dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"]
 
 [[package]]
 name = "flake8-docstrings"
@@ -354,11 +360,11 @@ flake8 = "*"
 
 [[package]]
 name = "flake8-rst-docstrings"
-version = "0.2.3"
+version = "0.2.5"
 description = "Python docstring reStructuredText (RST) validator"
 category = "dev"
 optional = false
-python-versions = ">=3.3"
+python-versions = ">=3.6"
 
 [package.dependencies]
 flake8 = ">=3.0.0"
@@ -367,14 +373,14 @@ restructuredtext-lint = "*"
 
 [[package]]
 name = "gitdb"
-version = "4.0.7"
+version = "4.0.9"
 description = "Git Object Database"
 category = "dev"
 optional = false
-python-versions = ">=3.4"
+python-versions = ">=3.6"
 
 [package.dependencies]
-smmap = ">=3.0.1,<5"
+smmap = ">=3.0.1,<6"
 
 [[package]]
 name = "gitpython"
@@ -390,14 +396,14 @@ typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\"
 
 [[package]]
 name = "identify"
-version = "2.3.0"
+version = "2.4.4"
 description = "File identification library for Python"
 category = "dev"
 optional = false
 python-versions = ">=3.6.1"
 
 [package.extras]
-license = ["editdistance-s"]
+license = ["ukkonen"]
 
 [[package]]
 name = "idna"
@@ -409,15 +415,29 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "imagesize"
-version = "1.2.0"
+version = "1.3.0"
 description = "Getting image size from png/jpeg/jpeg2000/gif file"
 category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package]]
+name = "immutables"
+version = "0.17"
+description = "Immutable Collections"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""}
+
+[package.extras]
+test = ["flake8 (>=3.8.4,<3.9.0)", "pycodestyle (>=2.6.0,<2.7.0)", "mypy (>=0.910)", "pytest (>=6.2.4,<6.3.0)"]
+
 [[package]]
 name = "importlib-metadata"
-version = "4.8.1"
+version = "4.8.3"
 description = "Read metadata from Python packages"
 category = "main"
 optional = false
@@ -430,11 +450,11 @@ zipp = ">=0.5"
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
 perf = ["ipython"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
 
 [[package]]
 name = "importlib-resources"
-version = "5.2.2"
+version = "5.2.3"
 description = "Read resources from Python packages"
 category = "dev"
 optional = false
@@ -445,7 +465,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
 
 [package.extras]
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"]
 
 [[package]]
 name = "iniconfig"
@@ -511,7 +531,7 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"]
 
 [[package]]
 name = "jinja2"
-version = "3.0.2"
+version = "3.0.3"
 description = "A very fast and expressive template engine."
 category = "dev"
 optional = false
@@ -551,6 +571,18 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "mpmath"
+version = "1.2.1"
+description = "Python library for arbitrary-precision floating-point arithmetic"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+develop = ["pytest (>=4.6)", "pycodestyle", "pytest-cov", "codecov", "wheel"]
+tests = ["pytest (>=4.6)"]
+
 [[package]]
 name = "mypy"
 version = "0.910"
@@ -585,16 +617,24 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package]]
+name = "numpy"
+version = "1.19.5"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
 [[package]]
 name = "packaging"
-version = "21.0"
+version = "21.3"
 description = "Core utilities for Python packages"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-pyparsing = ">=2.0.2"
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
 
 [[package]]
 name = "parso"
@@ -617,9 +657,9 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [[package]]
 name = "pbr"
-version = "5.6.0"
+version = "5.9.0"
 description = "Python Build Reasonableness"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=2.6"
 
@@ -681,9 +721,17 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 dev = ["pre-commit", "tox"]
 testing = ["pytest", "pytest-benchmark"]
 
+[[package]]
+name = "ply"
+version = "3.11"
+description = "Python Lex & Yacc"
+category = "main"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "pre-commit"
-version = "2.15.0"
+version = "2.17.0"
 description = "A framework for managing and maintaining multi-language pre-commit hooks."
 category = "dev"
 optional = false
@@ -693,7 +741,7 @@ python-versions = ">=3.6.1"
 cfgv = ">=2.0.0"
 identify = ">=1.0.0"
 importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
-importlib-resources = {version = "*", markers = "python_version < \"3.7\""}
+importlib-resources = {version = "<5.3", markers = "python_version < \"3.7\""}
 nodeenv = ">=0.11.1"
 pyyaml = ">=5.1"
 toml = "*"
@@ -701,7 +749,7 @@ virtualenv = ">=20.0.8"
 
 [[package]]
 name = "pre-commit-hooks"
-version = "4.0.1"
+version = "4.1.0"
 description = "Some out-of-the-box hooks for pre-commit."
 category = "dev"
 optional = false
@@ -722,6 +770,17 @@ python-versions = ">=3.6.1"
 [package.dependencies]
 wcwidth = "*"
 
+[[package]]
+name = "psutil"
+version = "5.9.0"
+description = "Cross-platform lib for process and system monitoring in Python."
+category = "main"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.extras]
+test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"]
+
 [[package]]
 name = "ptyprocess"
 version = "0.7.0"
@@ -732,7 +791,7 @@ python-versions = "*"
 
 [[package]]
 name = "pure-eval"
-version = "0.2.1"
+version = "0.2.2"
 description = "Safely evaluate AST nodes without side effects"
 category = "main"
 optional = false
@@ -743,11 +802,11 @@ tests = ["pytest"]
 
 [[package]]
 name = "py"
-version = "1.10.0"
+version = "1.11.0"
 description = "library with cross-python path, ini-parsing, io, code, log facilities"
 category = "dev"
 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]]
 name = "pycodestyle"
@@ -781,19 +840,22 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "pygments"
-version = "2.10.0"
+version = "2.12.0"
 description = "Pygments is a syntax highlighting package written in Python."
 category = "main"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [[package]]
 name = "pyparsing"
-version = "2.4.7"
+version = "3.0.7"
 description = "Python parsing module"
 category = "dev"
 optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+python-versions = ">=3.6"
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
 
 [[package]]
 name = "pytest"
@@ -817,9 +879,32 @@ toml = "*"
 [package.extras]
 testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
 
+[[package]]
+name = "python-constraint"
+version = "1.4.0"
+description = "python-constraint is a module implementing support for handling CSPs (Constraint Solving Problems) over finite domain"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+dev = ["check-manifest", "nose"]
+test = ["coverage", "nose"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
 [[package]]
 name = "pytz"
-version = "2021.3"
+version = "2022.1"
 description = "World timezone definitions, modern and historical"
 category = "dev"
 optional = false
@@ -833,13 +918,43 @@ category = "dev"
 optional = false
 python-versions = ">=3.6"
 
+[[package]]
+name = "qiskit-terra"
+version = "0.19.2"
+description = "Software for developing quantum computing programs"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+contextvars = {version = ">=2.4", markers = "python_version < \"3.7\""}
+dataclasses = {version = ">=0.8", markers = "python_version < \"3.7\""}
+dill = ">=0.3"
+numpy = ">=1.17"
+ply = ">=3.10"
+psutil = ">=5"
+python-constraint = ">=1.4"
+python-dateutil = ">=2.8.0"
+retworkx = ">=0.10.1"
+scipy = ">=1.5"
+stevedore = ">=3.0.0"
+symengine = {version = ">=0.8", markers = "platform_machine == \"x86_64\" or platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"amd64\" or platform_machine == \"arm64\""}
+sympy = ">=1.3"
+tweedledum = ">=1.1,<2.0"
+
+[package.extras]
+all = ["matplotlib (>=3.3)", "ipywidgets (>=7.3.0)", "pydot", "pillow (>=4.2.1)", "pylatexenc (>=1.4)", "seaborn (>=0.9.0)", "pygments (>=2.4)", "z3-solver (>=4.7)"]
+bip-mapper = ["cplex", "docplex"]
+crosstalk-pass = ["z3-solver (>=4.7)"]
+visualization = ["matplotlib (>=3.3)", "ipywidgets (>=7.3.0)", "pydot", "pillow (>=4.2.1)", "pylatexenc (>=1.4)", "seaborn (>=0.9.0)", "pygments (>=2.4)"]
+
 [[package]]
 name = "regex"
-version = "2021.10.8"
+version = "2022.4.24"
 description = "Alternative regular expression module, to replace re."
 category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "reorder-python-imports"
@@ -854,7 +969,7 @@ python-versions = ">=3.6.1"
 
 [[package]]
 name = "requests"
-version = "2.26.0"
+version = "2.27.1"
 description = "Python HTTP for Humans."
 category = "dev"
 optional = false
@@ -872,7 +987,7 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
 
 [[package]]
 name = "restructuredtext-lint"
-version = "1.3.2"
+version = "1.4.0"
 description = "reStructuredText linter"
 category = "dev"
 optional = false
@@ -881,16 +996,32 @@ python-versions = "*"
 [package.dependencies]
 docutils = ">=0.11,<1.0"
 
+[[package]]
+name = "retworkx"
+version = "0.11.0"
+description = "A python graph library implemented in Rust"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+numpy = ">=1.16.0"
+
+[package.extras]
+all = ["matplotlib (>=3.0)", "pillow (>=5.4)"]
+graphviz = ["pillow (>=5.4)"]
+mpl = ["matplotlib (>=3.0)"]
+
 [[package]]
 name = "ruamel.yaml"
-version = "0.17.16"
+version = "0.17.21"
 description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
 category = "dev"
 optional = false
 python-versions = ">=3"
 
 [package.dependencies]
-"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""}
+"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}
 
 [package.extras]
 docs = ["ryd"]
@@ -918,6 +1049,17 @@ dparse = ">=0.5.1"
 packaging = "*"
 requests = "*"
 
+[[package]]
+name = "scipy"
+version = "1.5.4"
+description = "SciPy: Scientific Library for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+numpy = ">=1.14.5"
+
 [[package]]
 name = "six"
 version = "1.16.0"
@@ -928,15 +1070,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
 name = "smmap"
-version = "4.0.0"
+version = "5.0.0"
 description = "A pure Python implementation of a sliding window memory map manager"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [[package]]
 name = "snowballstemmer"
-version = "2.1.0"
+version = "2.2.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
 category = "dev"
 optional = false
@@ -944,7 +1086,7 @@ python-versions = "*"
 
 [[package]]
 name = "sphinx"
-version = "4.2.0"
+version = "4.5.0"
 description = "Python documentation generator"
 category = "dev"
 optional = false
@@ -956,6 +1098,7 @@ babel = ">=1.3"
 colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
 docutils = ">=0.14,<0.18"
 imagesize = "*"
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
 Jinja2 = ">=2.3"
 packaging = "*"
 Pygments = ">=2.0"
@@ -970,7 +1113,7 @@ sphinxcontrib-serializinghtml = ">=1.1.5"
 
 [package.extras]
 docs = ["sphinxcontrib-websupport"]
-lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"]
+lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"]
 test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
 
 [[package]]
@@ -991,7 +1134,7 @@ test = ["pytest", "pytest-cov"]
 
 [[package]]
 name = "sphinx-click"
-version = "3.0.1"
+version = "3.1.0"
 description = "Sphinx extension that automatically documents click applications"
 category = "dev"
 optional = false
@@ -1090,9 +1233,9 @@ test = ["pytest"]
 
 [[package]]
 name = "stevedore"
-version = "3.4.0"
+version = "3.5.0"
 description = "Manage dynamic plugins for Python applications"
-category = "dev"
+category = "main"
 optional = false
 python-versions = ">=3.6"
 
@@ -1100,6 +1243,25 @@ python-versions = ">=3.6"
 importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""}
 pbr = ">=2.0.0,<2.1.0 || >2.1.0"
 
+[[package]]
+name = "symengine"
+version = "0.8.1"
+description = "Python library providing wrappers to SymEngine"
+category = "main"
+optional = false
+python-versions = ">=3.6,<4"
+
+[[package]]
+name = "sympy"
+version = "1.9"
+description = "Computer algebra system (CAS) in Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+mpmath = ">=0.19"
+
 [[package]]
 name = "toml"
 version = "0.10.2"
@@ -1132,6 +1294,14 @@ six = "*"
 [package.extras]
 test = ["pytest", "mock"]
 
+[[package]]
+name = "tweedledum"
+version = "1.1.1"
+description = "A library for synthesizing and manipulating quantum circuits"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
 [[package]]
 name = "typed-ast"
 version = "1.4.3"
@@ -1142,7 +1312,7 @@ python-versions = "*"
 
 [[package]]
 name = "typeguard"
-version = "2.13.0"
+version = "2.13.3"
 description = "Run-time type checker for Python"
 category = "dev"
 optional = false
@@ -1154,28 +1324,28 @@ test = ["pytest", "typing-extensions", "mypy"]
 
 [[package]]
 name = "typing-extensions"
-version = "3.10.0.2"
-description = "Backported and Experimental Type Hints for Python 3.5+"
+version = "4.1.1"
+description = "Backported and Experimental Type Hints for Python 3.6+"
 category = "main"
 optional = false
-python-versions = "*"
+python-versions = ">=3.6"
 
 [[package]]
 name = "urllib3"
-version = "1.26.7"
+version = "1.26.9"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
 [package.extras]
-brotli = ["brotlipy (>=0.6.0)"]
+brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "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)"]
 
 [[package]]
 name = "varname"
-version = "0.8.1"
+version = "0.8.3"
 description = "Dark magics about variable names in python."
 category = "main"
 optional = false
@@ -1183,28 +1353,27 @@ python-versions = ">=3.6,<4.0"
 
 [package.dependencies]
 asttokens = ">=2.0.0,<3.0.0"
-executing = "*"
+executing = ">=0.8.3,<0.9.0"
 pure_eval = "<1.0.0"
 
 [[package]]
 name = "virtualenv"
-version = "20.8.1"
+version = "20.14.1"
 description = "Virtual Python Environment builder"
 category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [package.dependencies]
-"backports.entry-points-selectable" = ">=1.0.4"
 distlib = ">=0.3.1,<1"
-filelock = ">=3.0.0,<4"
+filelock = ">=3.2,<4"
 importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
 importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""}
 platformdirs = ">=2,<3"
 six = ">=1.9.0,<2"
 
 [package.extras]
-docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"]
+docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"]
 testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"]
 
 [[package]]
@@ -1247,10 +1416,13 @@ python-versions = ">=3.6"
 docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
 testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
 
+[extras]
+qiskit = ["qiskit-terra"]
+
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.6.1"
-content-hash = "47ce286291f0cabf4bcc2974c500afdfecc590af02ecc59a454ac5f96a71aa3b"
+content-hash = "876209539b7fe614324e55c4b7c7fc1efc2fea3cd7ee41a45e2d6fe42229e65b"
 
 [metadata.files]
 alabaster = [
@@ -1262,8 +1434,8 @@ appdirs = [
     {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
 ]
 appnope = [
-    {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
-    {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
+    {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"},
+    {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"},
 ]
 "aspy.refactor-imports" = [
     {file = "aspy.refactor_imports-2.2.0-py2.py3-none-any.whl", hash = "sha256:7a18039d2e8be6b02b4791ce98891deb46b459b575c52ed35ab818c4eaa0c098"},
@@ -1278,24 +1450,20 @@ atomicwrites = [
     {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
 ]
 attrs = [
-    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
-    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+    {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
+    {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
 ]
 babel = [
-    {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
-    {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
+    {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"},
+    {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"},
 ]
 backcall = [
     {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
     {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
 ]
-"backports.entry-points-selectable" = [
-    {file = "backports.entry_points_selectable-1.1.0-py2.py3-none-any.whl", hash = "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"},
-    {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"},
-]
 bandit = [
-    {file = "bandit-1.7.0-py3-none-any.whl", hash = "sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07"},
-    {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"},
+    {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"},
+    {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"},
 ]
 black = [
     {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"},
@@ -1305,25 +1473,28 @@ cached-property = [
     {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
 ]
 certifi = [
-    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
-    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
+    {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"},
+    {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"},
 ]
 cfgv = [
     {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
     {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
 ]
 charset-normalizer = [
-    {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"},
-    {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"},
+    {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"},
+    {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
 ]
 click = [
-    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
-    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
+    {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"},
+    {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"},
 ]
 colorama = [
     {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
     {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
 ]
+contextvars = [
+    {file = "contextvars-2.4.tar.gz", hash = "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e"},
+]
 coverage = [
     {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
     {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
@@ -1379,20 +1550,24 @@ coverage = [
     {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
 ]
 darglint = [
-    {file = "darglint-1.8.0-py3-none-any.whl", hash = "sha256:ac6797bcc918cd8d8f14c168a4a364f54e1aeb4ced59db58e7e4c6dfec2fe15c"},
-    {file = "darglint-1.8.0.tar.gz", hash = "sha256:aa605ef47817a6d14797d32b390466edab621768ea4ca5cc0f3c54f6d8dcaec8"},
+    {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
+    {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"},
 ]
 dataclasses = [
     {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"},
     {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"},
 ]
 decorator = [
-    {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"},
-    {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"},
+    {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
+    {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
+]
+dill = [
+    {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
+    {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
 ]
 distlib = [
-    {file = "distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31"},
-    {file = "distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05"},
+    {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"},
+    {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
 ]
 docutils = [
     {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
@@ -1403,12 +1578,12 @@ dparse = [
     {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
 ]
 executing = [
-    {file = "executing-0.8.2-py2.py3-none-any.whl", hash = "sha256:32fc6077b103bd19e6494a72682d66d5763cf20a106d5aa7c5ccbea4e47b0df7"},
-    {file = "executing-0.8.2.tar.gz", hash = "sha256:c23bf42e9a7b9b212f185b1b2c3c91feb895963378887bb10e64a2e612ec0023"},
+    {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"},
+    {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"},
 ]
 filelock = [
-    {file = "filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0"},
-    {file = "filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785"},
+    {file = "filelock-3.4.1-py3-none-any.whl", hash = "sha256:a4bc51381e01502a30e9f06dd4fa19a1712eab852b6fb0f84fd7cce0793d8ca3"},
+    {file = "filelock-3.4.1.tar.gz", hash = "sha256:0f12f552b42b5bf60dba233710bf71337d35494fc8bdd4fd6d9f6d082ad45e06"},
 ]
 flake8 = [
     {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"},
@@ -1418,8 +1593,8 @@ flake8-bandit = [
     {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
 ]
 flake8-bugbear = [
-    {file = "flake8-bugbear-21.9.2.tar.gz", hash = "sha256:db9a09893a6c649a197f5350755100bb1dd84f110e60cf532fdfa07e41808ab2"},
-    {file = "flake8_bugbear-21.9.2-py36.py37.py38-none-any.whl", hash = "sha256:4f7eaa6f05b7d7ea4cbbde93f7bcdc5438e79320fa1ec420d860c181af38b769"},
+    {file = "flake8-bugbear-21.11.29.tar.gz", hash = "sha256:8b04cb2fafc6a78e1a9d873bd3988e4282f7959bb6b0d7c1ae648ec09b937a7b"},
+    {file = "flake8_bugbear-21.11.29-py36.py37.py38-none-any.whl", hash = "sha256:179e41ddae5de5e3c20d1f61736feeb234e70958fbb56ab3c28a67739c8e9a82"},
 ]
 flake8-docstrings = [
     {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
@@ -1430,36 +1605,87 @@ flake8-polyfill = [
     {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
 ]
 flake8-rst-docstrings = [
-    {file = "flake8-rst-docstrings-0.2.3.tar.gz", hash = "sha256:3045794e1c8467fba33aaea5c246b8369efc9c44ef8b0b20199bb6df7a4bd47b"},
-    {file = "flake8_rst_docstrings-0.2.3-py3-none-any.whl", hash = "sha256:565bbb391d7e4d0042924102221e9857ad72929cdd305b26501736ec22c1451a"},
+    {file = "flake8-rst-docstrings-0.2.5.tar.gz", hash = "sha256:4fe93f997dea45d9d3c8bd220f12f0b6c359948fb943b5b48021a3f927edd816"},
+    {file = "flake8_rst_docstrings-0.2.5-py3-none-any.whl", hash = "sha256:b99d9041b769b857efe45a448dc8c71b1bb311f9cacbdac5de82f96498105082"},
 ]
 gitdb = [
-    {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"},
-    {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
+    {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
+    {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
 ]
 gitpython = [
     {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"},
     {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"},
 ]
 identify = [
-    {file = "identify-2.3.0-py2.py3-none-any.whl", hash = "sha256:d1e82c83d063571bb88087676f81261a4eae913c492dafde184067c584bc7c05"},
-    {file = "identify-2.3.0.tar.gz", hash = "sha256:fd08c97f23ceee72784081f1ce5125c8f53a02d3f2716dde79a6ab8f1039fea5"},
+    {file = "identify-2.4.4-py2.py3-none-any.whl", hash = "sha256:aa68609c7454dbcaae60a01ff6b8df1de9b39fe6e50b1f6107ec81dcda624aa6"},
+    {file = "identify-2.4.4.tar.gz", hash = "sha256:6b4b5031f69c48bf93a646b90de9b381c6b5f560df4cbe0ed3cf7650ae741e4d"},
 ]
 idna = [
     {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
     {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
 ]
 imagesize = [
-    {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"},
-    {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
+    {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"},
+    {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
+]
+immutables = [
+    {file = "immutables-0.17-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cab10d65a29b2019fffd7a3924f6965a8f785e7bd409641ce36ab2d3335f88c4"},
+    {file = "immutables-0.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f73088c9b8595ddfd45a5658f8cce0cb3ae6e5890458381fccba3ed3035081d4"},
+    {file = "immutables-0.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef632832fa1acae6861d83572b866126f9e35706ab6e581ce6b175b3e0b7a3c4"},
+    {file = "immutables-0.17-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0efdcec7b63859b41f794ffa0cd0d6dc87e77d1be4ff0ec23471a3a1e719235f"},
+    {file = "immutables-0.17-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eca96f12bc1535657d24eae2c69816d0b22c4a4bc7f4753115e028a137e8dad"},
+    {file = "immutables-0.17-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:01a25b1056754aa486afea5471ca348410d77f458477ccb6fa3baf2d3e3ff3d5"},
+    {file = "immutables-0.17-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c41a6648f7355f1241da677c418edae56fdc45af19ad3540ca8a1e7a81606a7a"},
+    {file = "immutables-0.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0b578bba11bd8ae55dee9536edf8d82be18463d15d4b4c9827e27eeeb73826bf"},
+    {file = "immutables-0.17-cp310-cp310-win32.whl", hash = "sha256:a28682e115191e909673aedb9ccea3377da3a6a929f8bd86982a2a76bdfa89db"},
+    {file = "immutables-0.17-cp310-cp310-win_amd64.whl", hash = "sha256:293ddb681502945f29b3065e688a962e191e752320040892316b9dd1e3b9c8c9"},
+    {file = "immutables-0.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ec04fc7d9f76f26d82a5d9d1715df0409d0096309828fc46cd1a2067c7fbab95"},
+    {file = "immutables-0.17-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f024f25e9fda42251a2b2167668ca70678c19fb3ab6ed509cef0b4b431d0ff73"},
+    {file = "immutables-0.17-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b02083b2052cc201ac5cbd38f34a5da21fcd51016cb4ddd1fb43d7dc113eac17"},
+    {file = "immutables-0.17-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea32db31afb82d8369e98f85c5b815ff81610a12fbc837830a34388f1b56f080"},
+    {file = "immutables-0.17-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:898a9472d1dd3d17f291114395a1be65be035355fc65af0b2c88238f8fbeaa62"},
+    {file = "immutables-0.17-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:736dd3d88d44da0ee48804792bd095c01a344c5d1b0f10beeb9ccb3a00b9c19d"},
+    {file = "immutables-0.17-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:15ff4139720f79b902f435a25e3c00f9c8adcc41d79bed64b7e51ae36cfe9620"},
+    {file = "immutables-0.17-cp36-cp36m-win32.whl", hash = "sha256:4f018a6c4c3689b82f763ad4f84dec6aa91c83981db7f6bafef963f036e5e815"},
+    {file = "immutables-0.17-cp36-cp36m-win_amd64.whl", hash = "sha256:d7400a6753b292ac80102ed026efa8da2c3fedd50c443924cbe9b6448d3b19e4"},
+    {file = "immutables-0.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f7a6e0380bddb99c46bb3f12ae5eee9a23d6a66d99bbf0fb10fa552f935c2e8d"},
+    {file = "immutables-0.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7696c42d1f9a16ecda0ee46229848df8706973690b45e8a090d995d647a5ec57"},
+    {file = "immutables-0.17-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:892b6a1619cd8c398fa70302c4cfa9768a694377639330e7a58cc7be111ab23e"},
+    {file = "immutables-0.17-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89093d5a85357250b1d5ae218fdcfdbac4097cbb2d8b55004aa7a2ca2a00a09f"},
+    {file = "immutables-0.17-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99a8bc6d0623300eb46beea74f7a5061968fb3efc4e072f23f6c0b21c588238d"},
+    {file = "immutables-0.17-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:00380474f8e3b4a2eeb06ce694e0e3cb85a144919140a2b3116defb6c1587471"},
+    {file = "immutables-0.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:078e3ed63be0ac36523b80bbabbfb1bb57e55009f4efb5650b0e3b3ed569c3f1"},
+    {file = "immutables-0.17-cp37-cp37m-win32.whl", hash = "sha256:14905aecc62b318d86045dcf8d35ef2063803d9d331aeccd88958f03caadc7b0"},
+    {file = "immutables-0.17-cp37-cp37m-win_amd64.whl", hash = "sha256:3774d403d1570105a1da2e00c38ce3f04065fd1deff04cf998f8d8e946d0ae13"},
+    {file = "immutables-0.17-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5a9caee1b99eccf1447056ae6bda77edd15c357421293e81fa1a4f28e83448a"},
+    {file = "immutables-0.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fed1e1baf1de1bc94a0310da29814892064928d7d40ff5a3b86bcd11d5e7cfff"},
+    {file = "immutables-0.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7daa340d76747ba5a8f64816b48def74bd4be45a9508073b34fa954d099fba"},
+    {file = "immutables-0.17-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4644c29fe07fb92ba84b26659708e1799fecaaf781214adf13edd8a4d7495a9"},
+    {file = "immutables-0.17-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e9ea0e2a31db44fb01617ff875d4c26f962696e1c5ff11ed7767c2d8dedac4"},
+    {file = "immutables-0.17-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:64100dfdb29fae2bc84748fff5d66dd6b3997806c717eeb75f7099aeee9b1878"},
+    {file = "immutables-0.17-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5f933e5bf6f2c1afb24bc2fc8bea8b132096a4a6ba54f36be59787981f3e50ff"},
+    {file = "immutables-0.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9508a087a47f9f9506adf2fa8383ab14c46a222b57eea8612bc4c2aa9a9550fe"},
+    {file = "immutables-0.17-cp38-cp38-win32.whl", hash = "sha256:dfd2c63f15d1e5ea1ed2a05b7c602b5f61a64337415d299df20e103a57ae4906"},
+    {file = "immutables-0.17-cp38-cp38-win_amd64.whl", hash = "sha256:301c539660c988c5b24051ccad1e36c040a916f1e58fa3e245e3122fc50dd28d"},
+    {file = "immutables-0.17-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:563bc2ddbe75c10faa3b4b0206870653b44a231b97ed23cff8ab8aff503d922d"},
+    {file = "immutables-0.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f621ea6130393cd14d0fbd35b306d4dc70bcd0fda550a8cd313db8015e34ca60"},
+    {file = "immutables-0.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57c2d1b16b716bca70345db334dd6a861bf45c46cb11bb1801277f8a9012e864"},
+    {file = "immutables-0.17-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a08e1a80bd8c5df72c2bf0af24a37ceec17e8ffdb850ed5a62d0bba1d4d86018"},
+    {file = "immutables-0.17-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b99155ad112149d43208c611c6c42f19e16716526dacc0fcc16736d2f5d2e20"},
+    {file = "immutables-0.17-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ed71e736f8fb82545d00c8969dbc167547c15e85729058edbed3c03b94fca86c"},
+    {file = "immutables-0.17-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:19e4b8e5810dd7cab63fa700373f787a369d992166eabc23f4b962e5704d33c5"},
+    {file = "immutables-0.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:305062012497d4c4a70fe35e20cef2c6f65744e721b04671092a63354799988d"},
+    {file = "immutables-0.17-cp39-cp39-win32.whl", hash = "sha256:f5c6bd012384a8d6af7bb25675719214d76640fe6c336e2b5fba9eef1407ae6a"},
+    {file = "immutables-0.17-cp39-cp39-win_amd64.whl", hash = "sha256:615ab26873a794559ccaf4e0e9afdb5aefad0867c15262ba64a55a12a5a41573"},
+    {file = "immutables-0.17.tar.gz", hash = "sha256:ad894446355b6f5289a9c84fb46f7c47c6ef2b1bfbdd2be6cb177dbb7f1587ad"},
 ]
 importlib-metadata = [
-    {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"},
-    {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"},
+    {file = "importlib_metadata-4.8.3-py3-none-any.whl", hash = "sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e"},
+    {file = "importlib_metadata-4.8.3.tar.gz", hash = "sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668"},
 ]
 importlib-resources = [
-    {file = "importlib_resources-5.2.2-py3-none-any.whl", hash = "sha256:2480d8e07d1890056cb53c96e3de44fead9c62f2ba949b0f2e4c4345f4afa977"},
-    {file = "importlib_resources-5.2.2.tar.gz", hash = "sha256:a65882a4d0fe5fbf702273456ba2ce74fe44892c25e42e057aca526b702a6d4b"},
+    {file = "importlib_resources-5.2.3-py3-none-any.whl", hash = "sha256:ae35ed1cfe8c0d6c1a53ecd168167f01fa93b893d51a62cdf23aea044c67211b"},
+    {file = "importlib_resources-5.2.3.tar.gz", hash = "sha256:203d70dda34cfbfbb42324a8d4211196e7d3e858de21a5eb68c6d1cdd99e4e98"},
 ]
 iniconfig = [
     {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
@@ -1478,8 +1704,8 @@ jedi = [
     {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"},
 ]
 jinja2 = [
-    {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"},
-    {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"},
+    {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
+    {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
 ]
 livereload = [
     {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"},
@@ -1559,6 +1785,10 @@ mccabe = [
     {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
     {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
 ]
+mpmath = [
+    {file = "mpmath-1.2.1-py3-none-any.whl", hash = "sha256:604bc21bd22d2322a177c73bdb573994ef76e62edd595d17e00aff24b0667e5c"},
+    {file = "mpmath-1.2.1.tar.gz", hash = "sha256:79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a"},
+]
 mypy = [
     {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
     {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
@@ -1592,9 +1822,45 @@ nodeenv = [
     {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"},
     {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"},
 ]
+numpy = [
+    {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d"},
+    {file = "numpy-1.19.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76"},
+    {file = "numpy-1.19.5-cp36-cp36m-win32.whl", hash = "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a"},
+    {file = "numpy-1.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827"},
+    {file = "numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d"},
+    {file = "numpy-1.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28"},
+    {file = "numpy-1.19.5-cp37-cp37m-win32.whl", hash = "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7"},
+    {file = "numpy-1.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d"},
+    {file = "numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c"},
+    {file = "numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc"},
+    {file = "numpy-1.19.5-cp38-cp38-win32.whl", hash = "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2"},
+    {file = "numpy-1.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa"},
+    {file = "numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb"},
+    {file = "numpy-1.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60"},
+    {file = "numpy-1.19.5-cp39-cp39-win32.whl", hash = "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e"},
+    {file = "numpy-1.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e"},
+    {file = "numpy-1.19.5-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73"},
+    {file = "numpy-1.19.5.zip", hash = "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4"},
+]
 packaging = [
-    {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
-    {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
+    {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+    {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
 ]
 parso = [
     {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"},
@@ -1605,8 +1871,8 @@ pathspec = [
     {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
 ]
 pbr = [
-    {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"},
-    {file = "pbr-5.6.0.tar.gz", hash = "sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd"},
+    {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"},
+    {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"},
 ]
 pep8-naming = [
     {file = "pep8-naming-0.12.1.tar.gz", hash = "sha256:bb2455947757d162aa4cad55dba4ce029005cd1692f2899a21d51d8630ca7841"},
@@ -1628,29 +1894,67 @@ pluggy = [
     {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
     {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
 ]
+ply = [
+    {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"},
+    {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"},
+]
 pre-commit = [
-    {file = "pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6"},
-    {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"},
+    {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"},
+    {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"},
 ]
 pre-commit-hooks = [
-    {file = "pre_commit_hooks-4.0.1-py2.py3-none-any.whl", hash = "sha256:6efe92c7613c311abc7dd06817fc016f222d9289fe24b261e64412b0af96c662"},
-    {file = "pre_commit_hooks-4.0.1.tar.gz", hash = "sha256:99f1b9fc00a82e6588990b6b92edcdf4bec9c3d65c6272b8867be389055ce05e"},
+    {file = "pre_commit_hooks-4.1.0-py2.py3-none-any.whl", hash = "sha256:ba95316b79038e56ce998cdacb1ce922831ac0e41744c77bcc2b9677bf183206"},
+    {file = "pre_commit_hooks-4.1.0.tar.gz", hash = "sha256:b6361865d1877c5da5ac3a944aab19ce6bd749a534d2ede28e683d07194a57e1"},
 ]
 prompt-toolkit = [
     {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"},
     {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"},
 ]
+psutil = [
+    {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"},
+    {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"},
+    {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"},
+    {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"},
+    {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"},
+    {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"},
+    {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"},
+    {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"},
+    {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"},
+    {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"},
+    {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"},
+    {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"},
+    {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"},
+    {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"},
+    {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"},
+    {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"},
+    {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"},
+    {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"},
+    {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"},
+    {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"},
+    {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"},
+    {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"},
+    {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"},
+    {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"},
+    {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"},
+    {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"},
+    {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"},
+    {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"},
+    {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"},
+    {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"},
+    {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"},
+    {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"},
+]
 ptyprocess = [
     {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
     {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
 ]
 pure-eval = [
-    {file = "pure_eval-0.2.1-py3-none-any.whl", hash = "sha256:94eeb505a88721bec7bb21a4ac49758b8b1a01530da1a70d4ffc1d9937689d71"},
-    {file = "pure_eval-0.2.1.tar.gz", hash = "sha256:0f04483b16c9429532d2c0ddc96e2b3bb6b2dc37a2bfb0e986248dbfd0b78873"},
+    {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"},
+    {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"},
 ]
 py = [
-    {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
-    {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
+    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
 ]
 pycodestyle = [
     {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"},
@@ -1665,20 +1969,27 @@ pyflakes = [
     {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"},
 ]
 pygments = [
-    {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
-    {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
+    {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"},
+    {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"},
 ]
 pyparsing = [
-    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
-    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
+    {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"},
+    {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"},
 ]
 pytest = [
     {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
     {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
 ]
+python-constraint = [
+    {file = "python-constraint-1.4.0.tar.bz2", hash = "sha256:501d6f17afe0032dfc6ea6c0f8acc12e44f992733f00e8538961031ef27ccb8e"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
 pytz = [
-    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
-    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+    {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
+    {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"},
 ]
 pyyaml = [
     {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
@@ -1715,75 +2026,183 @@ pyyaml = [
     {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
     {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
 ]
+qiskit-terra = [
+    {file = "qiskit-terra-0.19.2.tar.gz", hash = "sha256:01eb6040c7eefa5c16426d9ad37108581849b2832967f31ec303030c579835ea"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3363c3513f71b5c6f3084c7742682761ede86c935aff3ff2a62f0ff1bcf1e5b2"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:728d337b90ea876272ee838b1b521041aa47f9839a38e27f385e2602be149ba0"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759303a23a599c92cdb08c8d36e5351dac2e4fa4e31df09dc82a9c258934342c"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1d6153a752d3a3ebf2edd65a074bfd3b00e7e58147a2b75e2f7b744ab126e43"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a58637ce72923329cd08bcab60e311323926d0b258f93d64c7213561df12043a"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-win32.whl", hash = "sha256:2f72c3dfd06a74e0cf05d90711e065357989f3f9e9961e34465f3f0d51565bf3"},
+    {file = "qiskit_terra-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:5fd736a4d2706a9e6c0c47fbfda1188215409a43dfcaf50d682e53dc8fae1ded"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:90c5991f0a55449765e5fff381f55862b58aa2a3d556a838040549da616751b7"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:15ec27dc00e0cfc26f194107e11060b74dd167c3176deaf209f5a01c7c1d1164"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e5ab927706bd69e9d679906f62a7e1db68d84b38c095a986fb5d24d64dfc5f37"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37543d9cd1cc2f8bf4a1591369ac06504ba32def7849dc1e1d442749ec7b16f6"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-win32.whl", hash = "sha256:2d7d0cbebd4a95439a9a88021216b8275e77b87d7647ecfd6d6c17e38a2ba41b"},
+    {file = "qiskit_terra-0.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0bfba5d3821f91048c363748e06e148837f7f0406f732c2b8062b39cfcc25e5f"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9ab769700a80ac8b317975994929b6c7d66c0fded340575ef25164816c4e07e2"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1672cd996d3fa9422389b9ee690f21c3abef7a276d7dd391c18909d1aedf4711"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14fc839af92635621c3b12194ce47573a3053a80067cdf624387bfca6b867274"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f5741d97c6e90280106cf10eecabf9734b57bd9c94a751e2717670aab13fb6e"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:50cb690a6946d656a3229f12132b4756b967fb782bab50e88ceacb279d119cd8"},
+    {file = "qiskit_terra-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6c5c46e3e7ea4d8b77fa1261931d46cf10e4a07addf5a8d29167eeaa531bb2ac"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:663ea20429cc2c6e85432a1f2b1b6b27a408b6182a90ad92b2634e51187cae95"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69b2abf65829c18bb05889d7f62595968aff51a2fd0e387f27cacb761c795ba3"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff04aabeabec20d971906cb1725ffb161923bab1604ef98dc53698dfbdd7f3d6"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:573b1cf27ccb28bcfa49e23c2cd84590d7a830294355f86656012243950606c2"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e0916e1aa97e543d6605886f2efde7dfef1228d5a4054887ca656603598c815"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-win32.whl", hash = "sha256:7a73ed32b5c79c22b70de1e208020afa49eb381d2478078b40a28f8f4c0b3fbb"},
+    {file = "qiskit_terra-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:2f13199fca9c6422ba3a8ae8a57be51f9d165ef969db4b7c44b29a6bb9e9b68b"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:902acbc61be8efda999a31130f0e95139c2a57c88e16ce9b7cb4ca08ef05738a"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0905fb51e7acedd7457a349d06109157f3daf27000046d005b27d7ff2960bd32"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bcc5689d4e086c6c252e62527c0acf46a00254004d1471c0fb09939db9ccae68"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:184566e1eea2bac977a2f75ec7abd4de6ee5f768571a7f743a89a26853179382"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc73893d1e18efe2d02aabdfe7a174a58a6ec7ed87b0f16c38c348702b7828cc"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-win32.whl", hash = "sha256:aa679d0991e821bc634482ac9f1c936c4ef525334cf2de5613a03ef7cfc8ab26"},
+    {file = "qiskit_terra-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:a190256d0676fd4ee4261ac24a93b8fef87625c577f8758039742be1a7e95eda"},
+]
 regex = [
-    {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:094a905e87a4171508c2a0e10217795f83c636ccc05ddf86e7272c26e14056ae"},
-    {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"},
-    {file = "regex-2021.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b0f2f874c6a157c91708ac352470cb3bef8e8814f5325e3c5c7a0533064c6a24"},
-    {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"},
-    {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"},
-    {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"},
-    {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"},
-    {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"},
-    {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"},
-    {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"},
-    {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"},
-    {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"},
-    {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"},
-    {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"},
-    {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"},
-    {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"},
-    {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"},
-    {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"},
-    {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"},
-    {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"},
-    {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"},
-    {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"},
-    {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"},
-    {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"},
-    {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"},
-    {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"},
-    {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19b8f6d23b2dc93e8e1e7e288d3010e58fafed323474cf7f27ab9451635136d9"},
-    {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"},
-    {file = "regex-2021.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:951be934dc25d8779d92b530e922de44dda3c82a509cdb5d619f3a0b1491fafa"},
-    {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"},
-    {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"},
-    {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"},
-    {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"},
-    {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"},
-    {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"},
-    {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"},
-    {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6dcf53d35850ce938b4f044a43b33015ebde292840cef3af2c8eb4c860730fff"},
-    {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"},
-    {file = "regex-2021.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2ec1c106d3f754444abf63b31e5c4f9b5d272272a491fa4320475aba9e8157c"},
-    {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"},
-    {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"},
-    {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"},
-    {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"},
-    {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"},
-    {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"},
-    {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"},
-    {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"},
+    {file = "regex-2022.4.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f86aef546add4ff1202e1f31e9bb54f9268f17d996b2428877283146bf9bc013"},
+    {file = "regex-2022.4.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e944268445b5694f5d41292c9228f0ca46d5a32a67f195d5f8547c1f1d91f4bc"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8da3145f4b72f7ce6181c804eaa44cdcea313c8998cdade3d9e20a8717a9cb"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fd464e547dbabf4652ca5fe9d88d75ec30182981e737c07b3410235a44b9939"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:071bcb625e890f28b7c4573124a6512ea65107152b1d3ca101ce33a52dad4593"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c2de7f32fa87d04d40f54bce3843af430697aba51c3a114aa62837a0772f219"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a07e8366115069f26822c47732122ab61598830a69f5629a37ea8881487c107"},
+    {file = "regex-2022.4.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d1c1fbe69eba3ee253c107e71749cdbb4776db93d674bc0d5e28f30300734"},
+    {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:af1e687ffab18a75409e5e5d6215b6ccd41a5a1a0ea6ce9665e01253f737a0d3"},
+    {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:165cc75cfa5aa0f12adb2ac6286330e7229a06dc0e6c004ec35da682b5b89579"},
+    {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3e35c50b27f36176c792738cb9b858523053bc495044d2c2b44db24376b266f1"},
+    {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:43ee0df35925ae4b0cc6ee3f60b73369e559dd2ac40945044da9394dd9d3a51d"},
+    {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58521abdab76583bd41ef47e5e2ddd93b32501aee4ee8cee71dee10a45ba46b1"},
+    {file = "regex-2022.4.24-cp310-cp310-win32.whl", hash = "sha256:275afc7352982ee947fc88f67a034b52c78395977b5fc7c9be15f7dc95b76f06"},
+    {file = "regex-2022.4.24-cp310-cp310-win_amd64.whl", hash = "sha256:253f858a0255cd91a0424a4b15c2eedb12f20274f85731b0d861c8137e843065"},
+    {file = "regex-2022.4.24-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:85b7ee4d0c7a46296d884f6b489af8b960c4291d76aea4b22fd4fbe05e6ec08e"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0da7ef160d4f3eb3d4d3e39a02c3c42f7dbcfce62c81f784cc99fc7059765f"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f2e2cef324ca9355049ee1e712f68e2e92716eba24275e6767b9bfa15f1f478"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6165e737acb3bea3271372e8aa5ebe7226c8a8e8da1b94af2d6547c5a09d689d"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f6bd8178cce5bb56336722d5569d19c50bba5915a69a2050c497fb921e7cb0f"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45b761406777a681db0c24686178532134c937d24448d9e085279b69e9eb7da4"},
+    {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dfbadb7b74d95f72f9f9dbf9778f7de92722ab520a109ceaf7927461fa85b10"},
+    {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9913bcf730eb6e9b441fb176832eea9acbebab6035542c7c89d90c803f5cd3be"},
+    {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:68aed3fb0c61296bd6d234f558f78c51671f79ccb069cbcd428c2eea6fee7a5b"},
+    {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8e7d33f93cdd01868327d834d0f5bb029241cd293b47d51b96814dec27fc9b4b"},
+    {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:82b7fc67e49fdce671bdbec1127189fc979badf062ce6e79dc95ef5e07a8bf92"},
+    {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c36906a7855ec33a9083608e6cd595e4729dab18aeb9aad0dd0b039240266239"},
+    {file = "regex-2022.4.24-cp36-cp36m-win32.whl", hash = "sha256:b2df3ede85d778c949d9bd2a50237072cee3df0a423c91f5514f78f8035bde87"},
+    {file = "regex-2022.4.24-cp36-cp36m-win_amd64.whl", hash = "sha256:dffd9114ade73137ab2b79a8faf864683dbd2dbbb6b23a305fbbd4cbaeeb2187"},
+    {file = "regex-2022.4.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a0ef57cccd8089b4249eebad95065390e56c04d4a92c51316eab4131bca96a9"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12af15b6edb00e425f713160cfd361126e624ec0de86e74f7cad4b97b7f169b3"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f271d0831d8ebc56e17b37f9fa1824b0379221d1238ae77c18a6e8c47f1fdce"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37903d5ca11fa47577e8952d2e2c6de28553b11c70defee827afb941ab2c6729"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b747cef8e5dcdaf394192d43a0c02f5825aeb0ecd3d43e63ae500332ab830b0"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:582ea06079a03750b5f71e20a87cd99e646d796638b5894ff85987ebf5e04924"},
+    {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6daa189db9104787ff1fd7a7623ce017077aa59eaac609d0d25ba95ed251a0"},
+    {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7dbc96419ef0fb6ac56626014e6d3a345aeb8b17a3df8830235a88626ffc8d84"},
+    {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0fb6cb16518ac7eff29d1e0b0cce90275dfae0f17154165491058c31d58bdd1d"},
+    {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bea61de0c688198e3d9479344228c7accaa22a78b58ec408e41750ebafee6c08"},
+    {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:46cbc5b23f85e94161b093dba1b49035697cf44c7db3c930adabfc0e6d861b95"},
+    {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:50b77622016f03989cd06ecf6b602c7a6b4ed2e3ce04133876b041d109c934ee"},
+    {file = "regex-2022.4.24-cp37-cp37m-win32.whl", hash = "sha256:2bde99f2cdfd6db1ec7e02d68cadd384ffe7413831373ea7cc68c5415a0cb577"},
+    {file = "regex-2022.4.24-cp37-cp37m-win_amd64.whl", hash = "sha256:66fb765b2173d90389384708e3e1d3e4be1148bd8d4d50476b1469da5a2f0229"},
+    {file = "regex-2022.4.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:709396c0c95b95045fac89b94f997410ff39b81a09863fe21002f390d48cc7d3"},
+    {file = "regex-2022.4.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a608022f4593fc67518c6c599ae5abdb03bb8acd75993c82cd7a4c8100eff81"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb7107faf0168de087f62a2f2ed00f9e9da12e0b801582b516ddac236b871cda"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aabc28f7599f781ddaeac168d0b566d0db82182cc3dcf62129f0a4fc2927b811"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92ad03f928675ca05b79d3b1d3dfc149e2226d57ed9d57808f82105d511d0212"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ba3c304a4a5d8112dbd30df8b3e4ef59b4b07807957d3c410d9713abaee9a8"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2acf5c66fbb62b5fe4c40978ddebafa50818f00bf79d60569d9762f6356336e"},
+    {file = "regex-2022.4.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c4d9770e579eb11b582b2e2fd19fa204a15cb1589ae73cd4dcbb63b64f3e828"},
+    {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:02543d6d5c32d361b7cc468079ba4cddaaf4a6544f655901ba1ff9d8e3f18755"},
+    {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:73ed1b06abadbf6b61f6033a07c06f36ec0ddca117e41ef2ac37056705e46458"},
+    {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3241db067a7f69da57fba8bca543ac8a7ca415d91e77315690202749b9fdaba1"},
+    {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d128e278e5e554c5c022c7bed410ca851e00bacebbb4460de546a73bc53f8de4"},
+    {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1d53835922cd0f9b74b2742453a444865a70abae38d12eb41c59271da66f38d"},
+    {file = "regex-2022.4.24-cp38-cp38-win32.whl", hash = "sha256:f2a5d9f612091812dee18375a45d046526452142e7b78c4e21ab192db15453d5"},
+    {file = "regex-2022.4.24-cp38-cp38-win_amd64.whl", hash = "sha256:a850f5f369f1e3b6239da7fb43d1d029c1e178263df671819889c47caf7e4ff3"},
+    {file = "regex-2022.4.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bedb3d01ad35ea1745bdb1d57f3ee0f996f988c98f5bbae9d068c3bb3065d210"},
+    {file = "regex-2022.4.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8bf867ba71856414a482e4b683500f946c300c4896e472e51d3db8dfa8dc8f32"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b415b82e5be7389ec5ee7ee35431e4a549ea327caacf73b697c6b3538cb5c87f"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dae5affbb66178dad6c6fd5b02221ca9917e016c75ee3945e9a9563eb1fbb6f"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e65580ae3137bce712f505ec7c2d700aef0014a3878c4767b74aff5895fc454f"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e9e983fc8e0d4d5ded7caa5aed39ca2cf6026d7e39801ef6f0af0b1b6cd9276"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad3a770839aa456ff9a9aa0e253d98b628d005a3ccb37da1ff9be7c84fee16"},
+    {file = "regex-2022.4.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed625205f5f26984382b68e4cbcbc08e6603c9e84c14b38457170b0cc71c823b"},
+    {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c4fdf837666f7793a5c3cfa2f2f39f03eb6c7e92e831bc64486c2f547580c2b3"},
+    {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ed26c3d2d62c6588e0dad175b8d8cc0942a638f32d07b80f92043e5d73b7db67"},
+    {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f89d26e50a4c7453cb8c415acd09e72fbade2610606a9c500a1e48c43210a42d"},
+    {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:97af238389cb029d63d5f2d931a7e8f5954ad96e812de5faaed373b68e74df86"},
+    {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:be392d9cd5309509175a9d7660dc17bf57084501108dbff0c5a8bfc3646048c3"},
+    {file = "regex-2022.4.24-cp39-cp39-win32.whl", hash = "sha256:bcc6f7a3a95119c3568c572ca167ada75f8319890706283b9ba59b3489c9bcb3"},
+    {file = "regex-2022.4.24-cp39-cp39-win_amd64.whl", hash = "sha256:5b9c7b6895a01204296e9523b3e12b43e013835a9de035a783907c2c1bc447f0"},
+    {file = "regex-2022.4.24.tar.gz", hash = "sha256:92183e9180c392371079262879c6532ccf55f808e6900df5d9f03c9ca8807255"},
 ]
 reorder-python-imports = [
     {file = "reorder_python_imports-2.6.0-py2.py3-none-any.whl", hash = "sha256:54a3afd594a3959b10f7eb8b54ef453eb2b5176eb7b01c111cb1893ff9a2c685"},
     {file = "reorder_python_imports-2.6.0.tar.gz", hash = "sha256:f4dc03142bdb57625e64299aea80e9055ce0f8b719f8f19c217a487c9fa9379e"},
 ]
 requests = [
-    {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
-    {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
+    {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
+    {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
 ]
 restructuredtext-lint = [
-    {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
+    {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"},
+]
+retworkx = [
+    {file = "retworkx-0.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5e7af7a6149e244b891d5f5a96765e14e273afd17c7c6df14ae874ecadd0c99d"},
+    {file = "retworkx-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a63ca79ef0950fb8fbb31696eb24c8e40ac1a3acf75f542855f49ec09171a00a"},
+    {file = "retworkx-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a088709fb4734b3c4eda93d5177b778297be1edb5b2a5fc5a9d2e971aeb39e1"},
+    {file = "retworkx-0.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02eb69c81eecac6d870a557784146cfbf0694b6c17dc4be32e80d7204d965b95"},
+    {file = "retworkx-0.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:474e4358c6c03a8740dd3bd54b4f4e29267879c870c040776cd91f794773cb86"},
+    {file = "retworkx-0.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b1d0c76735cff05042684abcced2dc700cb96413635743a171d117e2761ba8a"},
+    {file = "retworkx-0.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2db4df09f3bc421e34891b3c845aa3e307c633ae3967122b486cfd9b863b2c18"},
+    {file = "retworkx-0.11.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fcd91d6a9eab5390b0f626d06587aa35220142c1238f919ce0d074545049c709"},
+    {file = "retworkx-0.11.0-cp310-cp310-win32.whl", hash = "sha256:64ad370bdca831608d18b93a738b8b3d8bc059b526bc1893e4a508c06c7e673e"},
+    {file = "retworkx-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:3d191d1a287bc24514089f7ea3151ca9b16fd70ad82af4afc68043a909228170"},
+    {file = "retworkx-0.11.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:99f4ed97ab5342c0f10bdec440e6b0950c1483c1c9724d82a5601a31fb941f88"},
+    {file = "retworkx-0.11.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a31a1e2d23ee5b57a227a71360f5c76a618e7f081117530acacca1948cb0770"},
+    {file = "retworkx-0.11.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:118e50ecbed38531072af9cc8696cc2baf2d5b24e55a170e5ea9a7136fb2b7a5"},
+    {file = "retworkx-0.11.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95c37a1a113f0042f0fae42af32c44bb6b460ec09595fbe82f8a11e1237257a"},
+    {file = "retworkx-0.11.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f7d151b725b1dc471a73b87d8951019171acafcfe32f52a770a87661a249c8e"},
+    {file = "retworkx-0.11.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39834f5f8335bdbeca78cbeb4b545f8e3f3f55817a659e8599dcba56a1f91251"},
+    {file = "retworkx-0.11.0-cp36-cp36m-win32.whl", hash = "sha256:cea524a81c9a1c449fe7fa40e33465f00d2fbc29deb44bb8ce028ef16654452f"},
+    {file = "retworkx-0.11.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ba4bbcba72200b86d93f034641e5928e3b308c8f315bc4a1732250b6e782da64"},
+    {file = "retworkx-0.11.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:83ee8fa88849a6305aec865bf09a9b638aa9b5a2e38f3b7e96327652133952ae"},
+    {file = "retworkx-0.11.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8bf6d103a1068aeeea3b0e7ce362effb2766620a57d80c9bebbd0858db50d85"},
+    {file = "retworkx-0.11.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffdee65a449841c7a4432f75ec84754cd64cfaf1ab596d56e24cdfc6f0cc7644"},
+    {file = "retworkx-0.11.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03c883dca99a69884c4d0a0e0b880ec4c1f772c29b1c081ddb2867b760c32637"},
+    {file = "retworkx-0.11.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:014f92e656d4495d5265daa70fa72ad8a012c81f92e363cc9d3c82ac7deef02d"},
+    {file = "retworkx-0.11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:add52f65d8c85e337d1c0ce23891584c556faf5e5af12f6538e35b3fe823a23e"},
+    {file = "retworkx-0.11.0-cp37-cp37m-win32.whl", hash = "sha256:3fca540e733c0b234f0506dc259a152f92e8f15f04fd37b1d7a6c890deaaed50"},
+    {file = "retworkx-0.11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abee9263f2d7ff61076d9911d11dd40481e6df7c6711350afba20f08abed4e5d"},
+    {file = "retworkx-0.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:804aa25af8898a2e0a4fbf2f94fb4d13cb7543722316a09cbed0e7c4f9b445d4"},
+    {file = "retworkx-0.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6eecc461f5226028011192d7421c1886121c7b6760191fe1d774d8e72d9961df"},
+    {file = "retworkx-0.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4b9a8f5f2c6ae01acfb8de82ae4733b2fd42d89dfa53153e5816df73c2098dd5"},
+    {file = "retworkx-0.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c818c6034da670686f4e5c0aa424175ae95744b11d2abced3c6f0a9c7e7ab9e2"},
+    {file = "retworkx-0.11.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4537cd72e12be4c7ad74b790039fc58b2383c3ef8877f60b3ebcd715960d2cd"},
+    {file = "retworkx-0.11.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:adbcd034bc7acd1aa67fd95186735ce37c318b6467c054267c53dd2e8d0a1614"},
+    {file = "retworkx-0.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3a2d157a8f7b2331339eca644742db2476c8c5af7846c3f22d994efcc505c2"},
+    {file = "retworkx-0.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a199e0374036503db8c98e45e2476896fbcaf7f620f4f81206e0ee1b19a436c5"},
+    {file = "retworkx-0.11.0-cp38-cp38-win32.whl", hash = "sha256:21f58c69fb68b2d9e1307a75dc239ccdca038a655127df5763e161b715e5ae71"},
+    {file = "retworkx-0.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:b08484348add5eff6ddf48dc4c21aa6c085c4520287fbc11bbfdf6c44c33b387"},
+    {file = "retworkx-0.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c731cf468cdc9158505687124427b3f9ddc4a72ad7dfaefbe4e80bd126c792c7"},
+    {file = "retworkx-0.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d3967cc9c25c6fbee88aae99f867b1f51acedfcce7925df353f1a3ee8059f8"},
+    {file = "retworkx-0.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8842fcbfecde45a4562aaa5ca61f7e4d3d60a84ffd63de3af8d1b436f7bc277d"},
+    {file = "retworkx-0.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05bb8c3371557e4761d974dbac9cdb3aa7435d989ebae16f12e4292db681c2cd"},
+    {file = "retworkx-0.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c9ed7c1bd7dbfbdce1a309501a5863716c2bc4f937647cba80d2c22248eabdb"},
+    {file = "retworkx-0.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8fd11b17e1bc456fb5f5f4a79981c51d4059b408f166b8ae4abf0d2752e64d3"},
+    {file = "retworkx-0.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d11fd9254bd9865a346717acb8e7c61766eb544617377939e990d09402970314"},
+    {file = "retworkx-0.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9be63746d964cf172b0f756f8727a2e5a12db6295a87891112497dd8152b44ff"},
+    {file = "retworkx-0.11.0-cp39-cp39-win32.whl", hash = "sha256:26b0574054bd0c83e6c7f50a60a5323bed876081f364a8ba20427fffb8d93a4f"},
+    {file = "retworkx-0.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:97b0fd2c6cb29031b21e395b1c0ac5f43b4110fb78f1fa448c1c7079180c864a"},
+    {file = "retworkx-0.11.0.tar.gz", hash = "sha256:a4c2a5ad3f8402493d41ad20ad91a03777ea214a3636c290272bbfaf36161161"},
 ]
 "ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.16-py3-none-any.whl", hash = "sha256:ea21da1198c4b41b8e7a259301cc9710d3b972bf8ba52f06218478e6802dd1f1"},
-    {file = "ruamel.yaml-0.17.16.tar.gz", hash = "sha256:1a771fc92d3823682b7f0893ad56cb5a5c87c48e62b5399d6f42c8759a583b33"},
+    {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"},
+    {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"},
 ]
 "ruamel.yaml.clib" = [
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"},
-    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"},
     {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"},
     {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"},
     {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"},
@@ -1810,29 +2229,56 @@ safety = [
     {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"},
     {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"},
 ]
+scipy = [
+    {file = "scipy-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4f12d13ffbc16e988fa40809cbbd7a8b45bc05ff6ea0ba8e3e41f6f4db3a9e47"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a254b98dbcc744c723a838c03b74a8a34c0558c9ac5c86d5561703362231107d"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:368c0f69f93186309e1b4beb8e26d51dd6f5010b79264c0f1e9ca00cd92ea8c9"},
+    {file = "scipy-1.5.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4598cf03136067000855d6b44d7a1f4f46994164bcd450fb2c3d481afc25dd06"},
+    {file = "scipy-1.5.4-cp36-cp36m-win32.whl", hash = "sha256:e98d49a5717369d8241d6cf33ecb0ca72deee392414118198a8e5b4c35c56340"},
+    {file = "scipy-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:65923bc3809524e46fb7eb4d6346552cbb6a1ffc41be748535aa502a2e3d3389"},
+    {file = "scipy-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9ad4fcddcbf5dc67619379782e6aeef41218a79e17979aaed01ed099876c0e62"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f87b39f4d69cf7d7529d7b1098cb712033b17ea7714aed831b95628f483fd012"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:25b241034215247481f53355e05f9e25462682b13bd9191359075682adcd9554"},
+    {file = "scipy-1.5.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:fa789583fc94a7689b45834453fec095245c7e69c58561dc159b5d5277057e4c"},
+    {file = "scipy-1.5.4-cp37-cp37m-win32.whl", hash = "sha256:d6d25c41a009e3c6b7e757338948d0076ee1dd1770d1c09ec131f11946883c54"},
+    {file = "scipy-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:2c872de0c69ed20fb1a9b9cf6f77298b04a26f0b8720a5457be08be254366c6e"},
+    {file = "scipy-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e360cb2299028d0b0d0f65a5c5e51fc16a335f1603aa2357c25766c8dab56938"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3397c129b479846d7eaa18f999369a24322d008fac0782e7828fa567358c36ce"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:168c45c0c32e23f613db7c9e4e780bc61982d71dcd406ead746c7c7c2f2004ce"},
+    {file = "scipy-1.5.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:213bc59191da2f479984ad4ec39406bf949a99aba70e9237b916ce7547b6ef42"},
+    {file = "scipy-1.5.4-cp38-cp38-win32.whl", hash = "sha256:634568a3018bc16a83cda28d4f7aed0d803dd5618facb36e977e53b2df868443"},
+    {file = "scipy-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b03c4338d6d3d299e8ca494194c0ae4f611548da59e3c038813f1a43976cb437"},
+    {file = "scipy-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d5db5d815370c28d938cf9b0809dade4acf7aba57eaf7ef733bfedc9b2474c4"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b0ceb23560f46dd236a8ad4378fc40bad1783e997604ba845e131d6c680963e"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:ed572470af2438b526ea574ff8f05e7f39b44ac37f712105e57fc4d53a6fb660"},
+    {file = "scipy-1.5.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8c8d6ca19c8497344b810b0b0344f8375af5f6bb9c98bd42e33f747417ab3f57"},
+    {file = "scipy-1.5.4-cp39-cp39-win32.whl", hash = "sha256:d84cadd7d7998433334c99fa55bcba0d8b4aeff0edb123b2a1dfcface538e474"},
+    {file = "scipy-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:cc1f78ebc982cd0602c9a7615d878396bec94908db67d4ecddca864d049112f2"},
+    {file = "scipy-1.5.4.tar.gz", hash = "sha256:4a453d5e5689de62e5d38edf40af3f17560bfd63c9c5bd228c18c1f99afa155b"},
+]
 six = [
     {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
 smmap = [
-    {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"},
-    {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"},
+    {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
+    {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
 ]
 snowballstemmer = [
-    {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
-    {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
+    {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+    {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
 ]
 sphinx = [
-    {file = "Sphinx-4.2.0-py3-none-any.whl", hash = "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"},
-    {file = "Sphinx-4.2.0.tar.gz", hash = "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6"},
+    {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"},
+    {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"},
 ]
 sphinx-autobuild = [
     {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"},
     {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"},
 ]
 sphinx-click = [
-    {file = "sphinx-click-3.0.1.tar.gz", hash = "sha256:9b24c46f3b8f25fc639f47c97ac0361d9f80d48c2ed6b3917de2865bbdbe1785"},
-    {file = "sphinx_click-3.0.1-py3-none-any.whl", hash = "sha256:e9ee2237e5a6b6620e9996b8214934afdf8f7f9f9fc082482c77be0e4379038e"},
+    {file = "sphinx-click-3.1.0.tar.gz", hash = "sha256:36dbf271b1d2600fb05bd598ddeed0b6b6acf35beaf8bc9d507ba7716b232b0e"},
+    {file = "sphinx_click-3.1.0-py3-none-any.whl", hash = "sha256:8fb0b048a577d346d741782e44d041d7e908922858273d99746f305870116121"},
 ]
 sphinx-rtd-theme = [
     {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"},
@@ -1863,8 +2309,45 @@ sphinxcontrib-serializinghtml = [
     {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 stevedore = [
-    {file = "stevedore-3.4.0-py3-none-any.whl", hash = "sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e"},
-    {file = "stevedore-3.4.0.tar.gz", hash = "sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1"},
+    {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"},
+    {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"},
+]
+symengine = [
+    {file = "symengine-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0880ff7f447d1b994f05fa9e4aab7823c1cf4b02ebc06c4179387fc96970ad0"},
+    {file = "symengine-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b651e7d1a1dfdea55acc5d5473e0f1a815fd417a66d232226e1fc26262496c4c"},
+    {file = "symengine-0.8.1-cp310-cp310-manylinux2010_x86_64.whl", hash = "sha256:602997991b314ea5a13d0ddf9703b8b74c805f02721b735c3082841cc975da7b"},
+    {file = "symengine-0.8.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a2fb3aca761b53eac25b453b8a5d8e9bf6ca76208eb3e7a64c96db70b907d550"},
+    {file = "symengine-0.8.1-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:ab0e2cc85944ce749e87b12fbd090af2347ef202b107c3ff31e46cd3cf2bad9a"},
+    {file = "symengine-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:50ee5950cd7dfaa0c59bb9b46499900c5acdc09af8bba1a0be3b31c2640e3785"},
+    {file = "symengine-0.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84482ca9b4432de61a45fce6f6d19241f4c1e450484fdbe6a8a6a1f885d32e60"},
+    {file = "symengine-0.8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e0a0224e4e9d646be63387d53645e7060068304e5d7927fe97d668e7709e4ded"},
+    {file = "symengine-0.8.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2fa3493b2bea646520e4bc4531aa7e860b104aefece927167c476c827aaf3654"},
+    {file = "symengine-0.8.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:12ed43c1287a8f620881ca696d567bf2df0eeb447cb25426d80c34d12a592d4e"},
+    {file = "symengine-0.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f9ec79e4a6b1955ee593b22218496d7b36ac1d7be23c93b56617237cfa308f11"},
+    {file = "symengine-0.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:77cdf00254eb1435a0e7af5f4b6fe64d52bd5cb9bd3131dc03f00d8922de098e"},
+    {file = "symengine-0.8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:44ccd914bf29aae4b84d89cd0bd3127002f9506e0e4fd1800500cf9507e01a11"},
+    {file = "symengine-0.8.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c1106e98ed524e5d3213baa0d6b23dde8e3230bb32bafcf55f14956d44775edd"},
+    {file = "symengine-0.8.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:d8e01478ed7a869f1a92d866858228af31087b0da51d1487d5ac91e779e1ba85"},
+    {file = "symengine-0.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:53123b94e93d7b9a97fa9ec17d76ca16bfe7d0ad174cf40e41101927049d59aa"},
+    {file = "symengine-0.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ff10cf7ab44470f8ce8024c650bbf322a9a89d5b53dcf97cd68a3bcf41e5052f"},
+    {file = "symengine-0.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b5ceb060a6b0bf5211c94aeed1525bbebec1f22b846931efeb9d84474ee22bc9"},
+    {file = "symengine-0.8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9483dd5351644efb898a01ac77b94e6c7b78e2a4c7abadf58a4cb5cb1e005aa1"},
+    {file = "symengine-0.8.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ee66108b5c7a8befa81ffb958c06b6485c902e5b984cd01bfc99c52449f3914c"},
+    {file = "symengine-0.8.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:88a3ef60d7bdbef5b7ec7673ec2eeafe2f3fac98eacd62a11e22f82fbd7a3fbb"},
+    {file = "symengine-0.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:b40a1237d8d533d543c6b9d920967d6286aa1f0cc9f5eeb3b4ea4baae4323136"},
+    {file = "symengine-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc0d9e5d92ceef51eba1f1c1e784c7a7505d02367e05087f84cfe9ef7d79ed9d"},
+    {file = "symengine-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a6682fb1c16a6ca0e35d45bc91f3afb850fb8feb7febeca0108f3908269342c1"},
+    {file = "symengine-0.8.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:503c4769d9a6fcfe3b7be7c17b5bbb995c3f3727dc52e563728598f345aab326"},
+    {file = "symengine-0.8.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6bfd85b116a6673219861432d655c0e8dd5efb26ff5f071ae2b421704785d07c"},
+    {file = "symengine-0.8.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:56ba2902b72786e09ceb67dba78f52e4ff6607fface6f763772da2e25333898d"},
+    {file = "symengine-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:c81c023f6db8045b827db9bc3b7faf36369ef148d4af501d88af28ed6b2ea69f"},
+    {file = "symengine-0.8.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:247e7488abe84dea98eecf8090d330d26526c5a65f481eb451769b4b53d794d6"},
+    {file = "symengine-0.8.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:42ddbe84fb80aad3ebe7c8ef24749f7bcac2a9f067cf4733872a4be714810864"},
+    {file = "symengine-0.8.1.tar.gz", hash = "sha256:5f8f45718a09f6cdda38dd950ddea1638985af53a8fd2cea25bcc0b7d0772be8"},
+]
+sympy = [
+    {file = "sympy-1.9-py3-none-any.whl", hash = "sha256:8bc5de4608b7aa4e7ffd1b25452ae87ccc5f6ca667c661aafb854a1ade337d0c"},
+    {file = "sympy-1.9.tar.gz", hash = "sha256:c7a880e229df96759f955d4f3970d4cabce79f60f5b18830c08b90ce77cd5fdc"},
 ]
 toml = [
     {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
@@ -1917,6 +2400,51 @@ traitlets = [
     {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"},
     {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"},
 ]
+tweedledum = [
+    {file = "tweedledum-1.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b563c8324bbf5ed9ed57399a1eca34d8a82cb146b3011154e3df749753b75fe5"},
+    {file = "tweedledum-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a5d734fed09a479afc0ec8fa91764ac9411821c27396e1b7d4a64393e689271d"},
+    {file = "tweedledum-1.1.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a7dc0a9674e90808b26e24410bff7e5385d2b21ddf7068fc9c7d020ac46cefd8"},
+    {file = "tweedledum-1.1.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:be97848edb19473eb653c58515605a636da1dc4a4650e291f3f05824c9dac005"},
+    {file = "tweedledum-1.1.1-cp310-cp310-win32.whl", hash = "sha256:eae6a32207f3f8daf17806b90b2390e13f418b00a62384d029e13f215249df6b"},
+    {file = "tweedledum-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:ab7a800d6266c98a30b0e8dc3e13cf49c8145012dfa199c9cc4d58d598a54218"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:6b8fa90b5303a6534ef332019ccdbb93ba969993cd7b78395ab31cb4c48a718e"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cad30654036a36afee0fb879a9cc3f26b33655d8a833425704b6dbb6d4caddfb"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4943f5d628f9adb95244b8bac79b7978f810bdaa5025e9930a625161a0d72dad"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:09dbf20f792e97211270dfa2b3033ead0ce11fd65cc03781a542f36bccd7f1c1"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bbe9a20d71576465051720eac72aa7f95fae39b4e4feea44f690e1ba856e99a"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57687300cca24c2f8fb340d6fa2233450a054647c736dc84958aac4d235b8542"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:828808a47c2c67a10e1cf8692ede0bcf2732e5ace8b910bdcb7a2c0bb82440d8"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:451a10c32c58bf4726ce03f6cce9a93fb5332e679b7dbf48ef69c6fa93493243"},
+    {file = "tweedledum-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f0500f8088cf142bfc4dd07a81f3a344603755602dc5f51acde588a36e538ed5"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:86fac8e040d1645cfb3d623d949523eb1d367c2eee51fd5843536955104fd1ed"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fdee0b3b044db8e5d74001fbe25201e0db31be529d47785d2a70e22b7ff63f4a"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0fd7ca92719fcb6a2437a16fd0281809fc57acb8a86ebf41fd06fe8faca1e14d"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:003d92abb1c49e824b8c05857ae745959981174a082dd8c5a66ab1f55855ced3"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b2fb3d20e21dbe97e9776d0c0b33c0a3dab8e4ac03a5434e9bfd11c9b3a998"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:157392c983762e8a3f7ab523b0cfa4c78fbe83e28e0f1eee59e623636ddfe1ec"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdb3c526f86fcd3d2c8794d1a3d5836ece2cf6f6c9d8e1ee8036b30d24ce29b1"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:57201c605b1d9045c135e72c521cbe537d8da6d534daa76e349c27fc1177681c"},
+    {file = "tweedledum-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:099b1826f213bd4006dcd02526377b81134538fe1377e4cb70a07ba223ae958a"},
+    {file = "tweedledum-1.1.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:80f99d7f9dee78f73796b9df2bc836c02f9bfc5a55eec65dda20899d96d09754"},
+    {file = "tweedledum-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f8cbd4cb6933d867e28ff7efc6030eceb1e4caef5c1bed5dfe7d097f63e6c28"},
+    {file = "tweedledum-1.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:86da69130494c972d751ab61fdb209d40f079b77d5b3b833e83f26cee3c1a2fc"},
+    {file = "tweedledum-1.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4385265171ee53d12d64429d65f0609f57a171d646a61366e3354eddc5c95778"},
+    {file = "tweedledum-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956f34ca2f6edaaafeaeef5f08db2abd54e4b5371a861ad68065d88b63d157b2"},
+    {file = "tweedledum-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a3d4686fd1a8e8c86300e004acd73dd21e35a65f66625d784b2292280e46269"},
+    {file = "tweedledum-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a08c535ef2ebcb326d2388bb4430d52f630ce43386f8b21a42e761e9e30394c4"},
+    {file = "tweedledum-1.1.1-cp38-cp38-win32.whl", hash = "sha256:a032f0b6f6143dccee115b14a72780bc5813ccc552f3b1e9d519cb41e2d3ee50"},
+    {file = "tweedledum-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:0da0905cd6c08b99d772b2b97f15ccfa80758c49143c3eff131b9480eba6f3fd"},
+    {file = "tweedledum-1.1.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1c73247309b6853b19906df594f7d0a8664bf3490ee2fb25621f617099525ffc"},
+    {file = "tweedledum-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd6cd64ccfc10db296f17e20713265bd91899774a34bcdf788c002c48514469e"},
+    {file = "tweedledum-1.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b6aeba18fad932e7dd7715758c97f5aaa287b2726cb4ca9eea7d769fcd607f90"},
+    {file = "tweedledum-1.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3e243c2f70a4e4758cbdd45b31cdd72eb4816ace7029bdfe7e706cc37015f72e"},
+    {file = "tweedledum-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f60f04dcc6e6162c3ce9eb058bb6853cfdd7c8dfefb1f1b428e94d0633a7cc"},
+    {file = "tweedledum-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4710519655c55c0b74b6c8abc39f24493f3a8a6c7854af362f4c7953d16036b"},
+    {file = "tweedledum-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c305fe9365f449cc3ad379ecf823f1ba6b734cdec56a618fbef11c83a54cede"},
+    {file = "tweedledum-1.1.1-cp39-cp39-win32.whl", hash = "sha256:d4bf1f03d11cdc02c32a7771fa23c7de136e7cfa2920f508b2b3bc93d8b29c50"},
+    {file = "tweedledum-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:98818ca8cae7a1d95ca05b219ffbcaf92a4fec200ff245e3ddf3ffc616977490"},
+    {file = "tweedledum-1.1.1.tar.gz", hash = "sha256:58d6f7a988b10c31be3faa1faf3e58288ef7e8159584bfa6ded45742f390309f"},
+]
 typed-ast = [
     {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
     {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
@@ -1950,25 +2478,24 @@ typed-ast = [
     {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
 ]
 typeguard = [
-    {file = "typeguard-2.13.0-py3-none-any.whl", hash = "sha256:0bc44d1ff865b522eda969627868b0e001c8329296ce50aededbea03febc79ee"},
-    {file = "typeguard-2.13.0.tar.gz", hash = "sha256:04e38f92eb59410c9375d3be23df65e0a7643f2e8bcbd421423d808d2f9e99df"},
+    {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"},
+    {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"},
 ]
 typing-extensions = [
-    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
-    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
-    {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
+    {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
+    {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
 ]
 urllib3 = [
-    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
-    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
+    {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"},
+    {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
 ]
 varname = [
-    {file = "varname-0.8.1-py3-none-any.whl", hash = "sha256:344f6e9a38d338aad30bb953bc68e1dc5645e0b0f45e7b3171b3ca3edfd3c490"},
-    {file = "varname-0.8.1.tar.gz", hash = "sha256:06f8fa6e7db0a9897ada5e096eab95f9c2e3811e69e7a29f747517e4377f3d2b"},
+    {file = "varname-0.8.3-py3-none-any.whl", hash = "sha256:f954e72127da2bf249e2ae3fae44fa6ee41e5fc87a65dca1bc5cdfdb74428ed0"},
+    {file = "varname-0.8.3.tar.gz", hash = "sha256:53283f002ea6757a6157cc362cd9464243687bf7d88d7d49a9c853f956e73973"},
 ]
 virtualenv = [
-    {file = "virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300"},
-    {file = "virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8"},
+    {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"},
+    {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"},
 ]
 wcwidth = [
     {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
diff --git a/quantum-viz/pyproject.toml b/quantum-viz/pyproject.toml
index 97ced207..ae888bac 100644
--- a/quantum-viz/pyproject.toml
+++ b/quantum-viz/pyproject.toml
@@ -24,6 +24,7 @@ python = "^3.6.1"
 click = "^8.0.1"
 ipython = "<8.0.0"
 varname = "^0.8.1"
+qiskit-terra = {version = ">=0.19.1, <1", optional = true}
 
 [tool.poetry.dev-dependencies]
 pytest = "^6.2.4"
@@ -48,6 +49,10 @@ pre-commit-hooks = "^4.0.1"
 sphinx-rtd-theme = "^0.5.2"
 sphinx-click = "^3.0.1"
 Pygments = "^2.9.0"
+qiskit-terra = ">=0.19.1, <1"
+
+[tool.poetry.extras]
+qiskit = ["qiskit-terra"]
 
 [tool.coverage.paths]
 source = ["src", "*/site-packages"]
@@ -58,7 +63,7 @@ source = ["quantum_viz"]
 
 [tool.coverage.report]
 show_missing = true
-fail_under = 100
+fail_under = 90
 
 [tool.mypy]
 strict = false
@@ -68,7 +73,7 @@ show_error_codes = true
 show_error_context = true
 
 [[tool.mypy.overrides]]
-module = ["IPython.core.display", "varname.*"]
+module = ["IPython.*", "varname.*", "qiskit.*"]
 ignore_missing_imports = true
 
 [build-system]
diff --git a/quantum-viz/quantum_viz/qiskit_parser.py b/quantum-viz/quantum_viz/qiskit_parser.py
new file mode 100644
index 00000000..1bebdd58
--- /dev/null
+++ b/quantum-viz/quantum_viz/qiskit_parser.py
@@ -0,0 +1,370 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+from enum import IntEnum
+from typing import Dict
+from typing import Iterator
+from typing import List
+from typing import Optional
+from typing import Tuple
+from typing import Type
+from typing import Union
+
+try:
+    import qiskit  # noqa: F401
+except ImportError as e:
+    raise ImportError(
+        '`qiskit` was not found, try to `pip install "quantum-viz[qiskit]"`'
+    ) from e
+
+from qiskit.circuit import QuantumCircuit, Qubit, Clbit, ClassicalRegister
+from qiskit.circuit.instruction import Instruction
+from qiskit.circuit.controlledgate import ControlledGate
+from qiskit.circuit.measure import Measure
+from qiskit.circuit.barrier import Barrier
+from qiskit.circuit.reset import Reset
+from qiskit.circuit.parameter import Parameter
+from qiskit.circuit.library import (
+    IGate,
+    XGate,
+    YGate,
+    ZGate,
+    HGate,
+    UGate,
+    U1Gate,
+    U2Gate,
+    U3Gate,
+    PhaseGate,
+    RGate,
+    SwapGate,
+    RXGate,
+    RYGate,
+    RZGate,
+    RXXGate,
+    RYYGate,
+    RZXGate,
+    RZZGate,
+    iSwapGate,
+    DCXGate,
+    SGate,
+    SdgGate,
+    TGate,
+    TdgGate,
+    SXGate,
+    SXdgGate,
+)
+from qiskit.circuit.quantumcircuitdata import QuantumCircuitData
+
+INSTRUCTION_TYPE_TO_NAME: Dict[Type[Instruction], str] = {
+    IGate: "I",
+    XGate: "X",
+    YGate: "Y",
+    ZGate: "Z",
+    HGate: "H",
+    UGate: "U",
+    U1Gate: "U1",
+    U2Gate: "U2",
+    U3Gate: "U3",
+    PhaseGate: "P",
+    RGate: "R",
+    SwapGate: "SWAP",
+    RXGate: "Rx",
+    RYGate: "Ry",
+    RZGate: "Rz",
+    RXXGate: "Rxx",
+    RYYGate: "Ryy",
+    RZXGate: "Rzx",
+    RZZGate: "Rzz",
+    iSwapGate: "Iswap",
+    DCXGate: "Dcx",
+    SGate: "S",
+    SdgGate: "Sdg",
+    TGate: "T",
+    TdgGate: "Tdg",
+    SXGate: "√X",
+    SXdgGate: "√Xdg",
+    Measure: "measure",
+}
+
+X_GATE_NAME = INSTRUCTION_TYPE_TO_NAME[XGate]
+MEASURE_NAME = INSTRUCTION_TYPE_TO_NAME[Measure]
+
+
+class RegisterType(IntEnum):
+    QUBIT = 0
+    CLASSICAL = 1
+
+
+class ConditionalRender(IntEnum):
+    ALWAYS = 0
+    ON_ZERO = 1
+    ON_ONE = 2
+    AS_GROUP = 3
+
+
+def qiskit2dict(circ: QuantumCircuit, **kwargs) -> Dict[str, List]:
+    return QiskitCircuitParser(circ, **kwargs).qviz_dict
+
+
+class QiskitCircuitParser:
+    QUBITS_KEY = "qubits"
+    OPERATIONS_KEY = "operations"
+
+    def __init__(
+        self,
+        circuit: QuantumCircuit,
+        precision: int = 2,
+        max_recursion_depth: Optional[int] = None,
+        skip_barriers: bool = True,
+    ) -> None:
+        """
+        Create a QiskitCircuitParser object.
+
+        :param circuit: qiskit quantum circuit to be parsed
+        :param precision: the decimal precision of float gate parameters to display
+        :param max_recursion_depth: the maximal recursion depth to parse, if None -
+          parse until the basis gates are reached
+        :param skip_barriers: whether to omit barriers in the output or not
+        """
+        self.qc = circuit
+        self.precision = precision
+        self.max_recursion_depth = max_recursion_depth
+        self.skip_barriers = skip_barriers
+        self.qviz_dict: Dict[str, List] = {
+            self.QUBITS_KEY: [],
+            self.OPERATIONS_KEY: [],
+        }
+        self.qubit2id: Dict[Qubit, int] = dict()
+        self._init_qubits()
+        self._clbit2id: Dict[Clbit, Tuple[int, int]] = dict()
+        self._update_qviz_dict()
+
+    def _init_qubits(self) -> None:
+        qubits_range = range(self.qc.num_qubits)
+        self.qubit2id = dict(zip(self.qc.qubits, qubits_range))
+        self.qubits = [{"id": i} for i in qubits_range]
+
+    @property
+    def qubits(self) -> List[Dict[str, int]]:
+        return self.qviz_dict[self.QUBITS_KEY]
+
+    @qubits.setter
+    def qubits(self, value: List[Dict[str, int]]) -> None:
+        self.qviz_dict[self.QUBITS_KEY] = value
+
+    @property
+    def operations(self) -> List[Dict]:
+        return self.qviz_dict[self.OPERATIONS_KEY]
+
+    @operations.setter
+    def operations(self, value: List[Dict]) -> None:
+        self.qviz_dict[self.OPERATIONS_KEY] = value
+
+    def _get_qubit_def(self, qubit: Qubit) -> Dict[str, int]:
+        return {"qId": self.qubit2id[qubit]}
+
+    def _get_qubit_list_def(self, qubits: List[Qubit]) -> List[Dict[str, int]]:
+        return [self._get_qubit_def(qubit) for qubit in qubits]
+
+    def _get_clbit_def(
+        self, clbit: Clbit, qubit: Optional[Qubit] = None
+    ) -> Dict[str, int]:
+        if clbit in self._clbit2id:
+            q_id, c_id = self._clbit2id[clbit]
+        else:
+            if qubit is None:
+                raise NotImplementedError(
+                    "A classical bit has to defined first as a measurement result of a "
+                    "qubit"
+                )
+            q_id = self.qubit2id[qubit]
+            c_id = self.qubits[q_id].get("numChildren", 0)
+            self.qubits[q_id]["numChildren"] = c_id + 1
+            self._clbit2id[clbit] = (q_id, c_id)
+        return {"type": RegisterType.CLASSICAL.value, "qId": q_id, "cId": c_id}
+
+    def _update_qviz_dict(self) -> None:
+        qc = self.qc
+        self.operations += [
+            {
+                "gate": qc.name,
+                "targets": self._get_qubit_list_def(qc.qubits),
+            }
+        ]
+        for instruction, qargs, cargs in self._filter_circuit_data(qc.data):
+            self.operations[0]["children"] = self.operations[0].get("children", []) + [
+                self._parse_operation(instruction, qargs, cargs, depth=1)
+            ]
+
+    def _filter_circuit_data(self, data: QuantumCircuitData) -> Iterator:
+        if self.skip_barriers:
+            # check whether the instruction is not a barrier
+            return filter(lambda elem: not isinstance(elem[0], Barrier), data)
+        return data
+
+    def _is_recursion_depth_exceeded(self, depth: int) -> bool:
+        return self.max_recursion_depth is not None and depth > self.max_recursion_depth
+
+    def _parse_operation(
+        self,
+        instruction: Instruction,
+        qargs: List[Qubit],
+        cargs: List[Clbit],
+        depth: int,
+    ) -> Dict:
+
+        op_dict: Dict = {"gate": self._get_instruction_name(instruction)}
+
+        if instruction.params:
+            self._add_params(op_dict, instruction)
+
+        if isinstance(instruction, Reset):
+            self._add_reset(op_dict, qubit=qargs[0], depth=depth)
+        elif isinstance(instruction, Measure):
+            self._add_measure(op_dict, qargs, cargs)
+        elif isinstance(instruction, ControlledGate):
+            # a controlled gate may change the gate name (i.e. CX -> X)
+            self._add_controlled_gate(op_dict, instruction, qargs)
+        else:
+            op_dict["targets"] = self._get_qubit_list_def(qargs)
+
+        self._add_children(op_dict, instruction, qargs, cargs, depth)
+
+        if instruction.condition:
+            # _update_condition must update op_dict last (after any other method)
+            op_dict = self._update_condition(op_dict, instruction)
+
+        return op_dict
+
+    def _add_children(
+        self,
+        op_dict: Dict,
+        instruction: Instruction,
+        qargs: List[Qubit],
+        cargs: List[Clbit],
+        depth: int,
+    ) -> None:
+        if (instruction.definition is not None) and (
+            not self._is_recursion_depth_exceeded(depth + 1)
+        ):
+            sub_circuit: QuantumCircuit = instruction.definition
+            # Since the `index` property of bits is deprecated - create mappers between
+            # the bits and their indices in the circuit.
+            # Use the builtin `QuantumCircuit.find_bit` method when it is released
+            qubits_mapper = dict(zip(sub_circuit.qubits, range(sub_circuit.num_qubits)))
+            clbits_mapper = dict(zip(sub_circuit.clbits, range(sub_circuit.num_clbits)))
+            for sub_instruction, sub_qargs, sub_cargs in self._filter_circuit_data(
+                sub_circuit.data
+            ):
+                # Update the args to those of the containing circuit
+                sub_qargs = [qargs[qubits_mapper[qubit]] for qubit in sub_qargs]
+                sub_cargs = [cargs[clbits_mapper[clbit]] for clbit in sub_cargs]
+                op_dict["children"] = op_dict.get("children", []) + [
+                    self._parse_operation(
+                        sub_instruction, sub_qargs, sub_cargs, depth=depth + 1
+                    )
+                ]
+
+    def _add_controlled_gate(
+        self, op_dict: Dict, cgate: ControlledGate, qargs: List[Qubit]
+    ) -> None:
+        ctrl_state = cgate.ctrl_state
+        if not all([int(c) for c in str(ctrl_state)]):
+            raise NotImplementedError(
+                f"The controlled gate {cgate} is controlled by a state that "
+                f"is not all 1's: {ctrl_state}"
+            )
+        num_ctrl_qubits = cgate.num_ctrl_qubits
+        ctrl_qubits = qargs[:num_ctrl_qubits]
+        target_qubits = qargs[num_ctrl_qubits:]
+        op_dict["isControlled"] = True
+        op_dict["gate"] = self._get_instruction_name(cgate.base_gate)
+        op_dict["controls"] = self._get_qubit_list_def(ctrl_qubits)
+        op_dict["targets"] = self._get_qubit_list_def(target_qubits)
+
+    def _add_measure(
+        self, op_dict: Dict, qargs: List[Qubit], cargs: List[Clbit]
+    ) -> None:
+        if len(qargs) != 1 or len(cargs) != 1:
+            raise ValueError
+        qubit = qargs[0]
+        clbit = cargs[0]
+        op_dict["isMeasurement"] = True
+        op_dict["controls"] = [self._get_qubit_def(qubit)]
+        op_dict["targets"] = [self._get_clbit_def(clbit, qubit)]
+
+    def _format_param(self, param: Union[int, float, complex, Parameter]) -> str:
+        if isinstance(param, (float, complex)):
+            return f"{param:.{self.precision}f}"
+        return str(param)
+
+    def _add_params(self, op_dict: Dict, instruction: Instruction) -> None:
+        params_map = map(self._format_param, instruction.params)
+        op_dict["displayArgs"] = f"({', '.join(params_map)})"
+
+    @staticmethod
+    def _get_instruction_name(instruction: Instruction) -> str:
+        return INSTRUCTION_TYPE_TO_NAME.get(type(instruction), instruction.name)
+
+    def _add_reset(self, op_dict: Dict, qubit: Qubit, depth: int) -> None:
+        """Reset logic - measure and apply X gate if the measurement yields 1."""
+        qubit_def = self._get_qubit_def(qubit)
+        op_dict["targets"] = [qubit_def]
+        clbit_def = self._get_clbit_def(Clbit(), qubit)  # create a new classical bit
+
+        if not self._is_recursion_depth_exceeded(depth + 1):
+            # Add a simple logic for the reset instruction
+            op_dict["children"] = [
+                {
+                    "gate": MEASURE_NAME,
+                    "isMeasurement": True,
+                    "controls": [qubit_def],
+                    "targets": [clbit_def],
+                },
+                {
+                    "gate": "Conditional",
+                    "isConditional": True,
+                    "controls": [clbit_def],
+                    "targets": [],
+                    "children": [
+                        {
+                            "gate": X_GATE_NAME,
+                            "targets": [qubit_def],
+                            "conditionalRender": ConditionalRender.ON_ONE.value,
+                        }
+                    ],
+                },
+            ]
+
+    def _update_condition(self, op_dict: Dict, instruction: Instruction) -> Dict:
+        classical, val = instruction.condition
+        if isinstance(classical, ClassicalRegister) and classical.size > 1:
+            raise NotImplementedError(
+                "quantum-viz.js does not support conditioning an instruction on "
+                "more than a single classical bit"
+            )
+        if not (isinstance(val, bool) or val in (0, 1)):
+            raise ValueError(
+                "A single classical bit can hold only 0, 1 or a boolean, but the "
+                f"condition value is {val}"
+            )
+        if isinstance(classical, ClassicalRegister):
+            clbit = Clbit(classical, index=0)
+        else:
+            clbit = classical
+
+        if val:
+            render_condition = ConditionalRender.ON_ONE.value
+        else:
+            render_condition = ConditionalRender.ON_ZERO.value
+
+        op_dict["conditionalRender"] = render_condition
+
+        conditioned_op_dict = {
+            "gate": "Conditional",
+            "isConditional": True,
+            "controls": [self._get_clbit_def(clbit)],
+            "targets": [],
+            "children": [op_dict],
+        }
+
+        return conditioned_op_dict
diff --git a/quantum-viz/quantum_viz/utils.py b/quantum-viz/quantum_viz/utils.py
new file mode 100644
index 00000000..74f36706
--- /dev/null
+++ b/quantum-viz/quantum_viz/utils.py
@@ -0,0 +1,92 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+import json
+import tempfile
+import warnings
+import webbrowser
+from pathlib import Path
+from typing import Any
+from typing import Dict
+from typing import Optional
+from typing import TYPE_CHECKING
+from typing import Union
+
+from .widget import DEFAULT_STYLE
+from .widget import Style
+
+if TYPE_CHECKING:
+    from qiskit import QuantumCircuit
+
+HTML_TEMPLATE = """<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>quantum-viz.js visualization</title>
+</head>
+<body>
+  <div id="msg" style="font-size: large; font-weight: bolder;">
+    There was some error with the script
+  </div>
+  <div id="circuit_div"></div>
+  <script src="https://unpkg.com/@microsoft/quantum-viz.js{0}"></script>
+  <script type="text/javascript">
+    var circuit = {1};
+    if (typeof qviz != 'undefined' && typeof circuit != undefined) {{
+      document.getElementById('msg').style.display = 'none';
+      var displayDiv = document.getElementById('circuit_div');
+      if (displayDiv != null) {{
+        qviz.draw(circuit, displayDiv, qviz.STYLES['{2}']);
+      }}
+    }}
+  </script>
+
+</body>
+</html>
+"""
+SUFFIX = "_qviz.html"
+
+STYLES = list(Style)
+
+
+class UnsupportedStyleWarning(UserWarning):
+    """A warning raised when an unsupported style is chosen."""
+
+
+def display(
+    circuit: Union[Dict[str, Any], "QuantumCircuit"],
+    filename: Union[str, Path, None] = None,
+    style: Style = DEFAULT_STYLE,
+    version: Optional[str] = None,
+    **kwargs,
+) -> None:
+
+    if filename is None:
+        file = tempfile.NamedTemporaryFile(suffix=SUFFIX, delete=False)
+        file.close()
+        path = Path(file.name)
+    else:
+        path = Path(filename)
+
+    if style not in STYLES:
+        warnings.warn(
+            f"The selected style '{style}' is not supported and will be ignored.\n"
+            f"The supported styles are {STYLES}",
+            UnsupportedStyleWarning,
+        )
+
+    if version is None:
+        version = ""  # Use the latest version
+    else:
+        version = "@" + version
+
+    if not isinstance(circuit, dict):
+        from .qiskit_parser import qiskit2dict
+
+        circuit = qiskit2dict(circuit, **kwargs)
+
+    qviz_json = json.dumps(circuit)
+
+    html = HTML_TEMPLATE.format(version, qviz_json, style)
+    path.write_text(html)
+    webbrowser.open(f"file://{path.absolute()}")
diff --git a/quantum-viz/quantum_viz/widget.py b/quantum-viz/quantum_viz/widget.py
index 617e03e3..829a2a4d 100644
--- a/quantum-viz/quantum_viz/widget.py
+++ b/quantum-viz/quantum_viz/widget.py
@@ -3,19 +3,35 @@
 """quantum-viz Viewer is a Jupyter Widget that displays the quantum-viz.js circuit
 visualizer.
 """  # noqa: D400, D205
+import json
 import uuid
+from enum import Enum
 from typing import Any
 from typing import Dict
 from typing import List
+from typing import Optional
 
-from IPython.core.display import display
-from IPython.core.display import HTML
+from IPython.display import display
+from IPython.display import HTML
 from varname import varname
 from varname.utils import ImproperUseError
 
+# The default quantum-viz.js version to use.
+VERSION = "1.0.2"
 # Rel file path for Javascript source
 JS_SOURCE = "qviz.min"
-BASE_URL = "https://unpkg.com/@microsoft/quantum-viz.js@1.0.2/dist"
+BASE_URL = "https://unpkg.com/@microsoft/quantum-viz.js{version_suffix}/dist"
+
+
+class Style(str, Enum):
+    """Supported styles for the quantum-viz.js widget."""
+
+    DEFAULT = "Default"
+    BNW = "BlackAndWhite"
+    INV = "Inverted"
+
+
+DEFAULT_STYLE = Style.DEFAULT
 
 _HTML_STR_FORMAT = """
 <script type="text/javascript">
@@ -28,7 +44,7 @@
     const circuit = {data};
     const targetDiv = document.getElementById('JSApp_{uid}');
     if (targetDiv != null) {{
-        qviz.draw(circuit, targetDiv, qviz.STYLES['Default']);
+        qviz.draw(circuit, targetDiv, qviz.STYLES['{style}']);
     }}
 }});
 </script>
@@ -42,7 +58,14 @@ class Viewer:
 
     n = 0
 
-    def __init__(self, circuit: Dict[str, Any], width: int = 400, height: int = 350):
+    def __init__(
+        self,
+        circuit: Dict[str, Any],
+        version: Optional[str] = VERSION,
+        style: Style = DEFAULT_STYLE,
+        width: int = 400,
+        height: int = 350,
+    ):
         """
         Create Viewer instance.
 
@@ -58,11 +81,30 @@ def __init__(self, circuit: Dict[str, Any], width: int = 400, height: int = 350)
         except ImproperUseError:
             self.name = "_"
 
+        if not isinstance(circuit, dict):
+            from .qiskit_parser import qiskit2dict, QuantumCircuit
+
+            if not isinstance(circuit, QuantumCircuit):
+                raise TypeError(
+                    f"Received a circuit of an unsupported type: {type(circuit)}"
+                )
+            circuit = qiskit2dict(circuit)
+
         self.width = width
         self.height = height
-        self.value = circuit
+        self.value = json.dumps(circuit)
+        self.base_url = self._get_base_url(version)
+        self.style = style
         self._uids: List[str] = []
 
+    @staticmethod
+    def _get_base_url(version: Optional[str]) -> str:
+        if version is None:
+            version_suffix = ""  # Use the latest version
+        else:
+            version_suffix = f"@{version}"
+        return BASE_URL.format(version_suffix=version_suffix)
+
     def _gen_uid(self) -> str:
         """Generate unique identifier for javascript applet. Returns UID."""
         uid = str(uuid.uuid1()).replace("-", "")
@@ -70,21 +112,30 @@ def _gen_uid(self) -> str:
         self._uids.append(uid)
         return uid
 
-    def html_str(self, uid: str) -> str:
+    def html_str(self, uid: Optional[str] = None) -> str:
         """Return an HTML string that contains the widget.
 
         :param uid: Unique identifier of widget
-        :type uid: str
+        :type uid: str or None
         :return: HTML string for displaying widget
         :rtype: str
         """
+        if uid is None:
+            uid = self._gen_uid()
         Viewer.n += 1
         return _HTML_STR_FORMAT.format(
-            base_url=BASE_URL, js_source=JS_SOURCE, uid=uid, data=self.value
+            base_url=self.base_url,
+            js_source=JS_SOURCE,
+            uid=uid,
+            data=self.value,
+            style=self.style,
         )
 
     def _ipython_display_(self) -> None:
-        """Display the widget."""
-        uid = self._gen_uid()
-        viewer = HTML(self.html_str(uid=uid))
-        display(viewer)
+        """Display the widget with IPython."""
+        viewer = HTML(self.html_str())
+        display((viewer,))
+
+    def browser_display(self) -> None:
+        """Display the widget in the browser."""
+        raise NotImplementedError


Test patch:
diff --git a/quantum-viz/tests/conftest.py b/quantum-viz/tests/conftest.py
new file mode 100644
index 00000000..7cc54d77
--- /dev/null
+++ b/quantum-viz/tests/conftest.py
@@ -0,0 +1,73 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+from pathlib import Path
+
+import pytest
+from qiskit import AncillaRegister
+from qiskit import ClassicalRegister
+from qiskit import QuantumCircuit
+from qiskit import QuantumRegister
+from qiskit.circuit import Parameter
+
+
+def qc_to_path(qc: QuantumCircuit) -> Path:
+    return Path(__file__).parent / f"resources/{qc.name}.json"
+
+
+@pytest.fixture()
+def empty_qc(name: str = "empty_circ") -> QuantumCircuit:
+    return QuantumCircuit(name=name)
+
+
+@pytest.fixture()
+def no_ops_qc(name: str = "no_ops_qc") -> QuantumCircuit:
+    return QuantumCircuit(4, 3, name=name)
+
+
+@pytest.fixture()
+def no_ops_regs_qc(name: str = "no_ops_regs_qc") -> QuantumCircuit:
+    qreg1 = QuantumRegister(6, "q1")
+    qreg2 = QuantumRegister(6, "q2")
+    creg = ClassicalRegister(2, "c")
+    areg = AncillaRegister(4, "aux")
+    return QuantumCircuit(qreg1, qreg2, creg, areg, name=name)
+
+
+@pytest.fixture()
+def simple_qc(name: str = "simple_qc") -> QuantumCircuit:
+    num_qubits = 5
+    num_clbits = 3
+    qc = QuantumCircuit(num_qubits, num_clbits, name=name)
+    qc.h(range(num_qubits))
+    qc.cswap(2, 1, 3)
+    qc.barrier()
+    qc.sxdg(0)
+    qc.measure([3], [0])
+    qc.barrier()
+    qc.reset([4])
+    return qc
+
+
+@pytest.fixture()
+def parametrized_qc(name: str = "parametrized_qc") -> QuantumCircuit:
+    qc = QuantumCircuit(4, name=name)
+    theta = Parameter("θ")
+    qc.cu(theta, 1.040599, 0, 2, control_qubit=3, target_qubit=1)
+    return qc
+
+
+@pytest.fixture()
+def conditioned_ops_qc(name: str = "conditioned_ops_qc") -> QuantumCircuit:
+    cregs = [ClassicalRegister(1) for _ in range(2)]
+    q = QuantumRegister(3)
+    qc = QuantumCircuit(q, name=name)
+    for register in cregs:
+        qc.add_register(register)
+    qc.h(q)
+    qc.measure([q[0]], cregs[0])
+    qc.x(q[0]).c_if(cregs[0], 1)
+    qc.measure([q[1]], cregs[1])
+    qc.reset([2])
+    qc.barrier()
+    qc.measure_all()
+    return qc
diff --git a/quantum-viz/tests/resources/conditioned_ops_qc.json b/quantum-viz/tests/resources/conditioned_ops_qc.json
new file mode 100644
index 00000000..1fd4323e
--- /dev/null
+++ b/quantum-viz/tests/resources/conditioned_ops_qc.json
@@ -0,0 +1,331 @@
+{
+  "qubits": [
+    {
+      "id": 0,
+      "numChildren": 2
+    },
+    {
+      "id": 1,
+      "numChildren": 2
+    },
+    {
+      "id": 2,
+      "numChildren": 2
+    }
+  ],
+  "operations": [
+    {
+      "gate": "conditioned_ops_qc",
+      "targets": [
+        {
+          "qId": 0
+        },
+        {
+          "qId": 1
+        },
+        {
+          "qId": 2
+        }
+      ],
+      "children": [
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 0
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 1
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 1
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 2
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 2
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 2
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 0
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 0,
+              "cId": 0
+            }
+          ]
+        },
+        {
+          "gate": "Conditional",
+          "isConditional": true,
+          "controls": [
+            {
+              "type": 1,
+              "qId": 0,
+              "cId": 0
+            }
+          ],
+          "targets": [],
+          "children": [
+            {
+              "gate": "X",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(3.14, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(3.14, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "conditionalRender": 2
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 1
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 1,
+              "cId": 0
+            }
+          ]
+        },
+        {
+          "gate": "reset",
+          "targets": [
+            {
+              "qId": 2
+            }
+          ],
+          "children": [
+            {
+              "gate": "measure",
+              "isMeasurement": true,
+              "controls": [
+                {
+                  "qId": 2
+                }
+              ],
+              "targets": [
+                {
+                  "type": 1,
+                  "qId": 2,
+                  "cId": 0
+                }
+              ]
+            },
+            {
+              "gate": "Conditional",
+              "isConditional": true,
+              "controls": [
+                {
+                  "type": 1,
+                  "qId": 2,
+                  "cId": 0
+                }
+              ],
+              "targets": [],
+              "children": [
+                {
+                  "gate": "X",
+                  "targets": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "conditionalRender": 2
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 0
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 0,
+              "cId": 1
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 1
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 1,
+              "cId": 1
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 2
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 2,
+              "cId": 1
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/quantum-viz/tests/resources/empty_circ.json b/quantum-viz/tests/resources/empty_circ.json
new file mode 100644
index 00000000..d3ae0709
--- /dev/null
+++ b/quantum-viz/tests/resources/empty_circ.json
@@ -0,0 +1,9 @@
+{
+  "qubits": [],
+  "operations": [
+    {
+      "gate": "empty_circ",
+      "targets": []
+    }
+  ]
+}
diff --git a/quantum-viz/tests/resources/no_ops_qc.json b/quantum-viz/tests/resources/no_ops_qc.json
new file mode 100644
index 00000000..b6884da2
--- /dev/null
+++ b/quantum-viz/tests/resources/no_ops_qc.json
@@ -0,0 +1,35 @@
+{
+  "qubits": [
+    {
+      "id": 0
+    },
+    {
+      "id": 1
+    },
+    {
+      "id": 2
+    },
+    {
+      "id": 3
+    }
+  ],
+  "operations": [
+    {
+      "gate": "no_ops_qc",
+      "targets": [
+        {
+          "qId": 0
+        },
+        {
+          "qId": 1
+        },
+        {
+          "qId": 2
+        },
+        {
+          "qId": 3
+        }
+      ]
+    }
+  ]
+}
diff --git a/quantum-viz/tests/resources/no_ops_regs_qc.json b/quantum-viz/tests/resources/no_ops_regs_qc.json
new file mode 100644
index 00000000..06b0dedc
--- /dev/null
+++ b/quantum-viz/tests/resources/no_ops_regs_qc.json
@@ -0,0 +1,107 @@
+{
+  "qubits": [
+    {
+      "id": 0
+    },
+    {
+      "id": 1
+    },
+    {
+      "id": 2
+    },
+    {
+      "id": 3
+    },
+    {
+      "id": 4
+    },
+    {
+      "id": 5
+    },
+    {
+      "id": 6
+    },
+    {
+      "id": 7
+    },
+    {
+      "id": 8
+    },
+    {
+      "id": 9
+    },
+    {
+      "id": 10
+    },
+    {
+      "id": 11
+    },
+    {
+      "id": 12
+    },
+    {
+      "id": 13
+    },
+    {
+      "id": 14
+    },
+    {
+      "id": 15
+    }
+  ],
+  "operations": [
+    {
+      "gate": "no_ops_regs_qc",
+      "targets": [
+        {
+          "qId": 0
+        },
+        {
+          "qId": 1
+        },
+        {
+          "qId": 2
+        },
+        {
+          "qId": 3
+        },
+        {
+          "qId": 4
+        },
+        {
+          "qId": 5
+        },
+        {
+          "qId": 6
+        },
+        {
+          "qId": 7
+        },
+        {
+          "qId": 8
+        },
+        {
+          "qId": 9
+        },
+        {
+          "qId": 10
+        },
+        {
+          "qId": 11
+        },
+        {
+          "qId": 12
+        },
+        {
+          "qId": 13
+        },
+        {
+          "qId": 14
+        },
+        {
+          "qId": 15
+        }
+      ]
+    }
+  ]
+}
diff --git a/quantum-viz/tests/resources/parametrized_qc.json b/quantum-viz/tests/resources/parametrized_qc.json
new file mode 100644
index 00000000..ef50d453
--- /dev/null
+++ b/quantum-viz/tests/resources/parametrized_qc.json
@@ -0,0 +1,160 @@
+{
+  "qubits": [
+    {
+      "id": 0
+    },
+    {
+      "id": 1
+    },
+    {
+      "id": 2
+    },
+    {
+      "id": 3
+    }
+  ],
+  "operations": [
+    {
+      "gate": "parametrized_qc",
+      "targets": [
+        {
+          "qId": 0
+        },
+        {
+          "qId": 1
+        },
+        {
+          "qId": 2
+        },
+        {
+          "qId": 3
+        }
+      ],
+      "children": [
+        {
+          "gate": "U",
+          "displayArgs": "(\u03b8, 1.04, 0, 2)",
+          "isControlled": true,
+          "controls": [
+            {
+              "qId": 3
+            }
+          ],
+          "targets": [
+            {
+              "qId": 1
+            }
+          ],
+          "children": [
+            {
+              "gate": "P",
+              "displayArgs": "(2)",
+              "targets": [
+                {
+                  "qId": 3
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U",
+                  "displayArgs": "(0, 0, 2)",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "P",
+              "displayArgs": "(0.52)",
+              "targets": [
+                {
+                  "qId": 3
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U",
+                  "displayArgs": "(0, 0, 0.52)",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "P",
+              "displayArgs": "(-0.52)",
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U",
+                  "displayArgs": "(0, 0, -0.52)",
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "X",
+              "isControlled": true,
+              "controls": [
+                {
+                  "qId": 3
+                }
+              ],
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            },
+            {
+              "gate": "U",
+              "displayArgs": "(-0.5*\u03b8, 0, -0.52)",
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            },
+            {
+              "gate": "X",
+              "isControlled": true,
+              "controls": [
+                {
+                  "qId": 3
+                }
+              ],
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            },
+            {
+              "gate": "U",
+              "displayArgs": "(\u03b8/2, 1.04, 0)",
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/quantum-viz/tests/resources/simple_qc.json b/quantum-viz/tests/resources/simple_qc.json
new file mode 100644
index 00000000..9efe0f42
--- /dev/null
+++ b/quantum-viz/tests/resources/simple_qc.json
@@ -0,0 +1,967 @@
+{
+  "qubits": [
+    {
+      "id": 0
+    },
+    {
+      "id": 1
+    },
+    {
+      "id": 2
+    },
+    {
+      "id": 3,
+      "numChildren": 1
+    },
+    {
+      "id": 4,
+      "numChildren": 1
+    }
+  ],
+  "operations": [
+    {
+      "gate": "simple_qc",
+      "targets": [
+        {
+          "qId": 0
+        },
+        {
+          "qId": 1
+        },
+        {
+          "qId": 2
+        },
+        {
+          "qId": 3
+        },
+        {
+          "qId": 4
+        }
+      ],
+      "children": [
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 0
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 1
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 1
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 2
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 2
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 2
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 3
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 3
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "H",
+          "targets": [
+            {
+              "qId": 4
+            }
+          ],
+          "children": [
+            {
+              "gate": "U2",
+              "displayArgs": "(0, 3.14)",
+              "targets": [
+                {
+                  "qId": 4
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U3",
+                  "displayArgs": "(1.57, 0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 4
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 4
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "SWAP",
+          "isControlled": true,
+          "controls": [
+            {
+              "qId": 2
+            }
+          ],
+          "targets": [
+            {
+              "qId": 1
+            },
+            {
+              "qId": 3
+            }
+          ],
+          "children": [
+            {
+              "gate": "X",
+              "isControlled": true,
+              "controls": [
+                {
+                  "qId": 3
+                }
+              ],
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            },
+            {
+              "gate": "X",
+              "isControlled": true,
+              "controls": [
+                {
+                  "qId": 2
+                },
+                {
+                  "qId": 1
+                }
+              ],
+              "targets": [
+                {
+                  "qId": 3
+                }
+              ],
+              "children": [
+                {
+                  "gate": "H",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U2",
+                      "displayArgs": "(0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(1.57, 0, 3.14)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(1.57, 0, 3.14)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                },
+                {
+                  "gate": "Tdg",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(-0.79)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, -0.79)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, -0.79)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                },
+                {
+                  "gate": "T",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(0.79)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, 0.79)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, 0.79)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                },
+                {
+                  "gate": "Tdg",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(-0.79)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, -0.79)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, -0.79)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ]
+                },
+                {
+                  "gate": "T",
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(0.79)",
+                      "targets": [
+                        {
+                          "qId": 1
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, 0.79)",
+                          "targets": [
+                            {
+                              "qId": 1
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, 0.79)",
+                              "targets": [
+                                {
+                                  "qId": 1
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "T",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(0.79)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, 0.79)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, 0.79)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "H",
+                  "targets": [
+                    {
+                      "qId": 3
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U2",
+                      "displayArgs": "(0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 3
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(1.57, 0, 3.14)",
+                          "targets": [
+                            {
+                              "qId": 3
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(1.57, 0, 3.14)",
+                              "targets": [
+                                {
+                                  "qId": 3
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ]
+                },
+                {
+                  "gate": "T",
+                  "targets": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(0.79)",
+                      "targets": [
+                        {
+                          "qId": 2
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, 0.79)",
+                          "targets": [
+                            {
+                              "qId": 2
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, 0.79)",
+                              "targets": [
+                                {
+                                  "qId": 2
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "Tdg",
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U1",
+                      "displayArgs": "(-0.79)",
+                      "targets": [
+                        {
+                          "qId": 1
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U3",
+                          "displayArgs": "(0, 0, -0.79)",
+                          "targets": [
+                            {
+                              "qId": 1
+                            }
+                          ],
+                          "children": [
+                            {
+                              "gate": "U",
+                              "displayArgs": "(0, 0, -0.79)",
+                              "targets": [
+                                {
+                                  "qId": 1
+                                }
+                              ]
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "gate": "X",
+                  "isControlled": true,
+                  "controls": [
+                    {
+                      "qId": 2
+                    }
+                  ],
+                  "targets": [
+                    {
+                      "qId": 1
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "X",
+              "isControlled": true,
+              "controls": [
+                {
+                  "qId": 3
+                }
+              ],
+              "targets": [
+                {
+                  "qId": 1
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "\u221aXdg",
+          "targets": [
+            {
+              "qId": 0
+            }
+          ],
+          "children": [
+            {
+              "gate": "S",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U1",
+                  "displayArgs": "(1.57)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U3",
+                      "displayArgs": "(0, 0, 1.57)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U",
+                          "displayArgs": "(0, 0, 1.57)",
+                          "targets": [
+                            {
+                              "qId": 0
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "H",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U2",
+                  "displayArgs": "(0, 3.14)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U3",
+                      "displayArgs": "(1.57, 0, 3.14)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U",
+                          "displayArgs": "(1.57, 0, 3.14)",
+                          "targets": [
+                            {
+                              "qId": 0
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              "gate": "S",
+              "targets": [
+                {
+                  "qId": 0
+                }
+              ],
+              "children": [
+                {
+                  "gate": "U1",
+                  "displayArgs": "(1.57)",
+                  "targets": [
+                    {
+                      "qId": 0
+                    }
+                  ],
+                  "children": [
+                    {
+                      "gate": "U3",
+                      "displayArgs": "(0, 0, 1.57)",
+                      "targets": [
+                        {
+                          "qId": 0
+                        }
+                      ],
+                      "children": [
+                        {
+                          "gate": "U",
+                          "displayArgs": "(0, 0, 1.57)",
+                          "targets": [
+                            {
+                              "qId": 0
+                            }
+                          ]
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "gate": "measure",
+          "isMeasurement": true,
+          "controls": [
+            {
+              "qId": 3
+            }
+          ],
+          "targets": [
+            {
+              "type": 1,
+              "qId": 3,
+              "cId": 0
+            }
+          ]
+        },
+        {
+          "gate": "reset",
+          "targets": [
+            {
+              "qId": 4
+            }
+          ],
+          "children": [
+            {
+              "gate": "measure",
+              "isMeasurement": true,
+              "controls": [
+                {
+                  "qId": 4
+                }
+              ],
+              "targets": [
+                {
+                  "type": 1,
+                  "qId": 4,
+                  "cId": 0
+                }
+              ]
+            },
+            {
+              "gate": "Conditional",
+              "isConditional": true,
+              "controls": [
+                {
+                  "type": 1,
+                  "qId": 4,
+                  "cId": 0
+                }
+              ],
+              "targets": [],
+              "children": [
+                {
+                  "gate": "X",
+                  "targets": [
+                    {
+                      "qId": 4
+                    }
+                  ],
+                  "conditionalRender": 2
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/quantum-viz/tests/test_qiskit_parser.py b/quantum-viz/tests/test_qiskit_parser.py
new file mode 100644
index 00000000..2fda7886
--- /dev/null
+++ b/quantum-viz/tests/test_qiskit_parser.py
@@ -0,0 +1,37 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+import json
+
+from quantum_viz.qiskit_parser import qiskit2dict
+from tests.conftest import *  # noqa: F403
+
+
+def _get_snapshot(qc) -> str:
+    """
+    gets the snapshoft of the dictionary created by qiskit2dict
+
+    if a snapshot of the circuit is not found, then
+    one is automatically created and returned.
+    """
+    path = qc_to_path(qc)
+    if path.exists():
+        with open(path, "r") as fp:
+            return json.load(fp)
+    else:
+        result = qiskit2dict(qc)
+        path.write_text(json.dumps(result, indent=2))
+        return result
+
+
+def test_qviz_dict(
+    empty_qc, no_ops_qc, no_ops_regs_qc, simple_qc, parametrized_qc, conditioned_ops_qc
+) -> None:
+    for circuit in [
+        empty_qc,
+        no_ops_qc,
+        no_ops_regs_qc,
+        simple_qc,
+        parametrized_qc,
+        conditioned_ops_qc,
+    ]:
+        assert qiskit2dict(circuit) == _get_snapshot(circuit)
diff --git a/quantum-viz/tests/test_widget.py b/quantum-viz/tests/test_widget.py
index 3695f73e..b467348f 100644
--- a/quantum-viz/tests/test_widget.py
+++ b/quantum-viz/tests/test_widget.py
@@ -1,3 +1,5 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
 from unittest.mock import patch
 
 import pytest
@@ -38,7 +40,7 @@ def test_widget(circuit):
         display.assert_called_once()
         assert (
             widget.html_str("test")
-            == "\
+            == """\
 \n<script type=\"text/javascript\">\
 \nrequire.config({\
 \n    paths: {\
@@ -46,7 +48,7 @@ def test_widget(circuit):
 \n    }\
 \n});\
 \nrequire(['qviz'], function(qviz) {\
-\n    const circuit = {'qubits': [{'id': 0}, {'id': 1, 'numChildren': 1}], 'operations': [{'gate': 'H', 'targets': [{'qId': 0}]}, {'gate': 'X', 'isControlled': 'True', 'controls': [{'qId': 0}], 'targets': [{'qId': 1}]}, {'gate': 'Measure', 'isMeasurement': 'True', 'controls': [{'qId': 1}], 'targets': [{'type': 1, 'qId': 1, 'cId': 0}]}]};\
+\n    const circuit = {"qubits": [{"id": 0}, {"id": 1, "numChildren": 1}], "operations": [{"gate": "H", "targets": [{"qId": 0}]}, {"gate": "X", "isControlled": "True", "controls": [{"qId": 0}], "targets": [{"qId": 1}]}, {"gate": "Measure", "isMeasurement": "True", "controls": [{"qId": 1}], "targets": [{"type": 1, "qId": 1, "cId": 0}]}]};\
 \n    const targetDiv = document.getElementById('JSApp_test');\
 \n    if (targetDiv != null) {\
 \n        qviz.draw(circuit, targetDiv, qviz.STYLES['Default']);\
@@ -55,7 +57,7 @@ def test_widget(circuit):
 \n</script>\
 \n<div id=\"JSApp_test\"></div>\
 \n<div id=\"msg\"></div>\
-\n"
+\n"""
         )