Repository: HQSquantumsimulations/qoqo (language: python)

Issue:
fixing building docs



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3619d8e0..b9e408b2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@
 
 This changelog track changes to the qoqo project starting at version v0.5.0
 
+## 1.6.0-alpha.0
+
+### Added in 1.6.0-alpha.0
+
+* Added first bosonic operations traits and derives in `roqoqo` and `roqoqo-derive`.
+
 ## 1.5.0
 
 ### Added in 1.5.0
diff --git a/Cargo.lock b/Cargo.lock
index 262c215b..ec8d0f02 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -529,7 +529,7 @@ dependencies = [
 
 [[package]]
 name = "qoqo"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
  "bincode",
  "nalgebra",
@@ -553,7 +553,7 @@ dependencies = [
 
 [[package]]
 name = "qoqo-macros"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -651,7 +651,7 @@ dependencies = [
 
 [[package]]
 name = "roqoqo"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
  "async-trait",
  "bincode",
@@ -678,7 +678,7 @@ dependencies = [
 
 [[package]]
 name = "roqoqo-derive"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -687,7 +687,7 @@ dependencies = [
 
 [[package]]
 name = "roqoqo-test"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
  "nalgebra",
  "ndarray",
@@ -748,9 +748,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.96"
+version = "1.0.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a"
 dependencies = [
  "itoa",
  "ryu",
@@ -818,9 +818,9 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.7"
+version = "0.12.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5"
+checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac"
 
 [[package]]
 name = "test-case"
diff --git a/qoqo-macros/Cargo.toml b/qoqo-macros/Cargo.toml
index a6216a5e..3800d81f 100644
--- a/qoqo-macros/Cargo.toml
+++ b/qoqo-macros/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "qoqo-macros"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 readme = "../README.md"
diff --git a/qoqo/Cargo.toml b/qoqo/Cargo.toml
index 5a72b8b4..cdd4ae3a 100644
--- a/qoqo/Cargo.toml
+++ b/qoqo/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "qoqo"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 homepage = "https://github.com/HQSquantumsimulations/qoqo"
@@ -32,8 +32,8 @@ num-complex = "0.4"
 thiserror = "1.0"
 qoqo_calculator = { version="1.1" }
 qoqo_calculator_pyo3 = {version="1.1", default-features=false}
-qoqo-macros = {version="1.5.0", path="../qoqo-macros"}
-roqoqo = {version="1.5.0", path="../roqoqo", features=["serialize", "overrotate"]}
+qoqo-macros = {version="1.6.0-alpha.0", path="../qoqo-macros"}
+roqoqo = {version="1.6.0-alpha.0", path="../roqoqo", features=["serialize", "overrotate"]}
 numpy = "0.18"
 bincode = "1.3"
 serde_json = "1.0"
diff --git a/qoqo/pyproject.toml b/qoqo/pyproject.toml
index 7ff97ddd..1b05be9f 100644
--- a/qoqo/pyproject.toml
+++ b/qoqo/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "qoqo"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 dependencies = [
   'numpy',
   'qoqo_calculator_pyo3>=1.1',
diff --git a/qoqo/qoqo/DEPENDENCIES b/qoqo/qoqo/DEPENDENCIES
index 3a3d69d5..c0ab1530 100644
--- a/qoqo/qoqo/DEPENDENCIES
+++ b/qoqo/qoqo/DEPENDENCIES
@@ -217,6 +217,35 @@ https://github.com/cuviper/autocfg
 by Josh Stone <cuviper@gmail.com>
 Automatic cfg for Rust compiler features
 License: Apache-2.0 OR MIT
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2018 Josh Stone
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -422,35 +451,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Copyright (c) 2018 Josh Stone
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 bincode 1.3.3
@@ -491,6 +491,35 @@ by The Rust Project Developers
 A macro to generate structures which behave like bitflags.
 
 License: MIT/Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2014 The Rust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -696,35 +725,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 bytemuck 1.13.1
@@ -732,6 +732,34 @@ https://github.com/Lokathor/bytemuck
 by Lokathor <zefria@gmail.com>
 A crate for mucking around with piles of bytes.
 License: Zlib OR Apache-2.0 OR MIT
+----------------------------------------------------
+LICENSE-ZLIB:
+
+Copyright (c) 2019 Daniel "Lokathor" Gee.
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+
+----------------------------------------------------
+LICENSE-MIT:
+
+MIT License
+
+Copyright (c) 2019 Daniel "Lokathor" Gee.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -797,34 +825,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-ZLIB:
-
-Copyright (c) 2019 Daniel "Lokathor" Gee.
-
-This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
-
-2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any source distribution.
-
-----------------------------------------------------
-LICENSE-MIT:
-
-MIT License
-
-Copyright (c) 2019 Daniel "Lokathor" Gee.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 cfg-if 1.0.0
@@ -835,6 +835,35 @@ parameters. Structured like an if-else chain, the first matching branch is the
 item that gets emitted.
 
 License: MIT/Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2014 Alex Crichton
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -1040,10 +1069,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+fixedbitset 0.4.2
+https://github.com/petgraph/fixedbitset
+by bluss
+FixedBitSet is a simple bitset collection
+License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2014 Alex Crichton
+Copyright (c) 2015-2017
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -1069,13 +1105,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-fixedbitset 0.4.2
-https://github.com/petgraph/fixedbitset
-by bluss
-FixedBitSet is a simple bitset collection
-License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -1281,10 +1310,18 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+getrandom 0.2.10
+https://github.com/rust-random/getrandom
+by The Rand Project Developers
+A small cross-platform library for retrieving random data from system source
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2015-2017
+Copyright 2018 Developers of the Rand project
+Copyright (c) 2014 The Rust Project Developers
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -1310,13 +1347,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-getrandom 0.2.10
-https://github.com/rust-random/getrandom
-by The Rand Project Developers
-A small cross-platform library for retrieving random data from system source
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -1522,11 +1552,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+hashbrown 0.12.3
+https://github.com/rust-lang/hashbrown
+by Amanieu d'Antras <amanieu@gmail.com>
+A Rust port of Google's SwissTable hash map
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright 2018 Developers of the Rand project
-Copyright (c) 2014 The Rust Project Developers
+Copyright (c) 2016 Amanieu d'Antras
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -1552,13 +1588,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-hashbrown 0.12.3
-https://github.com/rust-lang/hashbrown
-by Amanieu d'Antras <amanieu@gmail.com>
-A Rust port of Google's SwissTable hash map
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -1764,12 +1793,19 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Copyright (c) 2016 Amanieu d'Antras
 
-Permission is hereby granted, free of charge, to any
+====================================================
+indexmap 1.9.3
+https://github.com/bluss/indexmap
+by 
+A hash table with consistent order and fast iteration.
+License: Apache-2.0 OR MIT
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2016--2017
+
+Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
 Software without restriction, including without
@@ -1793,13 +1829,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-indexmap 1.9.3
-https://github.com/bluss/indexmap
-by 
-A hash table with consistent order and fast iteration.
-License: Apache-2.0 OR MIT
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -2005,11 +2034,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+indoc 1.0.9
+https://github.com/dtolnay/indoc
+by David Tolnay <dtolnay@gmail.com>
+Indented document literals
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2016--2017
-
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -2034,13 +2068,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-indoc 1.0.9
-https://github.com/dtolnay/indoc
-by David Tolnay <dtolnay@gmail.com>
-Indented document literals
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -2221,6 +2248,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+itoa 1.0.6
+https://github.com/dtolnay/itoa
+by David Tolnay <dtolnay@gmail.com>
+Fast integer primitive to string conversion
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -2248,13 +2282,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-itoa 1.0.6
-https://github.com/dtolnay/itoa
-by David Tolnay <dtolnay@gmail.com>
-Fast integer primitive to string conversion
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -2435,9 +2462,19 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+libc 0.2.146
+https://github.com/rust-lang/libc
+by The Rust Project Developers
+Raw FFI bindings to platform libraries like libc.
+
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
+Copyright (c) 2014-2020 The Rust Project Developers
+
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -2462,14 +2499,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-libc 0.2.146
-https://github.com/rust-lang/libc
-by The Rust Project Developers
-Raw FFI bindings to platform libraries like libc.
-
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -2650,10 +2679,17 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+libm 0.2.7
+https://github.com/rust-lang/libm
+by Jorge Aparicio <jorge@japaric.io>
+libm in pure Rust
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2014-2020 The Rust Project Developers
+Copyright (c) 2018 Jorge Aparicio
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -2679,13 +2715,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-libm 0.2.7
-https://github.com/rust-lang/libm
-by Jorge Aparicio <jorge@japaric.io>
-libm in pure Rust
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -2891,10 +2920,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+lock_api 0.4.10
+https://github.com/Amanieu/parking_lot
+by Amanieu d'Antras <amanieu@gmail.com>
+Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std.
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2018 Jorge Aparicio
+Copyright (c) 2016 The Rust Project Developers
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -2920,13 +2956,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-lock_api 0.4.10
-https://github.com/Amanieu/parking_lot
-by Amanieu d'Antras <amanieu@gmail.com>
-Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std.
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -3132,10 +3161,21 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+matrixmultiply 0.3.7
+https://github.com/bluss/matrixmultiply/
+by bluss, R. Janis Goldschmidt
+General matrix multiplication for f32 and f64 matrices. Operates on matrices with general layout (they can use arbitrary row and column stride). Detects and uses AVX or SSE2 on x86 platforms transparently for higher performance. Uses a microkernel strategy, so that the implementation is easy to parallelize and optimize.
+
+Supports multithreading.
+License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2016 The Rust Project Developers
+Copyright (c) 2016 - 2023 Ulrik Sverdrup "bluss"
+Copyirhgt (c) 2018 R. Janis Goldschmidt
+Copyright (c) 2021 DutchGhost [constparse.rs]
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -3161,15 +3201,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-matrixmultiply 0.3.7
-https://github.com/bluss/matrixmultiply/
-by bluss, R. Janis Goldschmidt
-General matrix multiplication for f32 and f64 matrices. Operates on matrices with general layout (they can use arbitrary row and column stride). Detects and uses AVX or SSE2 on x86 platforms transparently for higher performance. Uses a microkernel strategy, so that the implementation is easy to parallelize and optimize.
-
-Supports multithreading.
-License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -3375,37 +3406,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Copyright (c) 2016 - 2023 Ulrik Sverdrup "bluss"
-Copyirhgt (c) 2018 R. Janis Goldschmidt
-Copyright (c) 2021 DutchGhost [constparse.rs]
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 memoffset 0.8.0
@@ -3661,6 +3661,37 @@ https://github.com/rust-ndarray/ndarray
 by Ulrik Sverdrup "bluss", Jim Turner
 An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting.
 License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2015 - 2021 Ulrik Sverdrup "bluss",
+			  Jim Turner,
+			  and ndarray developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -3866,12 +3897,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+num-complex 0.4.3
+https://github.com/rust-num/num-complex
+by The Rust Project Developers
+Complex numbers implementation for Rust
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2015 - 2021 Ulrik Sverdrup "bluss",
-			  Jim Turner,
-			  and ndarray developers
+Copyright (c) 2014 The Rust Project Developers
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -3897,13 +3933,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-num-complex 0.4.3
-https://github.com/rust-num/num-complex
-by The Rust Project Developers
-Complex numbers implementation for Rust
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -4109,6 +4138,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+num-integer 0.1.45
+https://github.com/rust-num/num-integer
+by The Rust Project Developers
+Integer traits and functions
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -4138,13 +4174,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-num-integer 0.1.45
-https://github.com/rust-num/num-integer
-by The Rust Project Developers
-Integer traits and functions
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -4350,6 +4379,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+num-rational 0.4.1
+https://github.com/rust-num/num-rational
+by The Rust Project Developers
+Rational numbers implementation for Rust
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -4379,13 +4415,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-num-rational 0.4.1
-https://github.com/rust-num/num-rational
-by The Rust Project Developers
-Rational numbers implementation for Rust
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -4591,6 +4620,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+num-traits 0.2.15
+https://github.com/rust-num/num-traits
+by The Rust Project Developers
+Numeric traits for generic mathematics
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -4620,13 +4656,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-num-traits 0.2.15
-https://github.com/rust-num/num-traits
-by The Rust Project Developers
-Numeric traits for generic mathematics
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -4832,46 +4861,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+numpy 0.18.0
+https://github.com/PyO3/rust-numpy
+by The rust-numpy Project Developers, PyO3 Project and Contributors <https://github.com/PyO3>
+PyO3-based Rust bindings of the NumPy C-API
+License: BSD-2-Clause
 ----------------------------------------------------
-LICENSE-MIT:
+LICENSE:
 
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
-====================================================
-numpy 0.18.0
-https://github.com/PyO3/rust-numpy
-by The rust-numpy Project Developers, PyO3 Project and Contributors <https://github.com/PyO3>
-PyO3-based Rust bindings of the NumPy C-API
-License: BSD-2-Clause
-----------------------------------------------------
-LICENSE:
-
-BSD 2-Clause License
+BSD 2-Clause License
 
 Copyright (c) 2017, Toshiki Teramura
 All rights reserved.
@@ -4904,6 +4904,33 @@ https://github.com/matklad/once_cell
 by Aleksey Kladov <aleksey.kladov@gmail.com>
 Single assignment cells and lazy values.
 License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -5109,9 +5136,18 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+parking_lot 0.12.1
+https://github.com/Amanieu/parking_lot
+by Amanieu d'Antras <amanieu@gmail.com>
+More compact and efficient implementations of the standard synchronization primitives.
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
+Copyright (c) 2016 The Rust Project Developers
+
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -5136,13 +5172,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-parking_lot 0.12.1
-https://github.com/Amanieu/parking_lot
-by Amanieu d'Antras <amanieu@gmail.com>
-More compact and efficient implementations of the standard synchronization primitives.
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -5348,6 +5377,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+parking_lot_core 0.9.8
+https://github.com/Amanieu/parking_lot
+by Amanieu d'Antras <amanieu@gmail.com>
+An advanced API for creating custom synchronization primitives.
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -5377,13 +5413,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-parking_lot_core 0.9.8
-https://github.com/Amanieu/parking_lot
-by Amanieu d'Antras <amanieu@gmail.com>
-An advanced API for creating custom synchronization primitives.
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -5589,11 +5618,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+paste 1.0.12
+https://github.com/dtolnay/paste
+by David Tolnay <dtolnay@gmail.com>
+Macros for all your token pasting needs
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2016 The Rust Project Developers
-
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -5618,13 +5652,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-paste 1.0.12
-https://github.com/dtolnay/paste
-by David Tolnay <dtolnay@gmail.com>
-Macros for all your token pasting needs
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -5805,9 +5832,18 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+petgraph 0.6.3
+https://github.com/petgraph/petgraph
+by bluss, mitchmindtree
+Graph data structure library. Provides graph types and graph algorithms.
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
+Copyright (c) 2015
+
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -5832,13 +5868,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-petgraph 0.6.3
-https://github.com/petgraph/petgraph
-by bluss, mitchmindtree
-Graph data structure library. Provides graph types and graph algorithms.
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -6044,10 +6073,17 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+ppv-lite86 0.2.17
+https://github.com/cryptocorrosion/cryptocorrosion
+by The CryptoCorrosion Contributors
+Implementation of the crypto-simd API for x86
+License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2015
+Copyright (c) 2019 The CryptoCorrosion Contributors
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -6073,13 +6109,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-ppv-lite86 0.2.17
-https://github.com/cryptocorrosion/cryptocorrosion
-by The CryptoCorrosion Contributors
-Implementation of the crypto-simd API for x86
-License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -6285,42 +6314,38 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+proc-macro-error 1.0.4
+https://gitlab.com/CreepySkeleton/proc-macro-error
+by CreepySkeleton <creepy-skeleton@yandex.ru>
+Almost drop-in replacement to panics in proc-macros
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2019 The CryptoCorrosion Contributors
+MIT License
 
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Copyright (c) 2019-2020 CreepySkeleton
 
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
 
-====================================================
-proc-macro-error 1.0.4
-https://gitlab.com/CreepySkeleton/proc-macro-error
-by CreepySkeleton <creepy-skeleton@yandex.ru>
-Almost drop-in replacement to panics in proc-macros
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -6526,6 +6551,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+proc-macro-error-attr 1.0.4
+https://gitlab.com/CreepySkeleton/proc-macro-error
+by CreepySkeleton <creepy-skeleton@yandex.ru>
+Attribute macro for proc-macro-error crate
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -6551,13 +6583,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
-
-====================================================
-proc-macro-error-attr 1.0.4
-https://gitlab.com/CreepySkeleton/proc-macro-error
-by CreepySkeleton <creepy-skeleton@yandex.ru>
-Attribute macro for proc-macro-error crate
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -6763,31 +6788,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-MIT License
-
-Copyright (c) 2019-2020 CreepySkeleton
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
 
 ====================================================
 proc-macro2 1.0.60
@@ -6796,21 +6796,48 @@ by David Tolnay <dtolnay@gmail.com>, Alex Crichton <alex@alexcrichton.com>
 A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case.
 License: MIT OR Apache-2.0
 ----------------------------------------------------
-LICENSE-APACHE:
-
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
+LICENSE-MIT:
 
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
 
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+----------------------------------------------------
+LICENSE-APACHE:
+
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
 
    "Legal Entity" shall mean the union of the acting entity and all
    other entities that control, are controlled by, or are under common
@@ -6975,33 +7002,6 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 pyo3 0.18.3
@@ -8432,7 +8432,7 @@ LICENSE:
 
 
 ====================================================
-qoqo 1.5.0
+qoqo 1.6.0-alpha.0
 https://github.com/HQSquantumsimulations/qoqo
 by HQS Quantum Simulations <info@quantumsimulations.de>
 Quantum computing circuit toolkit. Python interface of roqoqo
@@ -8644,7 +8644,7 @@ LICENSE:
 
 
 ====================================================
-qoqo-macros 1.5.0
+qoqo-macros 1.6.0-alpha.0
 by HQS Quantum Simulations <info@quantumsimulations.de>
 Macros for the qoqo crate
 License: Apache-2.0
@@ -9284,6 +9284,33 @@ https://github.com/dtolnay/quote
 by David Tolnay <dtolnay@gmail.com>
 Quasi-quoting macro quote!(...)
 License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -9464,9 +9491,20 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+rand 0.8.5
+https://rust-random.github.io/book
+by The Rand Project Developers, The Rust Project Developers
+Random number generators and other randomness functionality.
+
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
+Copyright 2018 Developers of the Rand project
+Copyright (c) 2014 The Rust Project Developers
+
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -9491,14 +9529,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-rand 0.8.5
-https://rust-random.github.io/book
-by The Rand Project Developers, The Rust Project Developers
-Random number generators and other randomness functionality.
-
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -9679,6 +9709,14 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+rand_chacha 0.3.1
+https://rust-random.github.io/book
+by The Rand Project Developers, The Rust Project Developers, The CryptoCorrosion Contributors
+ChaCha random number generator
+
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -9709,14 +9747,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-rand_chacha 0.3.1
-https://rust-random.github.io/book
-by The Rand Project Developers, The Rust Project Developers, The CryptoCorrosion Contributors
-ChaCha random number generator
-
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -9922,6 +9952,14 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+rand_core 0.6.4
+https://rust-random.github.io/book
+by The Rand Project Developers, The Rust Project Developers
+Core random number generator traits and tools for implementation.
+
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -9952,14 +9990,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-rand_core 0.6.4
-https://rust-random.github.io/book
-by The Rand Project Developers, The Rust Project Developers
-Core random number generator traits and tools for implementation.
-
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -10151,11 +10181,18 @@ APPENDIX: How to apply the Apache License to your work.
    same "printed page" as the copyright notice for easier
    identification within third-party archives.
 
+
+====================================================
+rand_distr 0.4.3
+https://rust-random.github.io/book
+by The Rand Project Developers
+Sampling from random number distributions
+
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
 Copyright 2018 Developers of the Rand project
-Copyright (c) 2014 The Rust Project Developers
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -10181,14 +10218,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-rand_distr 0.4.3
-https://rust-random.github.io/book
-by The Rand Project Developers
-Sampling from random number distributions
-
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -10380,10 +10409,21 @@ APPENDIX: How to apply the Apache License to your work.
    same "printed page" as the copyright notice for easier
    identification within third-party archives.
 
+
+====================================================
+rawpointer 0.2.1
+https://github.com/bluss/rawpointer/
+by bluss
+Extra methods for raw pointers and `NonNull<T>`.
+
+For example `.post_inc()` and `.pre_dec()` (c.f. `ptr++` and `--ptr`),
+`offset` and `add` for `NonNull<T>`, and the function `ptrdistance`.
+
+License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright 2018 Developers of the Rand project
+Copyright (c) 2015
 
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
@@ -10409,17 +10449,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-rawpointer 0.2.1
-https://github.com/bluss/rawpointer/
-by bluss
-Extra methods for raw pointers and `NonNull<T>`.
-
-For example `.post_inc()` and `.pre_dec()` (c.f. `ptr++` and `--ptr`),
-`offset` and `add` for `NonNull<T>`, and the function `ptrdistance`.
-
-License: MIT/Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -10625,35 +10654,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Copyright (c) 2015
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 redox_syscall 0.3.5
@@ -10689,7 +10689,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 ====================================================
-roqoqo 1.5.0
+roqoqo 1.6.0-alpha.0
 https://github.com/HQSquantumsimulations/qoqo
 by HQS Quantum Simulations <info@quantumsimulations.de>
 Rust Quantum Computing Toolkit by HQS
@@ -10901,7 +10901,7 @@ LICENSE:
 
 
 ====================================================
-roqoqo-derive 1.5.0
+roqoqo-derive 1.6.0-alpha.0
 by HQS Quantum Simulations <info@quantumsimulations.de>
 Macros for the roqoqo crate
 License: Apache-2.0
@@ -11112,7 +11112,7 @@ LICENSE:
 
 
 ====================================================
-roqoqo-test 1.5.0
+roqoqo-test 1.6.0-alpha.0
 https://github.com/HQSquantumsimulations/qoqo
 by HQS Quantum Simulations <info@quantumsimulations.de>
 Testing helper functions for roqoqo toolkit
@@ -11329,6 +11329,33 @@ https://github.com/rust-lang-nursery/rustc-hash
 by The Rust Project Developers
 speed, non-cryptographic hash used in rustc
 License: Apache-2.0/MIT
+----------------------------------------------------
+LICENSE-MIT:
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -11534,33 +11561,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 ryu 1.0.13
@@ -11887,6 +11887,35 @@ Defines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as
 shorthands for guards with one of the implemented strategies.
 
 License: MIT/Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2016-2019 Ulrik Sverdrup "bluss" and scopeguard developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -12092,11 +12121,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+serde 1.0.164
+https://serde.rs
+by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
+A generic serialization/deserialization framework
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2016-2019 Ulrik Sverdrup "bluss" and scopeguard developers
-
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -12121,13 +12155,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-serde 1.0.164
-https://serde.rs
-by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
-A generic serialization/deserialization framework
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -12308,6 +12335,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+serde_derive 1.0.164
+https://serde.rs
+by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
+Macros 1.1 implementation of #[derive(Serialize, Deserialize)]
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -12335,13 +12369,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-serde_derive 1.0.164
-https://serde.rs
-by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
-Macros 1.1 implementation of #[derive(Serialize, Deserialize)]
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -12522,6 +12549,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+serde_json 1.0.97
+https://github.com/serde-rs/json
+by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
+A JSON serialization file format
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -12549,13 +12583,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-serde_json 1.0.96
-https://github.com/serde-rs/json
-by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
-A JSON serialization file format
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -12736,6 +12763,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+serde_test 1.0.164
+https://serde.rs
+by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
+Token De/Serializer for testing De/Serialize implementations
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -12763,13 +12797,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-serde_test 1.0.164
-https://serde.rs
-by Erick Tryzelaar <erick.tryzelaar@gmail.com>, David Tolnay <dtolnay@gmail.com>
-Token De/Serializer for testing De/Serialize implementations
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -12950,33 +12977,6 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 simba 0.8.1
@@ -13196,6 +13196,35 @@ https://github.com/servo/rust-smallvec
 by The Servo Project Developers
 'Small vector' optimization: store up to a small number of items on the stack
 License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Copyright (c) 2018 The Servo Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -13401,11 +13430,16 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+syn 1.0.109
+https://github.com/dtolnay/syn
+by David Tolnay <dtolnay@gmail.com>
+Parser for Rust source code
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Copyright (c) 2018 The Servo Project Developers
-
 Permission is hereby granted, free of charge, to any
 person obtaining a copy of this software and associated
 documentation files (the "Software"), to deal in the
@@ -13430,13 +13464,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-syn 1.0.109
-https://github.com/dtolnay/syn
-by David Tolnay <dtolnay@gmail.com>
-Parser for Rust source code
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -13642,6 +13669,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
+
+====================================================
+syn 2.0.18
+https://github.com/dtolnay/syn
+by David Tolnay <dtolnay@gmail.com>
+Parser for Rust source code
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -13669,13 +13703,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-syn 2.0.18
-https://github.com/dtolnay/syn
-by David Tolnay <dtolnay@gmail.com>
-Parser for Rust source code
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -13856,36 +13883,9 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
-target-lexicon 0.12.7
+target-lexicon 0.12.8
 https://github.com/bytecodealliance/target-lexicon
 by Dan Gohman <sunfish@mozilla.com>
 Targeting utilities for compilers and related tools
@@ -14217,6 +14217,33 @@ https://github.com/dtolnay/thiserror
 by David Tolnay <dtolnay@gmail.com>
 derive(Error)
 License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -14397,6 +14424,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+thiserror-impl 1.0.40
+https://github.com/dtolnay/thiserror
+by David Tolnay <dtolnay@gmail.com>
+Implementation detail of the `thiserror` crate
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -14424,13 +14458,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-thiserror-impl 1.0.40
-https://github.com/dtolnay/thiserror
-by David Tolnay <dtolnay@gmail.com>
-Implementation detail of the `thiserror` crate
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -14611,43 +14638,45 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+typenum 1.16.0
+https://github.com/paholg/typenum
+by Paho Lurie-Gregg <paho@paholg.com>, Andre Bogus <bogusandre@gmail.com>
+Typenum is a Rust library for type-level numbers evaluated at
+    compile time. It currently supports bits, unsigned integers, and signed
+    integers. It also provides a type-level array of type-level numbers, but its
+    implementation is incomplete.
+License: MIT OR Apache-2.0
+----------------------------------------------------
+LICENSE:
+
+MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+The MIT License (MIT)
 
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+Copyright (c) 2014 Paho Lurie-Gregg
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
 
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
 
-====================================================
-typenum 1.16.0
-https://github.com/paholg/typenum
-by Paho Lurie-Gregg <paho@paholg.com>, Andre Bogus <bogusandre@gmail.com>
-Typenum is a Rust library for type-level numbers evaluated at
-    compile time. It currently supports bits, unsigned integers, and signed
-    integers. It also provides a type-level array of type-level numbers, but its
-    implementation is incomplete.
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -14852,35 +14881,6 @@ distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-----------------------------------------------------
-LICENSE:
-
-MIT OR Apache-2.0
-----------------------------------------------------
-LICENSE-MIT:
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Paho Lurie-Gregg
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
 
 ====================================================
 unicode-ident 1.0.9
@@ -14938,6 +14938,33 @@ shall not be used in advertising or otherwise to promote the sale,
 use or other dealings in these Data Files or Software without prior
 written authorization of the copyright holder.
 
+----------------------------------------------------
+LICENSE-MIT:
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -15118,6 +15145,13 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
 END OF TERMS AND CONDITIONS
 
+
+====================================================
+unindent 0.1.11
+https://github.com/dtolnay/indoc
+by David Tolnay <dtolnay@gmail.com>
+Remove a column of leading whitespace from a string
+License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-MIT:
 
@@ -15145,13 +15179,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
-
-====================================================
-unindent 0.1.11
-https://github.com/dtolnay/indoc
-by David Tolnay <dtolnay@gmail.com>
-Remove a column of leading whitespace from a string
-License: MIT OR Apache-2.0
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -15357,33 +15384,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 version_check 0.9.4
@@ -15391,6 +15391,29 @@ https://github.com/SergioBenitez/version_check
 by Sergio Benitez <sb@sergio.bz>
 Tiny crate to check the version of the installed/running rustc.
 License: MIT/Apache-2.0
+----------------------------------------------------
+LICENSE-MIT:
+
+The MIT License (MIT)
+Copyright (c) 2017-2018 Sergio Benitez
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
 ----------------------------------------------------
 LICENSE-APACHE:
 
@@ -15596,29 +15619,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-----------------------------------------------------
-LICENSE-MIT:
-
-The MIT License (MIT)
-Copyright (c) 2017-2018 Sergio Benitez
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
 
 ====================================================
 wasi 0.11.0+wasi-snapshot-preview1
@@ -15627,252 +15627,47 @@ by The Cranelift Project Developers
 Experimental WASI API bindings for Rust
 License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT
 ----------------------------------------------------
-LICENSE-APACHE:
+LICENSE-Apache-2.0_WITH_LLVM-exception:
 
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
 
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
 
-1. Definitions.
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
+   1. Definitions.
 
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
 
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
 
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
 
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
 
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
 
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
 
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-----------------------------------------------------
-LICENSE-Apache-2.0_WITH_LLVM-exception:
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
 
       "Derivative Works" shall mean any work, whether in Source or Object
       form, that is based on (or derived from) the Work and for which the
@@ -16082,6 +15877,211 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
+----------------------------------------------------
+LICENSE-APACHE:
+
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
 
 ====================================================
 wide 0.7.10
diff --git a/roqoqo-derive/Cargo.toml b/roqoqo-derive/Cargo.toml
index d2b3da41..96337f58 100644
--- a/roqoqo-derive/Cargo.toml
+++ b/roqoqo-derive/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "roqoqo-derive"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
diff --git a/roqoqo-derive/src/involve_modes.rs b/roqoqo-derive/src/involve_modes.rs
new file mode 100644
index 00000000..e561ffe3
--- /dev/null
+++ b/roqoqo-derive/src/involve_modes.rs
@@ -0,0 +1,130 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::{extract_fields_with_types, extract_variants_with_types};
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Data, DataEnum, DataStruct, DeriveInput, Ident};
+
+/// Dispatch to derive InvolveModes for enums and structs
+pub fn dispatch_struct_enum(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(ds) => involve_modes_struct(ds, ident),
+        Data::Enum(de) => involve_modes_enum(de, ident),
+        _ => panic!("InvolveModes can only be derived on structs and enums"),
+    }
+}
+
+/// Create the TokenStream of the InvolveModes trait for enums
+/// This derive delegates the invocations of the involved_modes function to all possible variants via match arms
+fn involve_modes_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let variants_with_type = extract_variants_with_types(de).into_iter();
+    let match_quotes = variants_with_type.map(|(vident, _, _)| {
+        quote! {
+            &#ident::#vident(ref inner) => {InvolveModes::involved_modes(&(*inner))},
+        }
+    });
+
+    quote! {
+        #[automatically_derived]
+        /// Implements [InvolveModes] trait for the modes involved in this Operation.
+        impl InvolveModes for #ident{
+            fn involved_modes(&self) -> InvolvedModes {
+                match self{
+                    #(#match_quotes)*
+                    _ => panic!("Unexpectedly cannot match variant")
+                }
+            }
+        }
+    }
+}
+
+/// Generate the TokenStream of the implementation of InvolveModes for structs
+fn involve_modes_struct(ds: DataStruct, ident: Ident) -> TokenStream {
+    // We only allow structs with named fields
+    // Extract named fields with match and panic if fields are not named
+    let fields_with_type = extract_fields_with_types(ds).into_iter();
+
+    // Bool values that show if there is a mode field, mode_0 field etc. in the struct
+    let mut mode: bool = false;
+    let mut mode_0: bool = false;
+    let mut mode_1: bool = false;
+
+    // Iterating over the fields in the struct and setting the bool values to true if the field is
+    // in the struct
+    for (fid, type_string, _) in fields_with_type {
+        // Matching the name to see if we need to set one to true
+        match fid.clone().to_string().as_str() {
+            "mode" => {
+                if type_string == Some("usize".to_string()) {
+                    mode = true
+                } else {
+                    panic!("Field mode must have type usize")
+                }
+            }
+            "mode_0" => {
+                if type_string == Some("usize".to_string()) {
+                    mode_0 = true;
+                } else {
+                    panic!("Field mode_0 must have type usize")
+                }
+            }
+            "mode_1" => {
+                if type_string == Some("usize".to_string()) {
+                    mode_1 = true;
+                } else {
+                    panic!("Field mode_1 must have type usize")
+                }
+            }
+            _ => {}
+        };
+    }
+    if mode {
+        if mode_0 || mode_1 {
+            panic!("When deriving InvolveModes, mode field is not compatible with mode_0 or mode_1 fields");
+        };
+        // Creating a function that puts exactly one bosonic mode `mode` into the InvolvedModes HashSet
+        quote! {
+            /// Implements [InvolveModes] trait for the bosonic modes involved in this Operation.
+            #[automatically_derived]
+            impl InvolveModes for #ident{
+                /// Returns a list of all involved bosonic modes.
+                fn involved_modes(&self) -> InvolvedModes {
+                    let mut new_hash_set: std::collections::HashSet<usize> = std::collections::HashSet::new();
+                    new_hash_set.insert(self.mode);
+                    InvolvedModes::Set(new_hash_set)
+                }
+            }
+        }
+    } else if mode_0 || mode_1 {
+        if !(mode_0 && mode_1) {
+            panic!("When deriving InvolveModes mode_0 and mode_1 fields have to both be present");
+        };
+        // Creating a function that puts bosonic modes `mode_0` and `mode_1` into the InvolvedModes HashSet
+        quote! {
+            /// Implements [InvolveModes] trait for the bosonic modes involved in this Operation.
+            #[automatically_derived]
+            impl InvolveModes for #ident{
+                /// Returns a list of all involved bosonic modes.
+                fn involved_modes(&self) -> InvolvedModes {
+                    let mut new_hash_set: std::collections::HashSet<usize> = std::collections::HashSet::new();
+                    new_hash_set.insert(self.mode_0);
+                    new_hash_set.insert(self.mode_1);
+                    InvolvedModes::Set(new_hash_set)
+                }
+            }
+        }
+    } else {
+        panic!("To derive InvolveModes mode, mode_0 or mode_1 fields need to be present in struct")
+    }
+}
diff --git a/roqoqo-derive/src/lib.rs b/roqoqo-derive/src/lib.rs
index ecaf5c69..659f5960 100644
--- a/roqoqo-derive/src/lib.rs
+++ b/roqoqo-derive/src/lib.rs
@@ -18,19 +18,24 @@ use syn::{
     parse_macro_input, DataEnum, DataStruct, DeriveInput, Fields, GenericArgument, Ident,
     PathArguments, Type, TypePath,
 };
+mod involve_modes;
 mod involve_qubits;
 mod operate;
+mod operate_n_mode;
 mod operate_n_qubit;
 mod operate_unitary;
+mod operate_unitary_modes;
 mod substitute;
+mod substitute_modes;
 mod supported_version;
 
 /// Array of field names that are reserved for use with specific traits
-const RESERVED_FIELDS: &[&str; 11] = &[
+const RESERVED_FIELDS: &[&str; 15] = &[
     "qubit",
     "control",
+    "control_0",
+    "control_1",
     "target",
-    "theta",
     "qubits",
     "global_phase",
     "alpha_r",
@@ -38,6 +43,9 @@ const RESERVED_FIELDS: &[&str; 11] = &[
     "beta_r",
     "beta_i",
     "name",
+    "mode",
+    "mode_0",
+    "mode_1",
 ];
 
 /// Derive macro for the InvolveQubits trait
@@ -182,6 +190,55 @@ pub fn derive_operate_multi_qubit_gate(input: proc_macro::TokenStream) -> proc_m
     operate_unitary::dispatch_struct_enum_multi_qubit_gate(parsed_input).into()
 }
 
+/// Derive macro for the InvolveModes trait
+#[proc_macro_derive(InvolveModes)]
+pub fn derive_involve_modes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    involve_modes::dispatch_struct_enum(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::SubstituteModes] trait
+#[proc_macro_derive(SubstituteModes)]
+pub fn derive_substitute_modes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    substitute_modes::dispatch_struct_enum(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::OperateSingleQubit] trait
+#[proc_macro_derive(OperateSingleMode)]
+pub fn derive_operate_single_mode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    operate_n_mode::dispatch_struct_enum_single_mode(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::OperateTwoMode] trait
+#[proc_macro_derive(OperateTwoMode)]
+pub fn derive_operate_two_mode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    operate_n_mode::dispatch_struct_enum_two_mode(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::OperateModeGate] trait
+#[proc_macro_derive(OperateModeGate)]
+pub fn derive_operate_mode_gate(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    operate_unitary_modes::dispatch_struct_enum_operate_mode_gate(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::OperateSingleModeGate] trait
+#[proc_macro_derive(OperateSingleModeGate)]
+pub fn derive_operate_single_mode_gate(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    operate_unitary_modes::dispatch_struct_enum_single_mode_gate(parsed_input).into()
+}
+
+/// Derive macro for the [roqoqo::OperateTwoModeGate] trait
+#[proc_macro_derive(OperateTwoModeGate)]
+pub fn derive_operate_two_mode_gate(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+    let parsed_input = parse_macro_input!(input as DeriveInput);
+    operate_unitary_modes::dispatch_struct_enum_two_mode_gate(parsed_input).into()
+}
+
 fn extract_fields_with_types(ds: DataStruct) -> Vec<(Ident, Option<String>, Type)> {
     let fields = match ds {
         DataStruct {
diff --git a/roqoqo-derive/src/operate.rs b/roqoqo-derive/src/operate.rs
index 3badb70e..dd4e723b 100644
--- a/roqoqo-derive/src/operate.rs
+++ b/roqoqo-derive/src/operate.rs
@@ -215,7 +215,7 @@ fn operate_qubits_struct(ds: DataStruct, ident: Ident) -> TokenStream {
             #[inline]
             fn is_parametrized(&self) -> bool {
                     // Leading false is necessary for constant operations that are never parametrized
-                    (#(#is_parametrized_fields)&&*)
+                    (#(#is_parametrized_fields)||*)
             }
             /// Returns tags classifying the type of the Operation.
             #[inline]
diff --git a/roqoqo-derive/src/operate_n_mode.rs b/roqoqo-derive/src/operate_n_mode.rs
new file mode 100644
index 00000000..15a327e3
--- /dev/null
+++ b/roqoqo-derive/src/operate_n_mode.rs
@@ -0,0 +1,178 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Data, DataEnum, DeriveInput, Fields, Ident};
+
+/// Dispatch to derive OperateSingleMode for enums and structs
+pub fn dispatch_struct_enum_single_mode(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(_ds) => operate_single_mode_struct(ident),
+        Data::Enum(de) => operate_single_mode_enum(de, ident),
+        _ => panic!("OperateSingleMode can only be derived on structs and enums"),
+    }
+}
+
+fn operate_single_mode_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let DataEnum { variants, .. } = de;
+    let match_quotes = variants.into_iter().map(|v| {
+        // vident is the name of the variant
+        let vident = v.ident.clone();
+        // fields are the fields in one variant
+        // Here we are very restrictive, we only want to allow enums of the form
+        // enum SingleModeGate{
+        //      Squeezing(Squeezing),
+        // }
+        // where the variants are so called newtype structs (structs with exactly one unnamed field)
+        // This kind of enum is enough to represent our enum_dispatch-like structure of enums collecting different Operations
+
+        // We match the fields in the variant,
+        let fields = match v.fields {
+            Fields::Unnamed(fields) => fields,
+            // and panic when the fields are not unnamed,
+            _ => panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            ),
+        };
+        // and panic when there is more than one field, ensuring newtype structs.
+        if fields.unnamed.iter().len() != 1 {
+            panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            )
+        }
+        quote! {
+            &#ident::#vident(ref inner) => {OperateSingleMode::mode(&(*inner))},
+        }
+    });
+    quote! {
+        /// Implements [OperateSingleMode] trait for this Operation acting on exactly one bosonic mode.
+        #[automatically_derived]
+        impl OperateSingleMode for #ident{
+            /// Returns bosonic `mode` the Operation acts on.
+            fn mode(&self) -> &usize {
+                match self {
+                    #(#match_quotes)*
+                    _ => panic!("Unexpectedly cannot match variant")
+                }
+            }
+        }
+    }
+}
+
+/// Generate TokenStream of implementation of OperateSingleMode for structs
+fn operate_single_mode_struct(ident: Ident) -> TokenStream {
+    quote! {
+        /// Implements [OperateSingleMode] trait for this Operation acting on exactly one bosonic mode.
+        #[automatically_derived]
+        impl OperateSingleMode for #ident{
+            /// Returns bosonic `mode` the Operation acts on.
+            fn mode(&self) -> &usize {
+                &self.mode
+            }
+        }
+
+    }
+}
+
+/// Dispatch to derive OperateTwoMode for enums and structs
+pub fn dispatch_struct_enum_two_mode(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(_ds) => operate_two_mode_struct(ident),
+        Data::Enum(de) => operate_two_mode_enum(de, ident),
+        // There can be other objects that are valid Derive inputs, but we define our macro only for structs and enums
+        _ => panic!("OperateTwoMode can only be derived on structs and enums"),
+    }
+}
+
+fn operate_two_mode_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let DataEnum { variants, .. } = de;
+    let mode_0_quotes = variants.clone().into_iter().map(|v| {
+        let vident = v.ident.clone();
+
+        // We match the fields in the variant,
+        let fields = match v.fields {
+            Fields::Unnamed(fields) => fields,
+            // and panic when the fields are not unnamed,
+            _ => panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            ),
+        };
+        // and panic when there is more than one field, ensuring newtype structs.
+        if fields.unnamed.iter().len() != 1 {
+            panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            )
+        }
+        quote! {
+            &#ident::#vident(ref inner) => {OperateTwoMode::mode_0(&(*inner))},
+        }
+    });
+    let mode_1_quotes = variants.into_iter().map(|v| {
+        let vident = v.ident.clone();
+        let fields = match v.fields {
+            Fields::Unnamed(fields) => fields,
+            _ => panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            ),
+        };
+        if fields.unnamed.iter().len() != 1 {
+            panic!(
+                "OperateSingleMode can only be derived for enums with newtype structs as variants"
+            )
+        }
+        quote! {
+            &#ident::#vident(ref inner) => {OperateTwoMode::mode_1(&(*inner))},
+        }
+    });
+    quote! {
+        #[automatically_derived]
+        /// Trait for Operations acting on exactly two bosonic modes.
+        impl OperateTwoMode for #ident{
+            /// Returns bosonic mode `mode_0` of the two-bosonic mode Operation.
+            fn mode_0(&self) -> &usize {
+                match self{
+                    #(#mode_0_quotes)*
+                    _ => panic!("Unexpectedly cannot match variant")
+                }
+            }
+            /// Returns bosonic mode `mode_1` of the two-bosonic mode Operation.
+            fn mode_1(&self) -> &usize {
+                match self{
+                    #(#mode_1_quotes)*
+                    _ => panic!("Unexpectedly cannot match variant")
+                }
+            }
+        }
+    }
+}
+
+/// Generate TokenStream of implementation of OperateSingleMode for structs
+fn operate_two_mode_struct(ident: Ident) -> TokenStream {
+    quote! {
+        #[automatically_derived]
+        /// Trait for Operations acting on exactly two bosonic modes.
+        impl OperateTwoMode for #ident{
+            /// Returns bosonic mode `mode_0` of the two-bosonic mode Operation.
+            fn mode_0(&self ) -> &usize {
+                &self.mode_0
+            }
+            /// Returns bosonic mode `mode_1` of the two-bosonic mode Operation.
+            fn mode_1(&self) -> &usize {
+                &self.mode_1
+            }
+        }
+
+    }
+}
diff --git a/roqoqo-derive/src/operate_unitary.rs b/roqoqo-derive/src/operate_unitary.rs
index e24cffc0..499a64d2 100644
--- a/roqoqo-derive/src/operate_unitary.rs
+++ b/roqoqo-derive/src/operate_unitary.rs
@@ -20,7 +20,7 @@ pub fn dispatch_struct_enum_operate_gate(input: DeriveInput) -> TokenStream {
     match input.data {
         Data::Struct(_ds) => operate_gate_struct(ident),
         Data::Enum(de) => operate_gate_enum(de, ident),
-        _ => panic!("OperateGate can only be derived on enums"),
+        _ => panic!("OperateGate can only be derived on structs and enums"),
     }
 }
 
diff --git a/roqoqo-derive/src/operate_unitary_modes.rs b/roqoqo-derive/src/operate_unitary_modes.rs
new file mode 100644
index 00000000..de832553
--- /dev/null
+++ b/roqoqo-derive/src/operate_unitary_modes.rs
@@ -0,0 +1,96 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::extract_variants_with_types;
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Data, DataEnum, DeriveInput, Ident};
+
+pub fn dispatch_struct_enum_operate_mode_gate(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(_ds) => operate_mode_gate_struct(ident),
+        Data::Enum(de) => operate_mode_gate_enum(de, ident),
+        _ => panic!("OperateModeGate can only be derived on structs and enums"),
+    }
+}
+
+fn operate_mode_gate_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let _variants_with_type = extract_variants_with_types(de).into_iter();
+    quote! {
+        #[automatically_derived]
+        impl OperateModeGate for #ident{
+        }
+    }
+}
+
+fn operate_mode_gate_struct(ident: Ident) -> TokenStream {
+    quote! {
+        #[automatically_derived]
+        impl OperateModeGate for #ident{
+        }
+    }
+}
+
+/// Dispatch to derive OperateSingleModeGate for enums and structs
+pub fn dispatch_struct_enum_single_mode_gate(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(_ds) => single_mode_gate_struct(ident),
+        Data::Enum(de) => single_mode_gate_enum(de, ident),
+        _ => panic!("OperateSingleMode can only be derived on structs and enums"),
+    }
+}
+
+fn single_mode_gate_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let _variants_with_type = extract_variants_with_types(de).into_iter();
+    quote! {
+        #[automatically_derived]
+        impl OperateSingleModeGate for #ident{
+        }
+
+    }
+}
+
+fn single_mode_gate_struct(ident: Ident) -> TokenStream {
+    quote! {
+        #[automatically_derived]
+        impl OperateSingleModeGate for #ident{
+        }
+    }
+}
+
+pub fn dispatch_struct_enum_two_mode_gate(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(_ds) => two_mode_gate_struct(ident),
+        Data::Enum(de) => two_mode_gate_enum(de, ident),
+        _ => panic!("OperateTwoModeGate can only be derived on structs and enums"),
+    }
+}
+
+fn two_mode_gate_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let _variants_with_type = extract_variants_with_types(de).into_iter();
+    quote! {
+        #[automatically_derived]
+        impl OperateTwoModeGate for #ident{
+        }
+    }
+}
+
+fn two_mode_gate_struct(ident: Ident) -> TokenStream {
+    quote! {
+        #[automatically_derived]
+        impl OperateTwoModeGate for #ident{
+        }
+    }
+}
diff --git a/roqoqo-derive/src/substitute.rs b/roqoqo-derive/src/substitute.rs
index 254980fb..bed86f8d 100644
--- a/roqoqo-derive/src/substitute.rs
+++ b/roqoqo-derive/src/substitute.rs
@@ -21,7 +21,7 @@ pub fn dispatch_struct_enum(input: DeriveInput) -> TokenStream {
     match input.data {
         Data::Struct(ds) => substitute_struct(ds, ident),
         Data::Enum(de) => substitute_enum(de, ident),
-        _ => panic!("InvolveQubits can only be derived on structs and enums"),
+        _ => panic!("Substitute can only be derived on structs and enums"),
     }
 }
 
diff --git a/roqoqo-derive/src/substitute_modes.rs b/roqoqo-derive/src/substitute_modes.rs
new file mode 100644
index 00000000..df6d9d4e
--- /dev/null
+++ b/roqoqo-derive/src/substitute_modes.rs
@@ -0,0 +1,78 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::{extract_fields_with_types, extract_variants_with_types};
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Data, DataEnum, DataStruct, DeriveInput, Ident};
+
+/// Dispatch to derive SubstituteModes for enums and structs
+pub fn dispatch_struct_enum(input: DeriveInput) -> TokenStream {
+    let ident = input.ident;
+    match input.data {
+        Data::Struct(ds) => substitute_modes_struct(ds, ident),
+        Data::Enum(de) => substitute_modes_enum(de, ident),
+        _ => panic!("SubstituteModes can only be derived on structs and enums"),
+    }
+}
+
+/// Create the TokenStream the SubstituteModes trait for enums
+fn substitute_modes_enum(de: DataEnum, ident: Ident) -> TokenStream {
+    let variants_with_type = extract_variants_with_types(de).into_iter();
+
+    let remap_quotes = variants_with_type.map(|(vident, _ ,_)| {
+        quote! {
+            &#ident::#vident(ref inner) => {Ok(#ident::#vident(SubstituteModes::remap_modes(&(*inner), mapping)?))},
+        }
+    });
+
+    let bremap = quote! {
+        /// Remaps the bosonic modes in clone of the operation.
+        fn remap_modes(&self, mapping: &std::collections::HashMap<usize, usize>) -> Result<Self, RoqoqoError> {
+            match self{
+                #(#remap_quotes)*
+                _ => panic!("Unexpectedly cannot match variant")
+            }
+        }
+    };
+    quote! {
+        /// Implements [SubstituteModes] trait allowing to perform bosonic mode mappings.
+        #[automatically_derived]
+        impl SubstituteModes for #ident{
+            #bremap
+        }
+
+    }
+}
+
+/// Generate TokenStream of implementation of Operate for structs
+fn substitute_modes_struct(ds: DataStruct, ident: Ident) -> TokenStream {
+    let fields_with_type = extract_fields_with_types(ds).into_iter();
+
+    let remap_quote = fields_with_type.map(|(fid, _, _)| match fid.to_string().as_str() {
+        "mode" => quote! {*mapping.get(&self.mode).unwrap_or(&self.mode)},
+        "mode_0" => quote! {*mapping.get(&self.mode_0).unwrap_or(&self.mode_0)},
+        "mode_1" => quote! {*mapping.get(&self.mode_1).unwrap_or(&self.mode_1)},
+        _ => quote! {(self).#fid.clone()},
+    });
+    quote! {
+        /// Implements [SubstituteModes] trait allowing to perform bosonic mode mappings.
+        #[automatically_derived]
+        impl SubstituteModes for #ident{
+            /// Remaps the modes in clone of the operation.
+            fn remap_modes(&self, mapping: &std::collections::HashMap<usize, usize>) -> Result<Self, RoqoqoError>{
+                crate::operations::check_valid_mapping(mapping)?;
+                Ok(Self::new(#(#remap_quote),*))
+            }
+        }
+    }
+}
diff --git a/roqoqo/Cargo.toml b/roqoqo/Cargo.toml
index aa5b6f38..230ff071 100644
--- a/roqoqo/Cargo.toml
+++ b/roqoqo/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "roqoqo"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
@@ -28,7 +28,7 @@ num-complex = { version = "0.4"}
 thiserror = "1.0"
 dyn-clone = {version="1.0", optional=true}
 qoqo_calculator = { version="1.1"}
-roqoqo-derive = {version="1.5.0", path="../roqoqo-derive"}
+roqoqo-derive = {version="1.6.0-alpha.0", path="../roqoqo-derive"}
 typetag = {version="0.2", optional=true}
 nalgebra = "0.32"
 # schemars = { version="0.8", features = ["num-complex", "ndarray"], optional=true }
diff --git a/roqoqo/build.rs b/roqoqo/build.rs
index 4c0392d1..0d0d0601 100644
--- a/roqoqo/build.rs
+++ b/roqoqo/build.rs
@@ -21,7 +21,7 @@ use syn::punctuated::Punctuated;
 use syn::visit::{self, Visit};
 use syn::{AttrStyle, File, Ident, ItemImpl, ItemStruct, Path, Token, Type, TypePath};
 
-const NUMBER_OF_MINOR_VERSIONS: usize = 6;
+const NUMBER_OF_MINOR_VERSIONS: usize = 7;
 
 /// Visitor scanning rust source code for struct belonging to enums
 struct Visitor {
@@ -59,6 +59,16 @@ struct Visitor {
     multi_qubit_gate_operations: Vec<Ident>,
     // Register of minor point version Operation was introduced in.
     roqoqo_version_register: HashMap<Ident, usize>,
+    // Identifiers of structs belonging to ModeGateOperation enum
+    mode_gate_operations: Vec<Ident>,
+    // Identifiers of structs belonging to SingleModeOperation enum
+    single_mode_operations: Vec<Ident>,
+    // Identifiers of structs belonging to TwoModeOperation enum
+    two_mode_operations: Vec<Ident>,
+    // Identifiers of structs belonging to SingleModeGateOperation enum
+    single_mode_gate_operations: Vec<Ident>,
+    // Identifiers of structs belonging to TwoModeGateOperation enum
+    two_mode_gate_operations: Vec<Ident>,
 }
 
 impl Visitor {
@@ -81,6 +91,11 @@ impl Visitor {
             three_qubit_gate_operations: Vec::new(),
             multi_qubit_gate_operations: Vec::new(),
             roqoqo_version_register: HashMap::new(),
+            mode_gate_operations: Vec::new(),
+            single_mode_operations: Vec::new(),
+            two_mode_operations: Vec::new(),
+            single_mode_gate_operations: Vec::new(),
+            two_mode_gate_operations: Vec::new(),
         }
     }
 
@@ -202,19 +217,40 @@ impl<'ast> Visit<'ast> for Visitor {
                 if parsed_arguments.contains("OperateSingleQubitGate") {
                     self.single_qubit_gate_operations.push(i.ident.clone());
                 }
-                if parsed_arguments.contains("OperateGate")
-                    && parsed_arguments.contains("OperateTwoQubit")
-                {
+                if parsed_arguments.contains("OperateTwoQubitGate") {
                     self.two_qubit_gate_operations.push(i.ident.clone());
                 }
-                if parsed_arguments.contains("OperateGate")
-                    && parsed_arguments.contains("OperateThreeQubit")
-                {
+                if parsed_arguments.contains("OperateThreeQubitGate") {
                     self.three_qubit_gate_operations.push(i.ident.clone());
                 }
                 if parsed_arguments.contains("OperateMultiQubitGate") {
                     self.multi_qubit_gate_operations.push(i.ident.clone());
                 }
+                if parsed_arguments.contains("Operate")
+                    && parsed_arguments.contains("OperateModeGate")
+                {
+                    self.mode_gate_operations.push(i.ident.clone());
+                }
+                if parsed_arguments.contains("Operate")
+                    && parsed_arguments.contains("OperateSingleMode")
+                {
+                    self.single_mode_operations.push(i.ident.clone());
+                }
+                if parsed_arguments.contains("Operate")
+                    && parsed_arguments.contains("OperateTwoMode")
+                {
+                    self.two_mode_operations.push(i.ident.clone());
+                }
+                if parsed_arguments.contains("Operate")
+                    && parsed_arguments.contains("OperateSingleModeGate")
+                {
+                    self.single_mode_gate_operations.push(i.ident.clone());
+                }
+                if parsed_arguments.contains("Operate")
+                    && parsed_arguments.contains("OperateTwoModeGate")
+                {
+                    self.two_mode_gate_operations.push(i.ident.clone());
+                }
             }
         }
 
@@ -247,6 +283,18 @@ impl<'ast> Visit<'ast> for Visitor {
                 if trait_name.as_str() == "Operate" {
                     self.operations.push(id.clone());
                 }
+                if trait_name.as_str() == "OperateSingleQubit" {
+                    self.single_qubit_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateTwoQubit" {
+                    self.two_qubit_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateThreeQubit" {
+                    self.three_qubit_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateMultiQubit" {
+                    self.multi_qubit_operations.push(id.clone());
+                }
                 if trait_name.as_str() == "ImplementedIn1point1" {
                     self.roqoqo_version_register.insert(id.clone(), 1);
                 }
@@ -262,6 +310,9 @@ impl<'ast> Visit<'ast> for Visitor {
                 if trait_name.as_str() == "ImplementedIn1point5" {
                     self.roqoqo_version_register.insert(id.clone(), 5);
                 }
+                if trait_name.as_str() == "ImplementedIn1point6" {
+                    self.roqoqo_version_register.insert(id.clone(), 6);
+                }
                 if trait_name.as_str() == "OperateSingleQubitGate" {
                     self.single_qubit_gate_operations.push(id.clone());
                 }
@@ -281,7 +332,22 @@ impl<'ast> Visit<'ast> for Visitor {
                     self.pragma_noise_proba_operations.push(id.clone());
                 }
                 if trait_name.as_str() == "OperateMultiQubitGate" {
-                    self.multi_qubit_gate_operations.push(id);
+                    self.multi_qubit_gate_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateModeGate" {
+                    self.mode_gate_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateSingleMode" {
+                    self.single_mode_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateTwoMode" {
+                    self.two_mode_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateSingleModeGate" {
+                    self.single_mode_gate_operations.push(id.clone());
+                }
+                if trait_name.as_str() == "OperateTwoModeGate" {
+                    self.two_mode_gate_operations.push(id);
                 }
             }
         }
@@ -297,6 +363,7 @@ const SOURCE_FILES: &[&str] = &[
     "src/operations/multi_qubit_gate_operations.rs",
     "src/operations/measurement_operations.rs",
     "src/operations/define_operations.rs",
+    "src/operations/bosonic_operations.rs",
 ];
 
 fn main() {
@@ -318,6 +385,7 @@ fn main() {
 
         operations_quotes.extend(res)
     }
+
     // Construct TokenStreams for variants of operation enum
     let mut single_qubit_operations_quotes: Vec<proc_macro2::TokenStream> = Vec::new();
     for i in 0..NUMBER_OF_MINOR_VERSIONS {
@@ -435,6 +503,48 @@ fn main() {
         multi_qubit_gate_operations_quote.extend(res);
     }
 
+    // Construct TokenStreams for variants of pragma enum
+    let mut mode_gate_operations_quotes: Vec<proc_macro2::TokenStream> = Vec::new();
+    for i in 0..NUMBER_OF_MINOR_VERSIONS {
+        let res: Vec<proc_macro2::TokenStream> =
+            build_quotes(&vis, i, vis.mode_gate_operations.clone());
+        mode_gate_operations_quotes.extend(res);
+    }
+
+    // Construct TokenStreams for variants of operation enum
+    let mut single_mode_operations_quotes: Vec<proc_macro2::TokenStream> = Vec::new();
+    for i in 0..NUMBER_OF_MINOR_VERSIONS {
+        let res: Vec<proc_macro2::TokenStream> =
+            build_quotes(&vis, i, vis.single_mode_operations.clone());
+
+        single_mode_operations_quotes.extend(res);
+    }
+
+    // Construct TokenStreams for variants of operation enum
+    let mut two_mode_operations_quotes: Vec<proc_macro2::TokenStream> = Vec::new();
+    for i in 0..NUMBER_OF_MINOR_VERSIONS {
+        let res: Vec<proc_macro2::TokenStream> =
+            build_quotes(&vis, i, vis.two_mode_operations.clone());
+
+        two_mode_operations_quotes.extend(res);
+    }
+
+    // Construct TokenStreams for variants of operation enum
+    let mut single_mode_gate_operations_quote: Vec<proc_macro2::TokenStream> = Vec::new();
+    for i in 0..NUMBER_OF_MINOR_VERSIONS {
+        let res: Vec<proc_macro2::TokenStream> =
+            build_quotes(&vis, i, vis.single_mode_gate_operations.clone());
+        single_mode_gate_operations_quote.extend(res);
+    }
+
+    // Construct TokenStreams for variants of operation enum
+    let mut two_mode_gate_operations_quote: Vec<proc_macro2::TokenStream> = Vec::new();
+    for i in 0..NUMBER_OF_MINOR_VERSIONS {
+        let res: Vec<proc_macro2::TokenStream> =
+            build_quotes(&vis, i, vis.two_mode_gate_operations.clone());
+        two_mode_gate_operations_quote.extend(res);
+    }
+
     // Construct TokenStream for auto-generated rust file containing the enums
     let final_quote = quote! {
 
@@ -578,7 +688,7 @@ fn main() {
         }
 
         /// Enum of all Operations implementing [OperateMultiQubitGate]
-        #[derive(Debug, Clone, PartialEq, InvolveQubits, Operate, OperateTryFromEnum, Substitute, OperateGate, OperateMultiQubit, OperateMultiQubitGate,  SupportedVersion)]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, Operate, OperateTryFromEnum, Substitute, OperateGate, OperateMultiQubit, OperateMultiQubitGate, SupportedVersion)]
         #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
         // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
         #[non_exhaustive]
@@ -586,6 +696,51 @@ fn main() {
             #(#multi_qubit_gate_operations_quote),*
         }
 
+        /// Enum of all Operations implementing [OperateModeGate]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, InvolveModes, Operate, OperateTryFromEnum, Substitute, SubstituteModes, OperateModeGate,SupportedVersion)]
+        #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+        // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
+        #[non_exhaustive]
+        pub enum ModeGateOperation {
+            #(#mode_gate_operations_quotes),*
+        }
+
+        /// Enum of all Operations implementing [OperateSingleMode]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, InvolveModes, Operate, OperateTryFromEnum, Substitute, SubstituteModes, OperateSingleMode,SupportedVersion)]
+        #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+        // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
+        #[non_exhaustive]
+        pub enum SingleModeOperation {
+            #(#single_mode_operations_quotes),*
+        }
+
+        /// Enum of all Operations implementing [OperateTwoMode]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, InvolveModes, Operate, OperateTryFromEnum, Substitute, SubstituteModes, OperateTwoMode, SupportedVersion)]
+        #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+        // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
+        #[non_exhaustive]
+        pub enum TwoModeOperation {
+            #(#two_mode_operations_quotes),*
+        }
+
+        /// Enum of all Operations implementing [OperateSingleModeGate]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, InvolveModes, Operate, OperateTryFromEnum, Substitute, SubstituteModes, OperateModeGate, OperateSingleMode, OperateSingleModeGate, SupportedVersion)]
+        #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+        // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
+        #[non_exhaustive]
+        pub enum SingleModeGateOperation {
+            #(#single_mode_gate_operations_quote),*
+        }
+
+        /// Enum of all Operations implementing [OperateTwoModeGate]
+        #[derive(Debug, Clone, PartialEq, InvolveQubits, InvolveModes, Operate, OperateTryFromEnum, Substitute, SubstituteModes, OperateModeGate, OperateTwoMode, OperateTwoModeGate, SupportedVersion)]
+        #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+        // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
+        #[non_exhaustive]
+        pub enum TwoModeGateOperation {
+            #(#two_mode_gate_operations_quote),*
+        }
+
     };
     let final_str = format!("{}", final_quote);
     let out_dir = PathBuf::from(
diff --git a/roqoqo/src/operations/bosonic_operations.rs b/roqoqo/src/operations/bosonic_operations.rs
new file mode 100644
index 00000000..56bd6a43
--- /dev/null
+++ b/roqoqo/src/operations/bosonic_operations.rs
@@ -0,0 +1,215 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use std::collections::HashSet;
+
+use crate::operations::{
+    ImplementedIn1point6, InvolveModes, InvolveQubits, InvolvedClassical, InvolvedModes,
+    InvolvedQubits, Operate, OperateModeGate, OperateSingleMode, OperateSingleModeGate,
+    OperateTwoMode, OperateTwoModeGate, Substitute, SubstituteModes, SupportedVersion,
+};
+use crate::RoqoqoError;
+use qoqo_calculator::CalculatorFloat;
+
+/// The single-mode squeezing gate with tunable squeezing.
+///
+/// The squeezing gate is a quantum operation that allows for precise manipulation of quantum states,
+/// by reducing the uncertainty in one variable and therefore increasing the uncertainty of another.
+/// https://arxiv.org/pdf/quant-ph/0106157.pdf
+///
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    OperateModeGate,
+    OperateSingleModeGate,
+    roqoqo_derive::Operate,
+    roqoqo_derive::Substitute,
+    roqoqo_derive::InvolveModes,
+    roqoqo_derive::SubstituteModes,
+    roqoqo_derive::OperateSingleMode,
+)]
+#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+pub struct Squeezing {
+    /// The mode the squeezing gate is applied to.
+    mode: usize,
+    /// The coefficient of the squeezing operation.
+    squeezing: CalculatorFloat,
+}
+
+#[allow(non_upper_case_globals)]
+const TAGS_Squeezing: &[&str; 4] = &[
+    "Operation",
+    "ModeGateOperation",
+    "SingleModeGateOperation",
+    "Squeezing",
+];
+
+impl InvolveQubits for Squeezing {
+    /// Returns all qubits involved in operation.
+    fn involved_qubits(&self) -> InvolvedQubits {
+        InvolvedQubits::None
+    }
+}
+
+impl ImplementedIn1point6 for Squeezing {}
+
+impl SupportedVersion for Squeezing {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 6, 0)
+    }
+}
+
+/// The single-mode phase-shift gate with variable phase, given by R(θ) = eexp(i * θ * 𝑁̂).
+///
+/// https://arxiv.org/pdf/2104.03241.pdf
+///
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    OperateModeGate,
+    OperateSingleModeGate,
+    roqoqo_derive::Operate,
+    roqoqo_derive::Substitute,
+    roqoqo_derive::InvolveModes,
+    roqoqo_derive::SubstituteModes,
+    roqoqo_derive::OperateSingleMode,
+)]
+#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+pub struct PhaseShift {
+    /// The mode the phase-shift gate is applied to.
+    mode: usize,
+    /// The phase by which to shift the mode.
+    phase: CalculatorFloat,
+}
+
+#[allow(non_upper_case_globals)]
+const TAGS_PhaseShift: &[&str; 4] = &[
+    "Operation",
+    "ModeGateOperation",
+    "SingleModeGateOperation",
+    "PhaseShift",
+];
+
+impl InvolveQubits for PhaseShift {
+    /// Returns all qubits involved in operation.
+    fn involved_qubits(&self) -> InvolvedQubits {
+        InvolvedQubits::None
+    }
+}
+
+impl ImplementedIn1point6 for PhaseShift {}
+
+impl SupportedVersion for PhaseShift {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 6, 0)
+    }
+}
+
+/// The 2-mode beam splitter which splits a beam with a transmission amplitude cos(θ) and a reflection amplitude exp(i * φ) * sin(θ).
+///
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    OperateModeGate,
+    OperateTwoModeGate,
+    roqoqo_derive::Operate,
+    roqoqo_derive::Substitute,
+    roqoqo_derive::InvolveModes,
+    roqoqo_derive::SubstituteModes,
+    roqoqo_derive::OperateTwoMode,
+)]
+#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+pub struct BeamSplitter {
+    /// The first mode the beam-splitter is applied to.
+    mode_0: usize,
+    /// The second mode the beam-splitter is applied to.
+    mode_1: usize,
+    /// The transmittivity angle of the beam-splitter.
+    theta: CalculatorFloat,
+    /// The phase angle of the beam-splitter.
+    phi: CalculatorFloat,
+}
+
+#[allow(non_upper_case_globals)]
+const TAGS_BeamSplitter: &[&str; 4] = &[
+    "Operation",
+    "ModeGateOperation",
+    "TwoModeGateOperation",
+    "BeamSplitter",
+];
+
+impl InvolveQubits for BeamSplitter {
+    /// Returns all qubits involved in operation.
+    fn involved_qubits(&self) -> InvolvedQubits {
+        InvolvedQubits::None
+    }
+}
+
+impl ImplementedIn1point6 for BeamSplitter {}
+
+impl SupportedVersion for BeamSplitter {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 6, 0)
+    }
+}
+
+/// The photon number-resolving detector measurement for bosons.
+///
+/// This can be used as a single-shot measurement of the photon number.
+/// https://arxiv.org/pdf/0902.4824.pdf
+///
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    roqoqo_derive::Operate,
+    roqoqo_derive::Substitute,
+    roqoqo_derive::InvolveModes,
+    roqoqo_derive::SubstituteModes,
+    roqoqo_derive::OperateSingleMode,
+)]
+#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+pub struct PNRDetection {
+    /// The mode the detector (measurement) is applied to.
+    mode: usize,
+    /// The register for the readout.
+    readout: String,
+    /// The index in the readout the result is saved to.
+    readout_index: usize,
+}
+
+#[allow(non_upper_case_globals)]
+const TAGS_PNRDetection: &[&str; 3] = &["Operation", "Measurement", "PNRDetection"];
+
+impl InvolveQubits for PNRDetection {
+    /// Returns all qubits involved in operation.
+    fn involved_qubits(&self) -> InvolvedQubits {
+        InvolvedQubits::None
+    }
+
+    fn involved_classical(&self) -> InvolvedClassical {
+        let mut a: HashSet<(String, usize)> = HashSet::new();
+        a.insert((self.readout.clone(), self.readout_index));
+        InvolvedClassical::Set(a)
+    }
+}
+
+impl ImplementedIn1point6 for PNRDetection {}
+
+impl SupportedVersion for PNRDetection {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 6, 0)
+    }
+}
diff --git a/roqoqo/src/operations/mod.rs b/roqoqo/src/operations/mod.rs
index 33806512..21d49a8a 100644
--- a/roqoqo/src/operations/mod.rs
+++ b/roqoqo/src/operations/mod.rs
@@ -56,6 +56,10 @@ pub use two_qubit_gate_operations::*;
 #[doc(hidden)]
 mod three_qubit_gate_operations;
 pub use three_qubit_gate_operations::*;
+/// Collection of roqoqo three qubit gate operations.
+#[doc(hidden)]
+mod bosonic_operations;
+pub use bosonic_operations::*;
 
 include!(concat!(env!("OUT_DIR"), "/_auto_generated_operations.rs"));
 
@@ -571,7 +575,6 @@ pub trait OperateSingleQubitGate:
     + OperateSingleQubit
     + Clone
     + PartialEq
-    + OperateSingleQubit
     + SupportedVersion
     + std::fmt::Debug
 {
@@ -818,6 +821,9 @@ pub(crate) trait ImplementedIn1point4: Operate {}
 /// Marker trait to show that some operation has been implemented in roqoqo 1.5.0
 pub(crate) trait ImplementedIn1point5: Operate {}
 
+/// Marker trait to show that some operation has been implemented in roqoqo 1.6.0
+pub(crate) trait ImplementedIn1point6: Operate {}
+
 #[cfg(feature = "dynamic")]
 /// A wrapper for Operate trait objects.
 ///
@@ -885,3 +891,157 @@ pub(crate) fn check_valid_mapping(mapping: &HashMap<usize, usize>) -> Result<(),
     }
     Ok(())
 }
+
+/// Represents bosonic modes involved in a roqoqo bosonic Operation.
+#[derive(Debug, PartialEq, Clone, Eq)]
+#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
+pub enum InvolvedModes {
+    /// Operation affects all bosonic modes no matter how many there are.
+    All,
+    /// Operation affects no bosonic modes (annotations etc.).
+    None,
+    /// Operation affects a specific set of bosonic modes.
+    Set(HashSet<usize>),
+}
+
+// #[cfg(feature = "dynamic")]
+// dyn_clone::clone_trait_object!(Operate);
+
+/// Trait for the bosonic modes involved in each bosonic Operation.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{InvolveModes, InvolvedModes, PNRDetection, BeamSplitter};
+/// use std::collections::HashSet;
+///
+/// let measurement = PNRDetection::new(1, "ro".into(), 0);
+/// let operation = BeamSplitter::new(0, 1, 0.1.into(), 0.2.into());
+///
+/// let mut modes: HashSet<usize> = HashSet::new();
+/// modes.insert(1);
+/// assert_eq!(measurement.involved_modes(), InvolvedModes::Set(modes.clone()));
+/// modes.insert(0);
+/// assert_eq!(operation.involved_modes(), InvolvedModes::Set(modes));
+/// ```
+pub trait InvolveModes {
+    /// Returns all bosonic modes involved in operation.
+    fn involved_modes(&self) -> InvolvedModes {
+        InvolvedModes::None
+    }
+}
+
+/// SubstituteModes trait allowing to perform bosonic mode mappings.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{SubstituteModes, BeamSplitter};
+/// use qoqo_calculator::{Calculator, CalculatorFloat};
+/// use std::collections::HashMap;
+///
+/// let mut mode_mapping_test: HashMap<usize, usize> = HashMap::new();
+/// mode_mapping_test.insert(0, 2);
+/// mode_mapping_test.insert(1, 0);
+/// mode_mapping_test.insert(2, 1);
+///
+/// let operation = BeamSplitter::new(0, 1, 0.1.into(), 0.2.into());
+/// let operation_after_remapping = BeamSplitter::new(2, 0, 0.1.into(), 0.2.into());
+/// assert_eq!(operation.remap_modes(&mode_mapping_test).unwrap(), operation_after_remapping);
+/// ```
+///
+pub trait SubstituteModes
+where
+    Self: Sized,
+{
+    /// Remaps the bosonic modes in clone of the operation.
+    fn remap_modes(&self, mapping: &HashMap<usize, usize>) -> Result<Self, RoqoqoError>;
+}
+
+/// Trait for Operations acting with a unitary gate on a set of bosonic modes.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{OperateModeGate, Squeezing};
+///
+/// let _op = Squeezing::new(0, 0.1.into());
+/// ```
+///
+pub trait OperateModeGate:
+    Operate + InvolveModes + SubstituteModes + Clone + PartialEq + SupportedVersion
+{
+}
+
+/// Trait for bosonic operations acting on exactly one bosonic modes.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{OperateSingleMode, PNRDetection};
+///
+/// let op = PNRDetection::new(0, "ro".into(), 0);
+/// assert_eq!(op.mode(), &0_usize);
+/// ```
+///
+pub trait OperateSingleMode: Operate + InvolveModes + SubstituteModes + Clone + PartialEq {
+    /// Returns `mode` the bosonic Operation acts on.
+    fn mode(&self) -> &usize;
+}
+
+/// Trait for Operations acting on exactly two bosonic modes.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{OperateTwoMode, BeamSplitter};
+///
+/// let op = BeamSplitter::new(2, 3, 1.0.into(), 0.1.into());
+/// assert_eq!(op.mode_0(), &2_usize);
+/// assert_eq!(op.mode_1(), &3_usize);
+/// ```
+///
+pub trait OperateTwoMode: Operate + InvolveModes + SubstituteModes + Clone + PartialEq {
+    /// Returns `mode_0` bosonic mode of two bosonic mode Operation.
+    fn mode_0(&self) -> &usize;
+    /// Returns `mode_1` bosonic mode of two bosonic mode Operation.
+    fn mode_1(&self) -> &usize;
+}
+
+/// Trait for unitary operations acting on exactly one bosonic mode.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{OperateSingleModeGate, PhaseShift};
+///
+/// let _op = PhaseShift::new(0, 0.1.into());
+/// ```
+///
+pub trait OperateSingleModeGate:
+    Operate
+    + OperateModeGate
+    + InvolveModes
+    + SubstituteModes
+    + OperateSingleMode
+    + Clone
+    + PartialEq
+    + SupportedVersion
+    + std::fmt::Debug
+{
+}
+
+/// Trait for all Operations operating on or affecting exactly two bosonic modes.
+///
+/// # Example
+/// ```
+/// use roqoqo::operations::{OperateTwoModeGate, BeamSplitter};
+///
+/// let _op = BeamSplitter::new(0, 1, 0.2.into(), 0.5.into());
+/// ```
+///
+pub trait OperateTwoModeGate:
+    Operate
+    + OperateModeGate
+    + OperateTwoMode
+    + InvolveModes
+    + SubstituteModes
+    + Clone
+    + PartialEq
+    + SupportedVersion
+{
+}
diff --git a/roqoqo/src/operations/pragma_operations.rs b/roqoqo/src/operations/pragma_operations.rs
index 70183be0..45b41b6f 100644
--- a/roqoqo/src/operations/pragma_operations.rs
+++ b/roqoqo/src/operations/pragma_operations.rs
@@ -1040,14 +1040,7 @@ impl Substitute for PragmaConditional {
 /// is equvalent to a PragmaControlledCircuit(0, [PauliX(1)]) but it cannot be represented
 /// by a unitary operation in qoqo for arbitraty circuits.
 ///
-#[derive(
-    Debug,
-    Clone,
-    PartialEq,
-    roqoqo_derive::SupportedVersion,
-    roqoqo_derive::Operate,
-    roqoqo_derive::OperatePragma,
-)]
+#[derive(Debug, Clone, PartialEq, roqoqo_derive::Operate, roqoqo_derive::OperatePragma)]
 #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 // #[cfg_attr(feature = "json_schema", derive(schemars::JsonSchema))]
 pub struct PragmaControlledCircuit {
@@ -1059,6 +1052,13 @@ pub struct PragmaControlledCircuit {
 
 impl super::ImplementedIn1point5 for PragmaControlledCircuit {}
 
+impl SupportedVersion for PragmaControlledCircuit {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        let pragma_version: (u32, u32, u32) = (1, 5, 0);
+        pragma_version.max(self.circuit.minimum_supported_roqoqo_version())
+    }
+}
+
 #[allow(non_upper_case_globals)]
 const TAGS_PragmaControlledCircuit: &[&str; 3] =
     &["Operation", "PragmaOperation", "PragmaControlledCircuit"];
diff --git a/roqoqo/src/operations/single_qubit_gate_operations.rs b/roqoqo/src/operations/single_qubit_gate_operations.rs
index 65ec235f..18e1b9fb 100644
--- a/roqoqo/src/operations/single_qubit_gate_operations.rs
+++ b/roqoqo/src/operations/single_qubit_gate_operations.rs
@@ -1574,7 +1574,6 @@ impl OperateSingleQubitGate for RotateXY {
     Clone,
     PartialEq,
     roqoqo_derive::InvolveQubits,
-    roqoqo_derive::SupportedVersion,
     roqoqo_derive::Operate,
     roqoqo_derive::Substitute,
     roqoqo_derive::OperateSingleQubit,
@@ -1590,6 +1589,12 @@ pub struct GPi {
 
 impl super::ImplementedIn1point4 for GPi {}
 
+impl SupportedVersion for GPi {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 4, 0)
+    }
+}
+
 #[allow(non_upper_case_globals)]
 const TAGS_GPi: &[&str; 5] = &[
     "Operation",
@@ -1668,7 +1673,6 @@ impl OperateSingleQubitGate for GPi {
     Clone,
     PartialEq,
     roqoqo_derive::InvolveQubits,
-    roqoqo_derive::SupportedVersion,
     roqoqo_derive::Operate,
     roqoqo_derive::Substitute,
     roqoqo_derive::OperateSingleQubit,
@@ -1684,6 +1688,11 @@ pub struct GPi2 {
 }
 impl super::ImplementedIn1point4 for GPi2 {}
 
+impl SupportedVersion for GPi2 {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 4, 0)
+    }
+}
 #[allow(non_upper_case_globals)]
 const TAGS_GPi2: &[&str; 5] = &[
     "Operation",
diff --git a/roqoqo/src/operations/three_qubit_gate_operations.rs b/roqoqo/src/operations/three_qubit_gate_operations.rs
index 5de68466..bf527509 100644
--- a/roqoqo/src/operations/three_qubit_gate_operations.rs
+++ b/roqoqo/src/operations/three_qubit_gate_operations.rs
@@ -33,7 +33,6 @@ use rand_distr::{Distribution, Normal};
     PartialEq,
     Eq,
     roqoqo_derive::InvolveQubits,
-    roqoqo_derive::SupportedVersion,
     roqoqo_derive::Operate,
     roqoqo_derive::Substitute,
     roqoqo_derive::OperateThreeQubit,
@@ -50,6 +49,12 @@ pub struct ControlledControlledPauliZ {
 }
 impl super::ImplementedIn1point3 for ControlledControlledPauliZ {}
 
+impl SupportedVersion for ControlledControlledPauliZ {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 3, 0)
+    }
+}
+
 #[allow(non_upper_case_globals)]
 const TAGS_ControlledControlledPauliZ: &[&str; 4] = &[
     "Operation",
@@ -178,7 +183,6 @@ impl OperateThreeQubitGate for ControlledControlledPauliZ {
     Clone,
     PartialEq,
     roqoqo_derive::InvolveQubits,
-    roqoqo_derive::SupportedVersion,
     roqoqo_derive::Operate,
     roqoqo_derive::Substitute,
     roqoqo_derive::OperateThreeQubit,
@@ -197,6 +201,12 @@ pub struct ControlledControlledPhaseShift {
 }
 impl super::ImplementedIn1point3 for ControlledControlledPhaseShift {}
 
+impl SupportedVersion for ControlledControlledPhaseShift {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 3, 0)
+    }
+}
+
 #[allow(non_upper_case_globals)]
 const TAGS_ControlledControlledPhaseShift: &[&str; 5] = &[
     "Operation",
@@ -326,7 +336,6 @@ impl OperateThreeQubitGate for ControlledControlledPhaseShift {
     Clone,
     PartialEq,
     roqoqo_derive::InvolveQubits,
-    roqoqo_derive::SupportedVersion,
     roqoqo_derive::Operate,
     roqoqo_derive::Substitute,
     roqoqo_derive::OperateThreeQubit,
@@ -343,6 +352,12 @@ pub struct Toffoli {
 
 impl super::ImplementedIn1point3 for Toffoli {}
 
+impl SupportedVersion for Toffoli {
+    fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
+        (1, 3, 0)
+    }
+}
+
 #[allow(non_upper_case_globals)]
 const TAGS_Toffoli: &[&str; 4] = &[
     "Operation",
diff --git a/roqoqo/src/operations/two_qubit_gate_operations.rs b/roqoqo/src/operations/two_qubit_gate_operations.rs
index 6875ed08..2f33c73f 100644
--- a/roqoqo/src/operations/two_qubit_gate_operations.rs
+++ b/roqoqo/src/operations/two_qubit_gate_operations.rs
@@ -2197,6 +2197,7 @@ pub struct PhaseShiftedControlledPhase {
     /// The single qubit phase φ.
     phi: CalculatorFloat,
 }
+
 impl SupportedVersion for PhaseShiftedControlledPhase {
     fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
         (1, 2, 0)
@@ -2309,6 +2310,7 @@ pub struct ControlledRotateX {
     /// The angle θ of the rotation, in the interval from 0 to 2 * 2π.
     theta: CalculatorFloat,
 }
+
 impl SupportedVersion for ControlledRotateX {
     fn minimum_supported_roqoqo_version(&self) -> (u32, u32, u32) {
         (1, 3, 0)
diff --git a/roqoqo/src/prelude.rs b/roqoqo/src/prelude.rs
index 64f0d848..044d2af0 100644
--- a/roqoqo/src/prelude.rs
+++ b/roqoqo/src/prelude.rs
@@ -23,10 +23,11 @@ pub use crate::backends::EvaluatingBackend;
 pub use crate::circuit::AsVec;
 pub use crate::measurements::{Measure, MeasureExpectationValues};
 pub use crate::operations::{
-    Define, InvolveQubits, InvolvedQubits, Operate, OperateConstantGate, OperateGate,
-    OperateMultiQubit, OperateMultiQubitGate, OperatePragma, OperatePragmaNoise,
-    OperatePragmaNoiseProba, OperateSingleQubit, OperateSingleQubitGate, OperateThreeQubit,
-    OperateThreeQubitGate, OperateTwoQubit, OperateTwoQubitGate, Rotate, Substitute,
-    SupportedVersion,
+    Define, InvolveModes, InvolveQubits, InvolvedModes, InvolvedQubits, Operate,
+    OperateConstantGate, OperateGate, OperateModeGate, OperateMultiQubit, OperateMultiQubitGate,
+    OperatePragma, OperatePragmaNoise, OperatePragmaNoiseProba, OperateSingleMode,
+    OperateSingleModeGate, OperateSingleQubit, OperateSingleQubitGate, OperateThreeQubit,
+    OperateThreeQubitGate, OperateTwoMode, OperateTwoModeGate, OperateTwoQubit,
+    OperateTwoQubitGate, Rotate, Substitute, SubstituteModes, SupportedVersion,
 };
 pub use crate::{RoqoqoBackendError, RoqoqoError};


Test patch:
diff --git a/.compatibility_tests/compatibility_test_1_0/Cargo.toml b/.compatibility_tests/compatibility_test_1_0/Cargo.toml
index 661005ac..9557a585 100644
--- a/.compatibility_tests/compatibility_test_1_0/Cargo.toml
+++ b/.compatibility_tests/compatibility_test_1_0/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "compatibility_test_1_0"
-version ="1.5.0"
+version ="1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
@@ -22,7 +22,7 @@ publish = false
 test_roqoqo_1_0 = {package = "roqoqo", version="=1.0.0"}
 test_roqoqo_derive_1_0 = {package = "roqoqo-derive", version="=1.0.0"}
 qoqo_calculator = { version="1.1" }
-roqoqo = {version="1.5.0", path="../../roqoqo", features=["serialize", "overrotate"]}
+roqoqo = {version="1.6.0-alpha.0", path="../../roqoqo", features=["serialize", "overrotate"]}
 bincode = {version="1.3"}
 ndarray = "0.15"
 
diff --git a/.compatibility_tests/compatibility_test_1_2/Cargo.toml b/.compatibility_tests/compatibility_test_1_2/Cargo.toml
index f488da85..e0cec5f4 100644
--- a/.compatibility_tests/compatibility_test_1_2/Cargo.toml
+++ b/.compatibility_tests/compatibility_test_1_2/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "compatibility_test_1_2"
-version ="1.5.0"
+version ="1.6.0-alpha"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
@@ -22,7 +22,7 @@ publish = false
 test_roqoqo_1_2 = {package = "roqoqo", version="=1.2.5"}
 test_roqoqo_derive_1_2 = {package = "roqoqo-derive", version="=1.2.5"}
 qoqo_calculator = { version="1.1" }
-roqoqo = {version="1.5.0", path="../../roqoqo", features=["serialize", "overrotate"]}
+roqoqo = {version="1.6.0-alpha", path="../../roqoqo", features=["serialize", "overrotate"]}
 bincode = {version="1.3"}
 ndarray = "0.15"
 
diff --git a/.compatibility_tests/compatibility_test_1_3/Cargo.toml b/.compatibility_tests/compatibility_test_1_3/Cargo.toml
index ac210089..c11973e1 100644
--- a/.compatibility_tests/compatibility_test_1_3/Cargo.toml
+++ b/.compatibility_tests/compatibility_test_1_3/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "compatibility_test_1_3"
-version ="1.5.0"
+version ="1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
@@ -22,7 +22,7 @@ publish = false
 test_roqoqo_1_3 = {package = "roqoqo", version="=1.3.2"}
 test_roqoqo_derive_1_3 = {package = "roqoqo-derive", version="=1.3.2"}
 qoqo_calculator = { version="1.1" }
-roqoqo = {version="1.5.0", path="../../roqoqo", features=["serialize", "overrotate"]}
+roqoqo = {version="1.6.0-alpha.0", path="../../roqoqo", features=["serialize", "overrotate"]}
 bincode = {version="1.3"}
 ndarray = "0.15"
 
diff --git a/.compatibility_tests/compatibility_test_1_4/Cargo.toml b/.compatibility_tests/compatibility_test_1_4/Cargo.toml
index c1968266..56a2adf4 100644
--- a/.compatibility_tests/compatibility_test_1_4/Cargo.toml
+++ b/.compatibility_tests/compatibility_test_1_4/Cargo.toml
@@ -22,7 +22,7 @@ publish = false
 test_roqoqo_1_4 = {package = "roqoqo", version="=1.4.0"}
 test_roqoqo_derive_1_4 = {package = "roqoqo-derive", version="=1.4.0"}
 qoqo_calculator = { version="1.1" }
-roqoqo = {version="1.5.0", path="../../roqoqo", features=["serialize", "overrotate"]}
+roqoqo = {version="1.6.0-alpha.0", path="../../roqoqo", features=["serialize", "overrotate"]}
 bincode = {version="1.3"}
 ndarray = "0.15"
 
diff --git a/.compatibility_tests/compatibility_test_1_5/Cargo.toml b/.compatibility_tests/compatibility_test_1_5/Cargo.toml
new file mode 100644
index 00000000..831b6586
--- /dev/null
+++ b/.compatibility_tests/compatibility_test_1_5/Cargo.toml
@@ -0,0 +1,30 @@
+[package]
+name = "compatibility_test_1_5"
+version ="1.6.0-alpha.0"
+authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
+license = "Apache-2.0"
+edition = "2021"
+rust-version = "1.56"
+categories = ["science", "simulation"]
+homepage = "https://github.com/HQSquantumsimulations/qoqo"
+repository = "https://github.com/HQSquantumsimulations/qoqo"
+documentation = "https://docs.rs/roqoqo/"
+readme = "../README.md"
+description = "Compatibility tests for roqoqo"
+include = ["src*", "build.rs", "LICENSE", "README.md"]
+publish = false
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[workspace]
+
+[dependencies]
+test_roqoqo_1_5 = {package = "roqoqo", version="=1.5.0"}
+test_roqoqo_derive_1_5 = {package = "roqoqo-derive", version="=1.5.0"}
+qoqo_calculator = { version="1.1" }
+roqoqo = {version="1.6.0-alpha.0", path="../../roqoqo", features=["serialize", "overrotate"]}
+bincode = {version="1.3"}
+ndarray = "0.15"
+
+[dev-dependencies]
+test-case = "3.0"
\ No newline at end of file
diff --git a/.compatibility_tests/compatibility_test_1_5/src/lib.rs b/.compatibility_tests/compatibility_test_1_5/src/lib.rs
new file mode 100644
index 00000000..7d12d9af
--- /dev/null
+++ b/.compatibility_tests/compatibility_test_1_5/src/lib.rs
@@ -0,0 +1,14 @@
+pub fn add(left: usize, right: usize) -> usize {
+    left + right
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn it_works() {
+        let result = add(2, 2);
+        assert_eq!(result, 4);
+    }
+}
diff --git a/.compatibility_tests/compatibility_test_1_5/tests/integration/compatibility_1_5.rs b/.compatibility_tests/compatibility_test_1_5/tests/integration/compatibility_1_5.rs
new file mode 100644
index 00000000..73f7f3ec
--- /dev/null
+++ b/.compatibility_tests/compatibility_test_1_5/tests/integration/compatibility_1_5.rs
@@ -0,0 +1,148 @@
+// Copyright © 2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+use std::collections::HashMap;
+
+use test_case::test_case;
+use test_roqoqo_1_5;
+
+// 1.0 version
+#[test_case(test_roqoqo_1_5::operations::SingleQubitGate::new(0, 1.0.into(), 0.0.into(), 0.0.into(), 0.0.into(), 0.0.into(),).into(); "SingleQubitGate")]
+#[test_case(test_roqoqo_1_5::operations::RotateZ::new(0, 0.1.into()).into(); "RotateZ")]
+#[test_case(test_roqoqo_1_5::operations::RotateY::new(0, 0.1.into()).into(); "RotateY")]
+#[test_case(test_roqoqo_1_5::operations::RotateX::new(0, 0.1.into()).into(); "RotateX")]
+#[test_case(test_roqoqo_1_5::operations::RotateXY::new(0,1.0.into(), 0.1.into()).into(); "RotateXY")]
+#[test_case(test_roqoqo_1_5::operations::RotateAroundSphericalAxis::new(0, 1.0.into(), 1.0.into(), 1.0.into()).into(); "RotateAroundSphericalAxis")]
+#[test_case(test_roqoqo_1_5::operations::PauliZ::new(0).into(); "PauliZ")]
+#[test_case(test_roqoqo_1_5::operations::PauliY::new(0).into(); "PauliY")]
+#[test_case(test_roqoqo_1_5::operations::PauliX::new(0).into(); "PauliX")]
+#[test_case(test_roqoqo_1_5::operations::SqrtPauliX::new(0).into(); "SqrtPauliX")]
+#[test_case(test_roqoqo_1_5::operations::InvSqrtPauliX::new(0).into(); "InvSqrtPauliX")]
+#[test_case(test_roqoqo_1_5::operations::Hadamard::new(0).into(); "Hadamard")]
+#[test_case(test_roqoqo_1_5::operations::TGate::new(0).into(); "TGate")]
+#[test_case(test_roqoqo_1_5::operations::SGate::new(0).into(); "SGate")]
+#[test_case(test_roqoqo_1_5::operations::DefinitionBit::new("ro".to_string(), 1, false).into(); "DefinitionBit")]
+#[test_case(test_roqoqo_1_5::operations::DefinitionComplex::new("ro".to_string(), 1, true).into(); "DefinitionComplex")]
+#[test_case(test_roqoqo_1_5::operations::DefinitionUsize::new("ro".to_string(), 1, true).into(); "DefinitionUsize")]
+#[test_case(test_roqoqo_1_5::operations::DefinitionFloat::new("ro".to_string(), 1, true).into(); "DefinitionFloat")]
+#[test_case(test_roqoqo_1_5::operations::InputSymbolic::new("ro".to_string(), 1.0).into(); "InputSymbolic")]
+#[test_case(test_roqoqo_1_5::operations::MeasureQubit::new(0,"ro".to_string(), 1).into(); "MeasureQubit")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGetStateVector::new("ro".to_string(), None).into(); "PragmaGetStateVector")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGetDensityMatrix::new("ro".to_string(), None).into(); "PragmaGetDensityMatrix")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGetOccupationProbability::new("ro".to_string(), None).into(); "PragmaGetOccupationProbability")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGetPauliProduct::new(std::collections::HashMap::new(),"ro".to_string(), test_roqoqo_1_5::Circuit::new()).into(); "PragmaGetPauliProduct")]
+#[test_case(test_roqoqo_1_5::operations::PragmaRepeatedMeasurement::new("ro".to_string(), 10, None).into(); "PragmaRepeatedMeasurement")]
+#[test_case(test_roqoqo_1_5::operations::PragmaSetNumberOfMeasurements::new(10, "ro".to_string()).into(); "PragmaSetNumberOfMeasurements")]
+#[test_case(test_roqoqo_1_5::operations::PragmaSetStateVector::new(ndarray::array![1.0.into(), 0.0.into(), 0.0.into()]).into(); "PragmaSetStateVector")]
+#[test_case(test_roqoqo_1_5::operations::PragmaSetDensityMatrix::new(ndarray::array![[1.0.into(), 0.0.into(), 0.0.into()]]).into(); "PragmaSetDensityMatrix")]
+#[test_case(test_roqoqo_1_5::operations::PragmaRepeatGate::new(10).into(); "PragmaRepeatGate")]
+#[test_case(test_roqoqo_1_5::operations::PragmaOverrotation::new("RotateZ".to_string(), vec![0], 1.0, 1.0).into(); "PragmaOverrotation")]
+#[test_case(test_roqoqo_1_5::operations::PragmaBoostNoise::new(1.0.into()).into(); "PragmaBoostNoise")]
+#[test_case(test_roqoqo_1_5::operations::PragmaStopParallelBlock::new(vec![0], 1.0.into()).into(); "PragmaStopParallelBlock")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGlobalPhase::new(1.0.into()).into(); "PragmaGlobalPhase")]
+#[test_case(test_roqoqo_1_5::operations::PragmaSleep::new(vec![0], 1.0.into()).into(); "PragmaSleep")]
+#[test_case(test_roqoqo_1_5::operations::PragmaActiveReset::new(0).into(); "PragmaActiveReset")]
+#[test_case(test_roqoqo_1_5::operations::PragmaStartDecompositionBlock::new(vec![0], HashMap::new()).into(); "PragmaStartDecompositionBlock")]
+#[test_case(test_roqoqo_1_5::operations::PragmaStopDecompositionBlock::new(vec![0]).into(); "PragmaStopDecompositionBlock")]
+#[test_case(test_roqoqo_1_5::operations::PragmaDamping::new(0,1.0.into(), 1.0.into()).into(); "PragmaDamping")]
+#[test_case(test_roqoqo_1_5::operations::PragmaDepolarising::new(0,1.0.into(), 1.0.into()).into(); "PragmaDepolarising")]
+#[test_case(test_roqoqo_1_5::operations::PragmaDephasing::new(0,1.0.into(), 1.0.into()).into(); "PragmaDephasing")]
+#[test_case(test_roqoqo_1_5::operations::PragmaRandomNoise::new(0,1.0.into(), 1.0.into(), 1.0.into()).into(); "PragmaRandomNoise")]
+#[test_case(test_roqoqo_1_5::operations::PragmaGeneralNoise::new(0, 0.1.into(), ndarray::array![[1.0.into(), 0.0.into()], [1.0.into(), 2.0.into()]]).into(); "PragmaGeneralNoise")]
+#[test_case(test_roqoqo_1_5::operations::PragmaConditional::new("ro".to_string(),0, test_roqoqo_1_5::Circuit::new()).into(); "PragmaConditional")]
+// #[test_case(test_roqoqo_1_5::operations::PragmaChangeDevice::new(&"PragmaTest".into()).unwrap().into(); "PragmaChangeDevice")]
+#[test_case(test_roqoqo_1_5::operations::CNOT::new(0,1).into(); "CNOT")]
+#[test_case(test_roqoqo_1_5::operations::SWAP::new(0,1).into(); "SWAP")]
+#[test_case(test_roqoqo_1_5::operations::FSwap::new(0,1).into(); "FSwap")]
+#[test_case(test_roqoqo_1_5::operations::ISwap::new(0,1).into(); "ISwap")]
+#[test_case(test_roqoqo_1_5::operations::SqrtISwap::new(0,1).into(); "SqrtISWAP")]
+#[test_case(test_roqoqo_1_5::operations::InvSqrtISwap::new(0,1).into(); "InvSqrtISWAP")]
+#[test_case(test_roqoqo_1_5::operations::XY::new(0,1, 0.1.into()).into(); "XY")]
+#[test_case(test_roqoqo_1_5::operations::ControlledPhaseShift::new(0,1, 0.1.into()).into(); "ControlledPhase")]
+#[test_case(test_roqoqo_1_5::operations::ControlledPauliY::new(0,1).into(); "ControlledPauliY")]
+#[test_case(test_roqoqo_1_5::operations::ControlledPauliZ::new(0,1).into(); "ControlledPauliZ")]
+#[test_case(test_roqoqo_1_5::operations::MolmerSorensenXX::new(0,1).into(); "MolmerSorensenXX")]
+#[test_case(test_roqoqo_1_5::operations::VariableMSXX::new(0,1, 0.1.into()).into(); "VariableMSXX")]
+#[test_case(test_roqoqo_1_5::operations::GivensRotation::new(0,1, 0.1.into(), 0.1.into()).into(); "GivensRotation")]
+#[test_case(test_roqoqo_1_5::operations::GivensRotationLittleEndian::new(0,1, 0.1.into(), 0.1.into()).into(); "GivensRotationLittleEndian")]
+#[test_case(test_roqoqo_1_5::operations::Qsim::new(0,1, 0.1.into(), 0.1.into(), 0.1.into()).into(); "Qsim")]
+#[test_case(test_roqoqo_1_5::operations::Fsim::new(0,1, 0.1.into(), 0.1.into(), 0.1.into()).into(); "Fsim")]
+#[test_case(test_roqoqo_1_5::operations::SpinInteraction::new(0,1, 0.1.into(), 0.1.into(), 0.1.into()).into(); "SpinInteraction")]
+#[test_case(test_roqoqo_1_5::operations::Bogoliubov::new(0,1, 0.1.into(), 0.1.into()).into(); "Bogoliubov")]
+#[test_case(test_roqoqo_1_5::operations::PMInteraction::new(0,1, 0.1.into()).into(); "PMInteraction")]
+#[test_case(test_roqoqo_1_5::operations::ComplexPMInteraction::new(0,1, 0.1.into(), 0.1.into()).into(); "ComplexPMInteraction")]
+#[test_case(test_roqoqo_1_5::operations::PhaseShiftedControlledZ::new(0,1, 1.0.into()).into(); "PhaseShiftedControlledZ")]
+#[test_case(test_roqoqo_1_5::operations::PhaseShiftState1::new(0, 1.0.into()).into(); "PhaseShiftState1")]
+#[test_case(test_roqoqo_1_5::operations::PhaseShiftState0::new(0, 1.0.into()).into(); "PhaseShiftState0")]
+#[test_case(test_roqoqo_1_5::operations::MultiQubitMS::new(vec![0,2,3], 1.0.into()).into(); "MultiQubitMS")]
+#[test_case(test_roqoqo_1_5::operations::MultiQubitZZ::new(vec![0,2,3], 1.0.into()).into(); "MultiQubitZZ")]
+// 1.1 and 1.2
+#[test_case(test_roqoqo_1_5::operations::InputBit::new("input".to_string(), 1, true).into(); "InputBit")]
+#[test_case(test_roqoqo_1_5::operations::PragmaLoop::new(2.0.into(), test_roqoqo_1_5::Circuit::new()).into(); "PragmaLoop")]
+#[test_case(test_roqoqo_1_5::operations::PhaseShiftedControlledPhase::new(0,1, 1.0.into(), 1.0.into()).into(); "PhaseShiftedControlledPhase")]
+// 1.3
+#[test_case(test_roqoqo_1_5::operations::ControlledRotateX::new(0,1, 1.0.into()).into(); "ControlledRotateX")]
+#[test_case(test_roqoqo_1_5::operations::ControlledRotateXY::new(0,1, 1.0.into(), 1.0.into()).into(); "ControlledRotateXY")]
+#[test_case(test_roqoqo_1_5::operations::ControlledControlledPauliZ::new(0,1,2).into(); "ControlledControlledPauliZ")]
+#[test_case(test_roqoqo_1_5::operations::ControlledControlledPhaseShift::new(0,1,2, 1.0.into()).into(); "ControlledControlledPhaseShift")]
+#[test_case(test_roqoqo_1_5::operations::Toffoli::new(0,1,2).into(); "Toffoli")]
+// 1.4
+#[test_case(test_roqoqo_1_5::operations::GPi::new(0, 0.1.into()).into(); "GPi")]
+#[test_case(test_roqoqo_1_5::operations::GPi2::new(0, 0.1.into()).into(); "GPi2")]
+// 1.5
+#[test_case(test_roqoqo_1_5::operations::PragmaControlledCircuit::new(0, test_roqoqo_1_5::Circuit::new()).into(); "PragmaControlledCircuit")]
+// Operations from 1.6 - uncomment for next unittests
+// #[test_case(test_roqoqo_1_6::operations::Squeezing::new(0, 0.1.into()).into(); "Squeezing")]
+// #[test_case(test_roqoqo_1_6::operations::PhaseShift::new(0, 0.1.into()).into(); "PhaseShift")]
+// #[test_case(test_roqoqo_1_6::operations::BeamSplitter::new(0, 1, 0.1.into(), 0.2.into()).into(); "BeamSplitter")]
+// #[test_case(test_roqoqo_1_6::operations::PNRDetection::new(0, "ro".into(), 0).into(); "PNRDetection")]
+fn test_bincode_compatibility_1_5(operation: test_roqoqo_1_5::operations::Operation) {
+    let mut test_circuit = test_roqoqo_1_5::Circuit::new();
+    test_circuit += operation;
+
+    let test_measurement_input = test_roqoqo_1_5::measurements::PauliZProductInput::new(3, false);
+    let test_measurement = test_roqoqo_1_5::measurements::PauliZProduct {
+        constant_circuit: Some(test_circuit.clone()),
+        circuits: vec![test_circuit],
+        input: test_measurement_input,
+    };
+    let test_program = test_roqoqo_1_5::QuantumProgram::PauliZProduct {
+        measurement: test_measurement,
+        input_parameter_names: vec!["test".to_string()],
+    };
+    let test_serialisation: Vec<u8> = bincode::serialize(&test_program).unwrap();
+
+    let _test_deserialisation: roqoqo::QuantumProgram =
+        bincode::deserialize(&test_serialisation).unwrap();
+}
+
+#[test]
+fn test_device_compat() {
+    let test_device = test_roqoqo_1_5::devices::AllToAllDevice::new(
+        3,
+        &["RotateZ".to_string()],
+        &["CNOT".to_string()],
+        1.0,
+    );
+    let test_serialisation: Vec<u8> = bincode::serialize(&test_device).unwrap();
+
+    let test_deserialisation: roqoqo::devices::AllToAllDevice =
+        bincode::deserialize(&test_serialisation).unwrap();
+
+    let comparsion_device = roqoqo::devices::AllToAllDevice::new(
+        3,
+        &["RotateZ".to_string()],
+        &["CNOT".to_string()],
+        1.0,
+    );
+    assert_eq!(test_deserialisation, comparsion_device);
+}
diff --git a/.compatibility_tests/compatibility_test_1_5/tests/integration/main.rs b/.compatibility_tests/compatibility_test_1_5/tests/integration/main.rs
new file mode 100644
index 00000000..958e715e
--- /dev/null
+++ b/.compatibility_tests/compatibility_test_1_5/tests/integration/main.rs
@@ -0,0 +1,13 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+#[cfg(test)]
+mod compatibility_1_5;
diff --git a/.compatibility_tests/compatibility_test_sim/Cargo.toml b/.compatibility_tests/compatibility_test_sim/Cargo.toml
index ad7e35bd..015c282e 100644
--- a/.compatibility_tests/compatibility_test_sim/Cargo.toml
+++ b/.compatibility_tests/compatibility_test_sim/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "compatibility_test_sim"
-version = "1.4.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
diff --git a/.github/workflows/compatibility_tests.yml b/.github/workflows/compatibility_tests.yml
index 01c68485..996d554f 100644
--- a/.github/workflows/compatibility_tests.yml
+++ b/.github/workflows/compatibility_tests.yml
@@ -53,6 +53,36 @@ jobs:
           cd ./.compatibility_tests/compatibility_test_1_3/
           cargo test
   
+  unittests_check_compatibility_1_4:
+    name: unittests_check-compatibility-1-4
+    runs-on: "ubuntu-latest"
+    steps:
+      - uses: actions/checkout@v3
+      - uses: actions-rs/toolchain@v1
+        with:
+          profile: minimal
+          toolchain: stable
+          default: true
+      - uses: Swatinem/rust-cache@v2
+      - run: |
+          cd ./.compatibility_tests/compatibility_test_1_4/
+          cargo test
+  
+  unittests_check_compatibility_1_5:
+    name: unittests_check-compatibility-1-4
+    runs-on: "ubuntu-latest"
+    steps:
+      - uses: actions/checkout@v3
+      - uses: actions-rs/toolchain@v1
+        with:
+          profile: minimal
+          toolchain: stable
+          default: true
+      - uses: Swatinem/rust-cache@v2
+      - run: |
+          cd ./.compatibility_tests/compatibility_test_1_5/
+          cargo test
+  
   unittests_check_circuit_decompositions:
     name: unittests_check_circuit_decompositions
     runs-on: "ubuntu-latest"
diff --git a/qoqo/tests/integration/operations/pragma_operations.rs b/qoqo/tests/integration/operations/pragma_operations.rs
index 559cbc64..29d0741a 100644
--- a/qoqo/tests/integration/operations/pragma_operations.rs
+++ b/qoqo/tests/integration/operations/pragma_operations.rs
@@ -1009,7 +1009,7 @@ fn test_pyo3_hqslang_overrotation(input_measurement: Operation, hqslang_param: &
 #[test_case(Operation::from(PragmaGeneralNoise::new(0, CalculatorFloat::from(0.005),  operators())); "PragmaGeneralNoise")]
 #[test_case(Operation::from(PragmaConditional::new(String::from("ro"), 1, create_circuit())); "PragmaConditional")]
 #[test_case(Operation::from(PragmaControlledCircuit::new( 1, create_circuit())); "PragmaControlledCircuit")]
-#[test_case(Operation::from(PragmaLoop::new(CalculatorFloat::from("number_t"), Circuit::default())); "PragmaLoop")]
+#[test_case(Operation::from(PragmaLoop::new(CalculatorFloat::from(1.0), Circuit::default())); "PragmaLoop")]
 fn test_pyo3_is_parametrized(input_measurement: Operation) {
     pyo3::prepare_freethreaded_python();
     Python::with_gil(|py| {
diff --git a/roqoqo-test/Cargo.toml b/roqoqo-test/Cargo.toml
index ca436c22..33024e99 100644
--- a/roqoqo-test/Cargo.toml
+++ b/roqoqo-test/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "roqoqo-test"
-version = "1.5.0"
+version = "1.6.0-alpha.0"
 authors = ["HQS Quantum Simulations <info@quantumsimulations.de>"]
 license = "Apache-2.0"
 edition = "2021"
@@ -19,7 +19,7 @@ crate-type = ["rlib"]
 
 [dependencies]
 qoqo_calculator = { version="1.1" }
-roqoqo = {version="1.5.0", path="../roqoqo", features=["serialize"]}
+roqoqo = {version="1.6.0-alpha.0", path="../roqoqo", features=["serialize"]}
 rand = "0.8"
 nalgebra = "0.32"
 ndarray = { version = "0.15" }
diff --git a/roqoqo/tests/integration/operations/bosonic_operations.rs b/roqoqo/tests/integration/operations/bosonic_operations.rs
new file mode 100644
index 00000000..9644c580
--- /dev/null
+++ b/roqoqo/tests/integration/operations/bosonic_operations.rs
@@ -0,0 +1,404 @@
+// Copyright © 2021-2022 HQS Quantum Simulations GmbH. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the
+// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Integration test for public API of bosonic operations
+
+use qoqo_calculator::{Calculator, CalculatorFloat};
+use roqoqo::operations::*;
+#[cfg(feature = "serialize")]
+use serde_test::{assert_tokens, Configure, Token};
+use std::collections::{HashMap, HashSet};
+use test_case::test_case;
+
+/// Test Squeezing inputs
+#[test]
+fn squeezing_inputs() {
+    let op = Squeezing::new(1, 0.1.into());
+    assert_eq!(op.mode(), &1_usize);
+    assert_eq!(op.squeezing(), &CalculatorFloat::from(0.1));
+}
+
+/// Test Squeezing inputs
+#[test]
+fn phaseshift_inputs() {
+    let op = PhaseShift::new(1, 0.1.into());
+    assert_eq!(op.mode(), &1_usize);
+    assert_eq!(op.phase(), &CalculatorFloat::from(0.1));
+}
+
+/// Test Squeezing inputs
+#[test]
+fn beamsplitter_inputs() {
+    let op = BeamSplitter::new(0, 1, 0.5.into(), 0.1.into());
+    assert_eq!(op.mode_0(), &0_usize);
+    assert_eq!(op.mode_1(), &1_usize);
+    assert_eq!(op.theta(), &CalculatorFloat::from(0.5));
+    assert_eq!(op.phi(), &CalculatorFloat::from(0.1));
+}
+
+/// Test Squeezing inputs
+#[test]
+fn pnrdetection_inputs() {
+    let op = PNRDetection::new(1, "ro".into(), 0);
+    assert_eq!(op.mode(), &1_usize);
+    assert_eq!(op.readout(), &String::from("ro"));
+    assert_eq!(op.readout_index(), &0_usize)
+}
+
+#[test_case(Operation::from(Squeezing::new(0, 0.5.into())))]
+#[test_case(Operation::from(PhaseShift::new(0, 0.5.into())))]
+#[test_case(Operation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())))]
+#[test_case(Operation::from(PNRDetection::new(0, "ro".into(), 0)))]
+fn clone(op: Operation) {
+    assert_eq!(op.clone(), op);
+}
+
+#[test_case(Operation::from(Squeezing::new(0, 0.5.into())), "Squeezing(Squeezing { mode: 0, squeezing: Float(0.5) })")]
+#[test_case(Operation::from(PhaseShift::new(0, 0.5.into())), "PhaseShift(PhaseShift { mode: 0, phase: Float(0.5) })")]
+#[test_case(Operation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())), "BeamSplitter(BeamSplitter { mode_0: 0, mode_1: 1, theta: Float(0.1), phi: Float(0.5) })")]
+#[test_case(Operation::from(PNRDetection::new(0, "ro".into(), 0)), "PNRDetection(PNRDetection { mode: 0, readout: \"ro\", readout_index: 0 })")]
+fn debug(op: Operation, string: &str) {
+    assert_eq!(format!("{:?}", op), string);
+}
+
+#[test_case(Operation::from(Squeezing::new(0, 0.5.into())), Operation::from(Squeezing::new(0, 0.5.into())), Operation::from(Squeezing::new(1, 0.5.into())))]
+#[test_case(Operation::from(PhaseShift::new(0, 0.5.into())), Operation::from(PhaseShift::new(0, 0.5.into())), Operation::from(PhaseShift::new(1, 0.5.into())))]
+#[test_case(Operation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())), Operation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())), Operation::from(BeamSplitter::new(1, 2, 0.1.into(), 0.5.into())))]
+#[test_case(Operation::from(PNRDetection::new(0, "ro".into(), 0)), Operation::from(PNRDetection::new(0, "ro".into(), 0)), Operation::from(PNRDetection::new(1, "ro".into(), 0)))]
+fn partial_eq(op: Operation, op_0: Operation, op_1: Operation) {
+    assert!(op_0 == op);
+    assert!(op == op_0);
+    assert!(op_1 != op);
+    assert!(op != op_1);
+}
+
+#[test_case(ModeGateOperation::from(Squeezing::new(0, 0.1.into())), InvolvedQubits::None, InvolvedClassical::None, InvolvedModes::Set(HashSet::from([0_usize])))]
+#[test_case(ModeGateOperation::from(PhaseShift::new(0, 0.1.into())), InvolvedQubits::None, InvolvedClassical::None, InvolvedModes::Set(HashSet::from([0_usize])))]
+#[test_case(ModeGateOperation::from(BeamSplitter::new(0, 1, 0.5.into(), 0.1.into())), InvolvedQubits::None, InvolvedClassical::None, InvolvedModes::Set(HashSet::from([0_usize, 1_usize])))]
+// #[test_case(ModeGateOperation::from(PNRDetection::new(0, "ro".into(), 0)), InvolvedQubits::None, InvolvedClassical::Set(HashSet::from([0_usize])), InvolvedModes::Set(HashSet::from([0_usize])))]
+fn involved_qubits_classical_modes(
+    op: ModeGateOperation,
+    qubits: InvolvedQubits,
+    classical: InvolvedClassical,
+    modes: InvolvedModes,
+) {
+    assert_eq!(op.involved_qubits(), qubits);
+    assert_eq!(op.involved_classical(), classical);
+    assert_eq!(op.involved_modes(), modes);
+}
+
+#[test_case(SingleModeOperation::from(PNRDetection::new(0, "ro".into(), 0)), InvolvedQubits::None, InvolvedClassical::Set(HashSet::from([("ro".into(), 0_usize)])), InvolvedModes::Set(HashSet::from([0_usize])))]
+fn involved_qubits_classical_modes_measurement(
+    op: SingleModeOperation,
+    qubits: InvolvedQubits,
+    classical: InvolvedClassical,
+    modes: InvolvedModes,
+) {
+    assert_eq!(op.involved_qubits(), qubits);
+    assert_eq!(op.involved_classical(), classical);
+    assert_eq!(op.involved_modes(), modes);
+}
+
+#[test_case(ModeGateOperation::from(Squeezing::new(2, "test".into())), ModeGateOperation::from(Squeezing::new(0, 0.1.into())))]
+#[test_case(ModeGateOperation::from(PhaseShift::new(2, "test".into())), ModeGateOperation::from(PhaseShift::new(0, 0.1.into())))]
+#[test_case(ModeGateOperation::from(BeamSplitter::new(2, 0, "test".into(), "test1".into())), ModeGateOperation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())))]
+fn substitute_subsitutemodes(op: ModeGateOperation, op_test: ModeGateOperation) {
+    let mut mapping_test: HashMap<usize, usize> = HashMap::new();
+    mapping_test.insert(0, 1);
+    mapping_test.insert(1, 2);
+    mapping_test.insert(2, 0);
+
+    let mut substitution_dict: Calculator = Calculator::new();
+    substitution_dict.set_variable("test", 0.1);
+    substitution_dict.set_variable("test1", 0.5);
+
+    // (1) Substitute parameters function
+    let result = op.substitute_parameters(&substitution_dict).unwrap();
+
+    // (2) Remap modes function
+    let result = result.remap_modes(&mapping_test).unwrap();
+    assert_eq!(result, op_test);
+
+    // (3) Remap qubits function
+    let result = result.remap_qubits(&mapping_test).unwrap();
+    assert_eq!(result, op_test);
+}
+
+#[test_case(SingleModeOperation::from(PNRDetection::new(2, "ro".into(), 0)), SingleModeOperation::from(PNRDetection::new(0, "ro".into(), 0)))]
+fn substitute_subsitutemodes_measurement(op: SingleModeOperation, op_test: SingleModeOperation) {
+    let mut mapping_test: HashMap<usize, usize> = HashMap::new();
+    mapping_test.insert(0, 1);
+    mapping_test.insert(1, 2);
+    mapping_test.insert(2, 0);
+
+    let mut substitution_dict: Calculator = Calculator::new();
+    substitution_dict.set_variable("test", 0.1);
+    substitution_dict.set_variable("test1", 0.5);
+
+    // (1) Substitute parameters function
+    let result = op.substitute_parameters(&substitution_dict).unwrap();
+
+    // (2) Remap modes function
+    let result = result.remap_modes(&mapping_test).unwrap();
+    assert_eq!(result, op_test);
+
+    // (3) Remap qubits function
+    let result = result.remap_qubits(&mapping_test).unwrap();
+    assert_eq!(result, op_test);
+}
+
+#[test_case(Operation::from(Squeezing::new(0, 0.1.into())), Operation::from(Squeezing::new(0, "param".into())), "Squeezing")]
+#[test_case(Operation::from(PhaseShift::new(0, 0.1.into())), Operation::from(PhaseShift::new(0, "param".into())), "PhaseShift")]
+fn operate_one_mode(op: Operation, op_param: Operation, name: &str) {
+    // (1) Test tags function
+    let tags: &[&str; 4] = &[
+        "Operation",
+        "ModeGateOperation",
+        "SingleModeGateOperation",
+        name,
+    ];
+    assert_eq!(op.tags(), tags);
+
+    // (2) Test hqslang function
+    assert_eq!(op.hqslang(), String::from(name));
+
+    // (3) Test is_parametrized function
+    assert!(!op.is_parametrized());
+    assert!(op_param.is_parametrized());
+}
+
+#[test_case(Operation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.1.into())), Operation::from(BeamSplitter::new(0, 1, 1.0.into(), "param".into())), "BeamSplitter")]
+fn operate_two_modes(op: Operation, op_param: Operation, name: &str) {
+    // (1) Test tags function
+    let tags: &[&str; 4] = &[
+        "Operation",
+        "ModeGateOperation",
+        "TwoModeGateOperation",
+        name,
+    ];
+    assert_eq!(op.tags(), tags);
+
+    // (2) Test hqslang function
+    assert_eq!(op.hqslang(), String::from(name));
+
+    // (3) Test is_parametrized function
+    assert!(!op.is_parametrized());
+    assert!(op_param.is_parametrized());
+}
+
+#[test_case(Operation::from(PNRDetection::new(0, "ro".into(), 0)), "PNRDetection")]
+fn operate_measurement(op: Operation, name: &str) {
+    // (1) Test tags function
+    let tags: &[&str; 3] = &["Operation", "Measurement", name];
+    assert_eq!(op.tags(), tags);
+
+    // (2) Test hqslang function
+    assert_eq!(op.hqslang(), String::from(name));
+
+    // (3) Test is_parametrized function
+    assert!(!op.is_parametrized());
+}
+
+#[test_case(SingleModeOperation::from(Squeezing::new(0, 0.5.into())))]
+#[test_case(SingleModeOperation::from(PhaseShift::new(0, 0.5.into())))]
+#[test_case(SingleModeOperation::from(PNRDetection::new(0, "ro".into(), 0)))]
+fn single_mode_op(op: SingleModeOperation) {
+    assert_eq!(op.mode(), &0_usize);
+}
+#[test_case(SingleModeGateOperation::from(Squeezing::new(0, 0.5.into())))]
+#[test_case(SingleModeGateOperation::from(PhaseShift::new(0, 0.5.into())))]
+fn single_mode_gate_op(op: SingleModeGateOperation) {
+    assert_eq!(op.mode(), &0_usize);
+}
+
+#[test_case(TwoModeOperation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())))]
+fn two_mode_op(op: TwoModeOperation) {
+    assert_eq!(op.mode_0(), &0_usize);
+    assert_eq!(op.mode_1(), &1_usize);
+}
+#[test_case(TwoModeGateOperation::from(BeamSplitter::new(0, 1, 0.1.into(), 0.5.into())))]
+fn two_mode_gate_op(op: TwoModeGateOperation) {
+    assert_eq!(op.mode_0(), &0_usize);
+    assert_eq!(op.mode_1(), &1_usize);
+}
+
+#[cfg(feature = "serialize")]
+#[test]
+fn squeezing_serde() {
+    let op = Squeezing::new(0, 0.1.into());
+
+    assert_tokens(
+        &op.clone().readable(),
+        &[
+            Token::Struct {
+                name: "Squeezing",
+                len: 2,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("squeezing"),
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+
+    assert_tokens(
+        &op.compact(),
+        &[
+            Token::Struct {
+                name: "Squeezing",
+                len: 2,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("squeezing"),
+            Token::NewtypeVariant {
+                name: "CalculatorFloat",
+                variant: "Float",
+            },
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+}
+
+#[cfg(feature = "serialize")]
+#[test]
+fn phaseshift_serde() {
+    let op = PhaseShift::new(0, 0.1.into());
+
+    assert_tokens(
+        &op.clone().readable(),
+        &[
+            Token::Struct {
+                name: "PhaseShift",
+                len: 2,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("phase"),
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+
+    assert_tokens(
+        &op.compact(),
+        &[
+            Token::Struct {
+                name: "PhaseShift",
+                len: 2,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("phase"),
+            Token::NewtypeVariant {
+                name: "CalculatorFloat",
+                variant: "Float",
+            },
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+}
+
+#[cfg(feature = "serialize")]
+#[test]
+fn beamsplitter_serde() {
+    let op = BeamSplitter::new(0, 1, 0.1.into(), 0.1.into());
+
+    assert_tokens(
+        &op.clone().readable(),
+        &[
+            Token::Struct {
+                name: "BeamSplitter",
+                len: 4,
+            },
+            Token::Str("mode_0"),
+            Token::U64(0),
+            Token::Str("mode_1"),
+            Token::U64(1),
+            Token::Str("theta"),
+            Token::F64(0.1),
+            Token::Str("phi"),
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+
+    assert_tokens(
+        &op.compact(),
+        &[
+            Token::Struct {
+                name: "BeamSplitter",
+                len: 4,
+            },
+            Token::Str("mode_0"),
+            Token::U64(0),
+            Token::Str("mode_1"),
+            Token::U64(1),
+            Token::Str("theta"),
+            Token::NewtypeVariant {
+                name: "CalculatorFloat",
+                variant: "Float",
+            },
+            Token::F64(0.1),
+            Token::Str("phi"),
+            Token::NewtypeVariant {
+                name: "CalculatorFloat",
+                variant: "Float",
+            },
+            Token::F64(0.1),
+            Token::StructEnd,
+        ],
+    );
+}
+
+#[cfg(feature = "serialize")]
+#[test]
+fn pnrdetection_serde() {
+    let op = PNRDetection::new(0, "ro".into(), 0);
+
+    assert_tokens(
+        &op.clone().readable(),
+        &[
+            Token::Struct {
+                name: "PNRDetection",
+                len: 3,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("readout"),
+            Token::Str("ro"),
+            Token::Str("readout_index"),
+            Token::U64(0),
+            Token::StructEnd,
+        ],
+    );
+
+    assert_tokens(
+        &op.compact(),
+        &[
+            Token::Struct {
+                name: "PNRDetection",
+                len: 3,
+            },
+            Token::Str("mode"),
+            Token::U64(0),
+            Token::Str("readout"),
+            Token::Str("ro"),
+            Token::Str("readout_index"),
+            Token::U64(0),
+            Token::StructEnd,
+        ],
+    );
+}
diff --git a/roqoqo/tests/integration/operations/mod.rs b/roqoqo/tests/integration/operations/mod.rs
index 039ccaf2..55da687b 100644
--- a/roqoqo/tests/integration/operations/mod.rs
+++ b/roqoqo/tests/integration/operations/mod.rs
@@ -37,6 +37,9 @@ pub use involved_classical::*;
 mod supported_version;
 pub use supported_version::*;
 
+mod bosonic_operations;
+pub use bosonic_operations::*;
+
 use nalgebra as na;
 use ndarray::Array2;
 use num_complex::Complex64;
diff --git a/roqoqo/tests/integration/operations/pragma_operations.rs b/roqoqo/tests/integration/operations/pragma_operations.rs
index f8403116..2122ce94 100644
--- a/roqoqo/tests/integration/operations/pragma_operations.rs
+++ b/roqoqo/tests/integration/operations/pragma_operations.rs
@@ -73,7 +73,7 @@ fn pragma_loop_operate_trait() {
     assert_eq!(pragma.hqslang(), String::from("PragmaLoop"));
 
     // (3) Test is_parametrized function
-    assert!(!pragma.is_parametrized());
+    assert!(pragma.is_parametrized());
 }
 
 /// Test PragmaSetNumberOfMeasurements Substitute trait
diff --git a/roqoqo/tests/integration/operations/supported_version.rs b/roqoqo/tests/integration/operations/supported_version.rs
index 037f869e..d563ccd3 100644
--- a/roqoqo/tests/integration/operations/supported_version.rs
+++ b/roqoqo/tests/integration/operations/supported_version.rs
@@ -57,6 +57,23 @@ fn test_version_1_2_0_two_qubit_gate(operation: operations::TwoQubitGateOperatio
     assert_eq!(op.minimum_supported_roqoqo_version(), (1, 2, 0));
 }
 
+#[test_case(operations::TwoQubitGateOperation::from(operations::ControlledRotateX::new(0, 1, 0.1.into())); "ControlledRotateX")]
+#[test_case(operations::TwoQubitGateOperation::from(operations::ControlledRotateXY::new(0, 1, 0.1.into(), 0.2.into())); "ControlledRotateXY")]
+fn test_version_1_3_0_two_qubit_gate(operation: operations::TwoQubitGateOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 3, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 3, 0));
+}
+
+#[test_case(operations::ThreeQubitGateOperation::from(operations::ControlledControlledPauliZ::new(0, 1, 2)); "ControlledControlledPauliZ")]
+#[test_case(operations::ThreeQubitGateOperation::from(operations::ControlledControlledPhaseShift::new(0, 1, 2, 0.1.into())); "ControlledControlledPhaseShift")]
+#[test_case(operations::ThreeQubitGateOperation::from(operations::Toffoli::new(0, 1, 2)); "Toffoli")]
+fn test_version_1_3_0_three_qubit_gate(operation: operations::ThreeQubitGateOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 3, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 3, 0));
+}
+
 #[test_case(operations::SingleQubitGateOperation::from(operations::Hadamard::new(0)); "Hadamard")]
 #[test_case(operations::SingleQubitGateOperation::from(operations::PauliX::new(0));"PauliX")]
 #[test_case(operations::SingleQubitGateOperation::from(operations::PauliY::new(0));"PauliY")]
@@ -78,6 +95,14 @@ fn test_version_1_0_0_single_qubit_gate(operation: operations::SingleQubitGateOp
     assert_eq!(op.minimum_supported_roqoqo_version(), (1, 0, 0));
 }
 
+#[test_case(operations::SingleQubitGateOperation::from(operations::GPi::new(0, 0.1.into()));"GPi")]
+#[test_case(operations::SingleQubitGateOperation::from(operations::GPi2::new(0, 0.1.into()));"GPi2")]
+fn test_version_1_4_0_single_qubit_gate(operation: operations::SingleQubitGateOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 4, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 4, 0));
+}
+
 #[test_case(operations::MultiQubitGateOperation::from(operations::MultiQubitMS::new(vec![0,1,2,3], 1.0.into())); "MultiQubitMS")]
 fn test_version_1_0_0_multi_qubit_gate(operation: operations::MultiQubitGateOperation) {
     assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 0, 0));
@@ -85,6 +110,28 @@ fn test_version_1_0_0_multi_qubit_gate(operation: operations::MultiQubitGateOper
     assert_eq!(op.minimum_supported_roqoqo_version(), (1, 0, 0));
 }
 
+#[test_case(operations::SingleModeGateOperation::from(operations::Squeezing::new(0, 1.0.into())); "Squeezing")]
+#[test_case(operations::SingleModeGateOperation::from(operations::PhaseShift::new(0, 1.0.into())); "PhaseShift")]
+fn test_version_1_6_0_single_mode_gate(operation: operations::SingleModeGateOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 6, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 6, 0));
+}
+
+#[test_case(operations::TwoModeGateOperation::from(operations::BeamSplitter::new(0, 1, 0.5.into(), 1.0.into())); "BeamSplitter")]
+fn test_version_1_6_0_two_mode_gate(operation: operations::TwoModeGateOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 6, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 6, 0));
+}
+
+#[test_case(operations::SingleModeOperation::from(operations::PNRDetection::new(0, "ro".into(), 1)); "PNRDetection")]
+fn test_version_1_6_0_measurement_mode_gate(operation: operations::SingleModeOperation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 6, 0));
+    let op = operations::Operation::try_from(operation).unwrap();
+    assert_eq!(op.minimum_supported_roqoqo_version(), (1, 6, 0));
+}
+
 #[test_case(operations::Operation::from(operations::PragmaSetNumberOfMeasurements::new(3, "ro".into())); "PragmaSetNumberOfMeasurements")]
 #[test_case(operations::Operation::from(operations::PragmaRepeatGate::new(3)); "PragmaRepeatGate")]
 #[test_case(operations::Operation::from(operations::PragmaGeneralNoise::new(0, 1.0.into(),  array![[0.1, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]])); "PragmaGeneralNoise")]
@@ -113,11 +160,18 @@ fn test_version_1_0_0_pragmas(operation: operations::Operation) {
 }
 
 #[test_case(operations::Operation::from(operations::PragmaLoop::new(10.into(), roqoqo::Circuit::new())); "PragmaLoop")]
+#[test_case(operations::Operation::from(operations::InputBit::new(String::from("test"), 1, false)); "InputBit")]
 
 fn test_version_1_1_0_pragmas(operation: operations::Operation) {
     assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 1, 0));
 }
 
+#[test_case(operations::Operation::from(operations::PragmaControlledCircuit::new(10, roqoqo::Circuit::new())); "PragmaControlledCircuit")]
+
+fn test_version_1_5_0_pragmas(operation: operations::Operation) {
+    assert_eq!(operation.minimum_supported_roqoqo_version(), (1, 5, 0));
+}
+
 #[cfg(feature = "circuitdag")]
 #[test_case(roqoqo::Circuit::from_iter(vec![
     operations::Operation::from(operations::DefinitionBit::new("ro".to_string(), 2, true))