From 80f3ed365ebf95a2d3a95ef72188d143943b4619 Mon Sep 17 00:00:00 2001
From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu>
Date: Mon, 11 Mar 2019 14:21:05 +0100
Subject: [PATCH] Removed bitset2 and canInteractFlag for Sibyll/Interaction

---
 Processes/Sibyll/Interaction.cc               |   8 +-
 Processes/Sibyll/ParticleConversion.h         |  14 +-
 Processes/Sibyll/code_generator.py            |  53 +-
 Processes/Sibyll/sibyll_codes.dat             |  12 +-
 Processes/Sibyll/testSibyll.cc                |   6 -
 ThirdParty/CMakeLists.txt                     |   1 -
 ThirdParty/bitset2/LICENSE.txt                |  23 -
 ThirdParty/bitset2/README.md                  | 232 -----
 ThirdParty/bitset2/bitset2.hpp                | 646 -------------
 ThirdParty/bitset2/detail/array2array.hpp     | 122 ---
 ThirdParty/bitset2/detail/array2u_long_t.hpp  | 110 ---
 ThirdParty/bitset2/detail/array_access.hpp    |  82 --
 ThirdParty/bitset2/detail/array_add.hpp       | 153 ---
 .../bitset2/detail/array_complement2.hpp      | 149 ---
 ThirdParty/bitset2/detail/array_funcs.hpp     | 346 -------
 ThirdParty/bitset2/detail/array_ops.hpp       | 336 -------
 ThirdParty/bitset2/detail/bit_chars.hpp       |  65 --
 ThirdParty/bitset2/detail/bitset2_impl.hpp    | 400 --------
 ThirdParty/bitset2/detail/count_bits.hpp      |  45 -
 ThirdParty/bitset2/detail/h_types.hpp         | 107 ---
 ThirdParty/bitset2/detail/hash.hpp            | 126 ---
 ThirdParty/bitset2/detail/hex_params.hpp      |  54 --
 ThirdParty/bitset2/detail/index_lsb_set.hpp   |  73 --
 ThirdParty/bitset2/detail/reverse_bits.hpp    |  66 --
 ThirdParty/bitset2/detail/select_base_t.hpp   |  82 --
 ThirdParty/bitset2/detail/ullong2array.hpp    |  80 --
 ThirdParty/bitset2/tests/bench01.cpp          | 131 ---
 ThirdParty/bitset2/tests/counter128.cpp       |  29 -
 ThirdParty/bitset2/tests/example01.cpp        |  52 -
 ThirdParty/bitset2/tests/gen_randoms.hpp      | 108 ---
 ThirdParty/bitset2/tests/gray_code.cpp        |  50 -
 ThirdParty/bitset2/tests/mk.sh                |  43 -
 ThirdParty/bitset2/tests/test_array2array.cpp | 111 ---
 ThirdParty/bitset2/tests/test_bitset2_01.cpp  | 420 --------
 ThirdParty/bitset2/tests/test_bitset2_02.cpp  |  49 -
 .../tests/test_nonconst_constexpr01.cpp       | 172 ----
 .../bitset2/tests/test_ullong2array.cpp       | 127 ---
 ThirdParty/bitset2/tests/tests01.cpp          | 903 ------------------
 38 files changed, 14 insertions(+), 5572 deletions(-)
 delete mode 100644 ThirdParty/bitset2/LICENSE.txt
 delete mode 100644 ThirdParty/bitset2/README.md
 delete mode 100644 ThirdParty/bitset2/bitset2.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array2array.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array2u_long_t.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array_access.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array_add.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array_complement2.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array_funcs.hpp
 delete mode 100644 ThirdParty/bitset2/detail/array_ops.hpp
 delete mode 100644 ThirdParty/bitset2/detail/bit_chars.hpp
 delete mode 100644 ThirdParty/bitset2/detail/bitset2_impl.hpp
 delete mode 100644 ThirdParty/bitset2/detail/count_bits.hpp
 delete mode 100644 ThirdParty/bitset2/detail/h_types.hpp
 delete mode 100644 ThirdParty/bitset2/detail/hash.hpp
 delete mode 100644 ThirdParty/bitset2/detail/hex_params.hpp
 delete mode 100644 ThirdParty/bitset2/detail/index_lsb_set.hpp
 delete mode 100644 ThirdParty/bitset2/detail/reverse_bits.hpp
 delete mode 100644 ThirdParty/bitset2/detail/select_base_t.hpp
 delete mode 100644 ThirdParty/bitset2/detail/ullong2array.hpp
 delete mode 100644 ThirdParty/bitset2/tests/bench01.cpp
 delete mode 100644 ThirdParty/bitset2/tests/counter128.cpp
 delete mode 100644 ThirdParty/bitset2/tests/example01.cpp
 delete mode 100644 ThirdParty/bitset2/tests/gen_randoms.hpp
 delete mode 100644 ThirdParty/bitset2/tests/gray_code.cpp
 delete mode 100755 ThirdParty/bitset2/tests/mk.sh
 delete mode 100644 ThirdParty/bitset2/tests/test_array2array.cpp
 delete mode 100644 ThirdParty/bitset2/tests/test_bitset2_01.cpp
 delete mode 100644 ThirdParty/bitset2/tests/test_bitset2_02.cpp
 delete mode 100644 ThirdParty/bitset2/tests/test_nonconst_constexpr01.cpp
 delete mode 100644 ThirdParty/bitset2/tests/test_ullong2array.cpp
 delete mode 100644 ThirdParty/bitset2/tests/tests01.cpp

diff --git a/Processes/Sibyll/Interaction.cc b/Processes/Sibyll/Interaction.cc
index 7b2532ea6..d54b974a5 100644
--- a/Processes/Sibyll/Interaction.cc
+++ b/Processes/Sibyll/Interaction.cc
@@ -177,10 +177,8 @@ namespace corsika::process::sibyll {
         i++;
         cout << "Interaction: get interaction length for target: " << targetId << endl;
 
-        auto const [productionCrossSection, elaCrossSection] =
+        [[maybe_unused]] auto const [productionCrossSection, elaCrossSection] =
             GetCrossSection(corsikaBeamId, targetId, ECoM);
-        [[maybe_unused]] auto elaCrossSectionCopy =
-            elaCrossSection; // ONLY TO AVOID COMPILER WARNING
 
         cout << "Interaction: "
              << " IntLength: sibyll return (mb): " << productionCrossSection / 1_mb
@@ -188,8 +186,8 @@ namespace corsika::process::sibyll {
         weightedProdCrossSection += w[i] * productionCrossSection;
       }
       cout << "Interaction: "
-           << "IntLength: weighted CrossSection (mb): "
-           << weightedProdCrossSection / 1_mb << endl;
+           << "IntLength: weighted CrossSection (mb): " << weightedProdCrossSection / 1_mb
+           << endl;
 
       // calculate interaction length in medium
       //#warning check interaction length units
diff --git a/Processes/Sibyll/ParticleConversion.h b/Processes/Sibyll/ParticleConversion.h
index 90e0b612c..0d67fc830 100644
--- a/Processes/Sibyll/ParticleConversion.h
+++ b/Processes/Sibyll/ParticleConversion.h
@@ -14,8 +14,6 @@
 
 #include <corsika/particles/ParticleProperties.h>
 
-#include <bitset2/bitset2.hpp>
-
 #include <map>
 
 namespace corsika::process::sibyll {
@@ -25,14 +23,6 @@ namespace corsika::process::sibyll {
 
 #include <corsika/process/sibyll/Generated.inc>
 
-  bool constexpr KnownBySibyll(corsika::particles::Code pCode) {
-    return isKnown[static_cast<corsika::particles::CodeIntType>(pCode)];
-  }
-
-  bool constexpr CanInteract(corsika::particles::Code pCode) {
-    return canInteract[static_cast<corsika::particles::CodeIntType>(pCode)];
-  }
-
   SibyllCode constexpr ConvertToSibyll(corsika::particles::Code pCode) {
     return static_cast<SibyllCode>(
         corsika2sibyll[static_cast<corsika::particles::CodeIntType>(pCode)]);
@@ -50,6 +40,10 @@ namespace corsika::process::sibyll {
     return corsika2sibyllXStype[static_cast<corsika::particles::CodeIntType>(pCode)];
   }
 
+  bool constexpr CanInteract(corsika::particles::Code pCode) {
+    return GetSibyllXSCode(pCode) != 0;
+  }
+
 } // namespace corsika::process::sibyll
 
 #endif
diff --git a/Processes/Sibyll/code_generator.py b/Processes/Sibyll/code_generator.py
index e1cfcbfaf..cb7d0cb24 100755
--- a/Processes/Sibyll/code_generator.py
+++ b/Processes/Sibyll/code_generator.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
+# (c) Copyright 2018-2019 CORSIKA Project, corsika-project@lists.kit.edu
 #
 # See file AUTHORS for a list of contributors.
 #
@@ -31,7 +31,6 @@ def read_sibyll_codes(filename, particle_db):
             identifier, sib_code, canInteractFlag, xsType = line.split()
             try:
                 particle_db[identifier]["sibyll_code"] = int(sib_code)
-                particle_db[identifier]["sibyll_canInteract"] = int(canInteractFlag)
                 particle_db[identifier]["sibyll_xsType"] = int(xsType)
             except KeyError as e:
                 raise Exception("Identifier '{:s}' not found in particle_db".format(identifier))
@@ -101,54 +100,6 @@ def generate_sibyll2corsika(particle_db) :
     string += "};\n"
     return string
 
-
-
-# generates the bitset for the flag whether Sibyll knows the particle
-def generate_known_particle(particle_db):
-    num_particles = len(particle_db)
-    num_bytes = num_particles // 32 + 1
-    string = "Bitset2::bitset2<{:d}> constexpr isKnown{{ std::array<uint32_t, {:d}>{{{{\n".format(num_particles, num_bytes)
-    
-    numeric = 0
-    for identifier, pData in reversed(particle_db.items()):
-        handledBySibyll = int("sibyll_code" in pData) & 0x1
-        numeric = (numeric << 1) | handledBySibyll
-    
-    while numeric != 0:
-        low = numeric & 0xFFFFFFFF
-        numeric = numeric >> 32
-        string += "  0x{:0x},\n".format(low)
-        
-    string += "}}};\n"
-    return string
-
-
-
-# generates the bitset for the flag whether Sibyll can use particle as projectile
-def generate_interacting_particle(particle_db):
-    num_particles = len(particle_db)
-    num_bytes = num_particles // 32 + 1
-    string = "Bitset2::bitset2<{:d}> constexpr canInteract{{ std::array<uint32_t, {:d}>{{{{\n".format(num_particles, num_bytes)
-    #string = "std::array<bool, {:d}> constexpr corsika2sibyll = {{\n".format(num_particles)
-    
-    numeric = 0    
-    for identifier, pData in reversed(particle_db.items()):
-        can = 0
-        if 'sibyll_canInteract' in pData:
-            if pData['sibyll_canInteract'] > 0:
-                can = 0x1
-        numeric = (numeric << 1) | can
-    
-    while numeric != 0:
-        low = numeric & 0xFFFFFFFF
-        numeric = numeric >> 32
-        string += "  0x{:0x},\n".format(low)
-    
-    string += "}}};\n"
-    return string
-    
-
-
 if __name__ == "__main__":
     if len(sys.argv) != 3:
         print("usage: {:s} <particle_db.pkl> <sibyll_codes.dat>".format(sys.argv[0]), file=sys.stderr)
@@ -163,7 +114,5 @@ if __name__ == "__main__":
         print("// this file is automatically generated\n// edit at your own risk!\n", file=f)
         print(generate_sibyll_enum(particle_db), file=f)
         print(generate_corsika2sibyll(particle_db), file=f)
-        print(generate_known_particle(particle_db), file=f)
         print(generate_sibyll2corsika(particle_db), file=f)
-        print(generate_interacting_particle(particle_db), file=f)
         print(generate_corsika2sibyll_xsType(particle_db), file=f)
diff --git a/Processes/Sibyll/sibyll_codes.dat b/Processes/Sibyll/sibyll_codes.dat
index fc8515886..08209d0f9 100644
--- a/Processes/Sibyll/sibyll_codes.dat
+++ b/Processes/Sibyll/sibyll_codes.dat
@@ -30,16 +30,16 @@ KPlus 9 1 3
 KMinus 10 1 3
 KStarPlus 28 0 0
 KStarMinus 29 0 0
-DPlus 59 1 0
-DMinus 60 1 0
+DPlus 59 1 3
+DMinus 60 1 3
 DStarPlus 78 0 0
 DStarMinus 79 0 0
-D0 71 1 0
-D0Bar 72 1 0
+D0 71 1 3
+D0Bar 72 1 3
 DStar0 80 0 0
 DStar0Bar 81 0 0
-DsPlus 74 1 0
-DsMinus 75 1 0
+DsPlus 74 1 3
+DsMinus 75 1 3
 DStarSPlus 76 0 0
 DStarSMinus 77 0 0
 EtaC 73 0 0
diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc
index c9b2cddfa..d5b71ae6d 100644
--- a/Processes/Sibyll/testSibyll.cc
+++ b/Processes/Sibyll/testSibyll.cc
@@ -41,12 +41,6 @@ TEST_CASE("Sibyll", "[processes]") {
     REQUIRE(process::sibyll::ConvertToSibyllRaw(particles::Proton::GetCode()) == 13);
   }
 
-  SECTION("KnownBySibyll") {
-    REQUIRE(process::sibyll::KnownBySibyll(particles::Electron::GetCode()));
-
-    REQUIRE_FALSE(process::sibyll::KnownBySibyll(particles::XiPrimeC0::GetCode()));
-  }
-
   SECTION("canInteractInSibyll") {
 
     REQUIRE(process::sibyll::CanInteract(particles::Proton::GetCode()));
diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt
index fb6c08fce..c7f90c5b9 100644
--- a/ThirdParty/CMakeLists.txt
+++ b/ThirdParty/CMakeLists.txt
@@ -9,4 +9,3 @@ target_include_directories (CORSIKAthirdparty SYSTEM
 
 install (DIRECTORY phys DESTINATION include/ThirdParty/)
 install (DIRECTORY catch2 DESTINATION include/ThirdParty/)
-install (DIRECTORY bitset2 DESTINATION include/ThirdParty/)
diff --git a/ThirdParty/bitset2/LICENSE.txt b/ThirdParty/bitset2/LICENSE.txt
deleted file mode 100644
index 36b7cd93c..000000000
--- a/ThirdParty/bitset2/LICENSE.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/ThirdParty/bitset2/README.md b/ThirdParty/bitset2/README.md
deleted file mode 100644
index 5e7f2f9e8..000000000
--- a/ThirdParty/bitset2/README.md
+++ /dev/null
@@ -1,232 +0,0 @@
-# bitset2: bitset improved
-
-|Note|
-|----|
-|This version of bitset2 is for C++17. For C++14 checkout the corresponding [branch](https://github.com/ClaasBontus/bitset2/tree/cpp14).|
-
-Bitset2::bitset2 is a header only library. It provides the same functionality as [std::bitset](http://en.cppreference.com/w/cpp/utility/bitset) with the
-following extentions/changes.
-
-
-Focus was set on having as many functions
-implemented as [constexpr](http://en.cppreference.com/w/cpp/language/constexpr)
-as possible. Moreover a second template parameter (with appropriate default)
-allows control of the underlying data structure (see below).
-* Copy and move constructors are specified constexpr.
-* Additional constexpr constructor `bitset2( std::array<T,N> const & )`, where `T` needs not necessarily be equal to `base_t`. `T` has to be an unsigned integral type.
-* Conversion from and to `std::bitset`.
-* Operators implemented as constexpr are `~`, `==`, `!=`, `|`, `&`, `^`, `<<` (shift left), `>>` (shift right), `[]` (bit access).
-* Non-const operators implemented as constexpr are `<<=`, `>>=`, `|=`, `&=`, `^=`
-* Functions implemented as constexpr are `test`, `none`, `any`, `all`, `count`, `to_ulong`, `to_ullong`.
-* Non-const functions implemented as constexpr are `set`, `reset`, `flip`.
-* Additional constexpr operator `+` for adding two bitset2 objects.
-* Additional constexpr operators `++`, `--`, `+=`.
-* Additional constexpr operators `<`, `>`, `<=`, `>=`.
-* Additional constexpr functions `rotate_left` and `rotate_right` for binary rotations.
-* Additional constexpr member functions `rotate_left` and `rotate_right`.
-* Additional member function `to_hex_string()` (see below).
-* Additional constexpr member function `test_set( size_t bit, bool value= true )`, which sets or clears the specified bit and returns its previous state. Throws `out_of_range` if bit >= N.
-* Additional constexpr function `difference`, which computes the set difference (`bs1 & ~bs2`) of two bitset2 objects.
-* Additional constexpr member function `difference`.
-* Additional constexpr member functions `find_first()` and `find_next(size_t)` returning the index of the  first (next) bit set. Returning npos if all (remaining) bits are false.
-* Additional constexpr function `complement2(bs)` computing the [two's complement](https://en.wikipedia.org/wiki/Two%27s_complement) (~bs +1).
-* Additional constexpr member function `complement2`.
-* Additional constexpr function `reverse`, which returns argument with bits reversed.
-* Additional constexpr member function `reverse`.
-* Additional constexpr function `convert_to<n>` for converting an *m*-bit bitset2 into an *n*-bit bitset2.
-* Additional constexpr function `convert_to<n,T>` for converting an *m*-bit bitset2 into an *n*-bit bitset2 with `base_t=T`.
-* Constexpr member function `data()` gives read access to the underlying `array<base_t,N>`. Here element with index zero is the least significant word.
-* Additional constexpr functions `zip_fold_and` and `zip_fold_or`. See below for details.
-
-## Examples
-```.cpp
-#include <iostream>
-#include <array>
-#include <cassert>
-#include "bitset2.hpp"
-
-template<size_t n_bits>
-using BS2=      Bitset2::bitset2<n_bits>;
-
-int main()
-{
-  using bs_128= BS2<128>;
-  using base_t_128= bs_128::base_t;
-  constexpr std::array<base_t_128,2>
-            ar1{{ ~(base_t_128(0)), base_t_128(0xFEDCBA) }};
-  constexpr bs_128                  b1{ ar1 };
-  constexpr auto                    b1_add=  b1 + b1;
-  constexpr auto                    b1_shft= b1 << 1; // binary shift
-  static_assert( b1_add == b1_shft, "" );
-
-  std::cout << b1.to_hex_string()       // 0000000000fedcbaffffffffffffffff
-            << "\n"
-            << b1_add.to_hex_string()   // 0000000001fdb975fffffffffffffffe
-            << "\n";
-
-  BS2<12>   b2;
-  for( size_t c= 0; c < 12; c += 2 ) b2[c]= true;
-  auto      b3= ~b2;
-  std::cout << b2 << "\n";         // 010101010101
-  std::cout << b2.flip() << "\n";  // 101010101010
-  assert( b2 == b3 );
-
-  BS2<7> const   b4{ "1110000" };
-  auto const     b5= Bitset2::rotate_left( b4, 3 );
-  std::cout << b4 << "\n"     // 1110000
-            << b5 << "\n";    // 0000111
-
-  BS2<7>        b6{ "1010010" };
-  b6.reverse();
-  std::cout << b6 << "\n";    // 0100101
-}
-```
-
-The following example illustrates how
-[non-const constexpr](https://stackoverflow.com/q/43592862/3876684)
-operators and functions are useful for writing constexpr functions.
-It converts between [gray](https://en.wikipedia.org/wiki/Gray_code)
-and binary coding.
-
-```.cpp
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-binary_to_gray( Bitset2::bitset2<N,T> const &bs )
-{ return bs ^ (bs >> 1); }
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-gray_to_binary( Bitset2::bitset2<N,T> bs )
-{
-  Bitset2::bitset2<N,T>   mask= bs >> 1;
-  for( ; !mask.none(); mask >>= 1 )  bs ^= mask;
-  return bs;
-} // gray_to_binary
-
-int main()
-{
-  using ULLONG= unsigned long long;
-  constexpr std::array<ULLONG,2>  arr_01a{{ 0xFEFDFCFBFAF9F8F7ull, 1ull }};
-  constexpr Bitset2::bitset2<129> bs_01a{ arr_01a };
-  constexpr auto                  gray_01a= binary_to_gray( bs_01a );
-  constexpr auto                  bin_01a=  gray_to_binary( gray_01a );
-
-  static_assert( bs_01a == bin_01a, "" );
-}
-```
-
-## Template parameters and underlying data type
-`bitset2` is declared as
-```.cpp
-template< size_t N, class T >
-class bitset2;
-```
-`N` is the number of bits and `T` has to be an unsigned
-[integral type](http://en.cppreference.com/w/cpp/types/is_integral). Data
-represented by `bitset2` objects are stored in elements of type
-`std::array<T,n_array>`.
-
-`T` defaults
-to `uint8_t`, `uint16_t`, or `uint32_t` if `N` bits fit into these integers
-(and the type is supported by the system).
-`T` defaults to `unsigned long long` otherwise. The following aliases and
-constants are public within `bitset2`:
-* `using base_t= T;`
-* `size_t n_array;` Number of words in underlying array
-* `using array_t= std::array<T,n_array>;` Underlying data type
-
-## to_hex_string
-Function `to_hex_string` takes - as an optional argument - an element of type
-`hex_params`, which is defined as
-```.cpp
-template< class CharT = char,
-          class Traits = std::char_traits<CharT>,
-          class Allocator = std::allocator<CharT> >
-struct hex_params
-{
-  using str_t= std::basic_string<CharT,Traits,Allocator>;
-
-  CharT        zeroCh=         CharT( '0' );
-  CharT        aCh=            CharT( 'a' );
-  bool         leadingZeroes=  true;
-  bool         nonEmpty=       true;
-  str_t        prefix;
-};
-```
-It allows fine tuning the outcome of the function. In the following
-examples the output is shown in the comments.
-```.cpp
-bitset2<16>  b16_a( "0000101000011111" );
-bitset2<16>  b16_b;
-std::cout
-  << b16_a.to_hex_string() << '\n'                                    // 0a1f
-  << b16_a.to_hex_string( hex_params<>{'0', 'A', false, true, "0x"})  // 0xA1F
-  << '\n'
-  << b16_b.to_hex_string() << '\n'                                    // 0000
-  << b16_b.to_hex_string( hex_params<>{'0', 'a', false, false, "0X"}) // 0X
-  << '\n';
-```
-
-## zip\_fold\_&ast;
-Functions `zip_fold_and(bs1,bs2,f)` and `zip_fold_or(bs1,bs2,f)` expect two
-variables of type `bitset2` and a functional object `f`.
-The latter must accept two variables of type `base_t` and return a `bool`.
-`zip_fold_*` are mapped over the underlying
-`std::array<base_t,n>`s. They will
-[short-circuit](http://en.cppreference.com/w/cpp/language/operator_logical)
-if possible, which can result in performance advantages.
-`zip_fold_and` returns `true` if `f`
-returns `true` for each pair of `base_t`s, while `zip_fold_or` returns `true`
-if `f` returns `true` for at least one pair of `base_t`s.
-In other words `zip_fold_and` and `zip_fold_or` are similar to
-[`std::inner_product(...,BinOp1 op1,BinOp2 op2)`](http://en.cppreference.com/w/cpp/algorithm/inner_product)
-with `op1` set to `&&` and `||`, resp.
-
-For instance `is_subset_of` as proposed in [p0125r0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0125r0.html)
-can be implemented as follows.
-```.cpp
-template<size_t N,class T>
-constexpr
-bool
-is_subset_of( Bitset2::bitset2<N,T> const &bs1,
-              Bitset2::bitset2<N,T> const &bs2 ) noexcept
-{
-  using base_t= T;
-  return Bitset2::zip_fold_and( bs1, bs2,
-                                []( base_t v1, base_t v2 ) noexcept
-                                  // Any bit unset in v2 must not be set in v1
-                                  { return (v1 & ~v2) == 0; } );
-}
-
-constexpr Bitset2::bitset2<7>    b7_a( 0b1000101ull );
-constexpr Bitset2::bitset2<7>    b7_b( 0b1010101ull );
-static_assert( is_subset_of( b7_a, b7_b), "" );
-```
-
-Similarly an `unequal` function can be defined as
-```.cpp
-template<size_t N,class T>
-bool
-unequal( Bitset2::bitset2<N,T> const &bs1, Bitset2::bitset2<N,T> const &bs2 )
-{
-  using base_t= T;
-  return Bitset2::zip_fold_or( bs1, bs2,
-                               []( base_t v1, base_t v2 ) noexcept
-                                 { return v1 != v2; } );
-}
-```
-
-## Trivia
-The following code shows a counter based on a 128-bit integer. If the
-counter gets incremented once at each nanosecond, you have to wait for
-overflow for *only* [1.078 * 10<sup>22</sup> years](http://www.wolframalpha.com/input/?i=2%5E128+nanoseconds).
-```.cpp
-Bitset2::bitset2<128> c;
-for( ;; ++c ) {}
-```
-
-## Caveats
-* bitset2 requires a C++17 compliant compiler.
-* Tested with gcc 7 and clang 5.
diff --git a/ThirdParty/bitset2/bitset2.hpp b/ThirdParty/bitset2/bitset2.hpp
deleted file mode 100644
index 0b9c95aad..000000000
--- a/ThirdParty/bitset2/bitset2.hpp
+++ /dev/null
@@ -1,646 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#ifndef BITSET2_CB_HPP
-#define BITSET2_CB_HPP
-
-
-#include "detail/hex_params.hpp"
-#include "detail/select_base_t.hpp"
-#include "detail/hash.hpp"
-#include "detail/array_access.hpp"
-#include "detail/array_funcs.hpp"
-#include "detail/array_add.hpp"
-#include "detail/array_ops.hpp"
-#include "detail/array_complement2.hpp"
-#include "detail/array2array.hpp"
-#include "detail/bitset2_impl.hpp"
-
-#include <bitset>
-#include <climits>
-#include <cstdint>
-#include <array>
-#include <stdexcept>
-#include <utility>
-#include <string>
-#include <functional>
-#include <type_traits>
-
-
-
-namespace Bitset2
-{
-
-
-
-template<size_t N,
-         class T= Bitset2::detail::select_base_t<N>,
-         class Enabled=void> class bitset2;
-
-template<size_t N,class T>
-class bitset2<N,T,
-              typename std::enable_if<   std::is_integral<T>::value
-                                      && std::is_unsigned<T>::value>::type>
-: public detail::bitset2_impl<N,T>
-{
-  enum : size_t { base_t_n_bits= detail::bitset2_impl<N,T>::base_t_n_bits };
-public:
-  using array_t=  typename detail::bitset2_impl<N,T>::array_t;
-  using ULLONG_t= typename detail::bitset2_impl<N,T>::ULLONG_t;
-  using base_t=   T;
-  using detail::bitset2_impl<N,T>::n_array;
-
-  enum : size_t { npos= detail::h_types<T>::npos };
-
-  class reference
-  {
-    friend class bitset2;
-    reference() noexcept {}
-    reference( bitset2<N,T> *ptr, size_t bit ) noexcept
-    : m_ptr( ptr )
-    , m_bit( bit )
-    {}
-    bitset2<N,T> *m_ptr= nullptr;
-    size_t       m_bit;
-  public:
-    ~reference() noexcept {}
-    reference& operator=( bool x ) noexcept
-    {
-      m_ptr->set_noexcept( m_bit, x );
-      return *this;
-    }
-    reference& operator=( reference const & r ) noexcept
-    {
-      m_ptr->set_noexcept( m_bit, bool( r ) );
-      return *this;
-    }
-    reference& flip() noexcept
-    {
-      m_ptr->flip_noexcept( m_bit );
-      return *this;
-    }
-    operator bool() const noexcept
-    { return m_ptr->test_noexcept(m_bit); }
-    bool operator~() const noexcept
-    { return !bool(*this); }
-  }; // class reference
-
-
-  /* ------------------------------------------------------------- */
-  constexpr
-  bitset2() noexcept
-  : detail::bitset2_impl<N,T>()
-  {}
-
-  constexpr
-  bitset2( bitset2 const & ) noexcept= default;
-
-  constexpr
-  bitset2( bitset2 && ) noexcept= default;
-
-  constexpr
-  bitset2 &
-  operator=( bitset2 const & ) noexcept= default;
-
-  constexpr
-  bitset2 &
-  operator=( bitset2 && ) noexcept= default;
-
-  explicit
-  bitset2( const std::bitset<N> &bs ) noexcept
-  : detail::bitset2_impl<N,T>( bs )
-  {}
-
-  explicit
-  constexpr
-  bitset2( ULLONG_t v ) noexcept
-  : detail::bitset2_impl<N,T>( v )
-  {}
-
-  template<size_t n,class Tsrc>
-  explicit
-  constexpr
-  bitset2( std::array<Tsrc,n> const & value ) noexcept
-  : detail::bitset2_impl<N,T>( value )
-  {}
-
-  template< class CharT, class Traits, class Alloc >
-  explicit
-  bitset2( std::basic_string<CharT,Traits,Alloc> const
-                    & str,
-           typename std::basic_string<CharT,Traits,Alloc>::size_type
-                    pos = 0,
-           typename std::basic_string<CharT,Traits,Alloc>::size_type
-                    n = std::basic_string<CharT,Traits,Alloc>::npos,
-           CharT    zero= CharT('0'),
-           CharT    one=  CharT('1') )
-  : detail::bitset2_impl<N,T>( str, pos, n, zero, one )
-  {}
-
-
-  template< class CharT >
-  explicit
-  bitset2( const CharT        *str,
-           typename std::basic_string<CharT>::size_type
-                              n=     std::basic_string<CharT>::npos,
-           CharT              zero=  CharT('0'),
-           CharT              one=   CharT('1') )
-  : detail::bitset2_impl<N,T>( n == std::basic_string<CharT>::npos
-                               ? std::basic_string<CharT>( str )
-                               : std::basic_string<CharT>( str, n ),
-                               0, n, zero, one )
-  {}
-  /* ------------------------------------------------------------- */
-
-
-  //****************************************************
-
-  /// Bitwise NOT
-  constexpr
-  bitset2
-  operator~() const noexcept
-  { return bitset2(detail::array_ops<N,T>( 0 ).flip(this->data())); }
-
-  constexpr
-  bool
-  operator[]( size_t bit ) const noexcept
-  { return detail::bitset2_impl<N,T>::operator[]( bit ); }
-
-  reference
-  operator[]( size_t bit ) noexcept
-  { return reference( this, bit ); }
-
-  constexpr
-  bitset2 &
-  operator<<=( size_t n_shift ) noexcept
-  {
-    detail::array_ops<N,T>( n_shift ).shift_left_assgn( this->get_data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  operator>>=( size_t n_shift ) noexcept
-  {
-    detail::array_ops<N,T>( n_shift ).shift_right_assgn( this->get_data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  rotate_left( size_t n_rot ) noexcept
-  {
-    this->get_data()= detail::array_ops<N,T>(n_rot).rotate_left( this->data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  rotate_right( size_t n_rot ) noexcept
-  {
-    this->get_data()= detail::array_ops<N,T>( N - ( n_rot % N ) )
-                                        .rotate_left( this->data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  reverse() noexcept
-  {
-    this->get_data()= detail::array_ops<N,T>( 0 ).reverse( this->data() );
-    return *this;
-  }
-
-  /// Computes two's complement
-  constexpr
-  bitset2 &
-  complement2() noexcept
-  {
-    detail::array_complement2<N,T>().comp2_assgn( this->get_data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  operator+=( bitset2 const &bs2 ) noexcept
-  {
-    detail::array_add<N,T>().add_assgn(this->get_data(), bs2.data());
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  operator++() noexcept
-  {
-    detail::array_ops<N,T>(0).increment( this->get_data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2
-  operator++(int) noexcept
-  {
-    bitset2 tmp( *this );
-    operator++();
-    return tmp;
-  }
-
-  constexpr
-  bitset2 &
-  operator--() noexcept
-  {
-    detail::array_ops<N,T>(0).decrement( this->get_data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2
-  operator--(int) noexcept
-  {
-    bitset2 tmp( *this );
-    operator--();
-    return tmp;
-  }
-
-  constexpr
-  bitset2 &
-  operator|=( bitset2 const & v2 ) noexcept
-  {
-    detail::array_funcs<bitset2::n_array,T>()
-             .bitwise_or_assgn(this->get_data(), v2.data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  operator&=( bitset2 const & v2 ) noexcept
-  {
-    detail::array_funcs<bitset2::n_array,T>()
-              .bitwise_and_assgn( this->get_data(), v2.data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  operator^=( bitset2 const & v2 ) noexcept
-  {
-    detail::array_funcs<bitset2::n_array,T>()
-              .bitwise_xor_assgn( this->get_data(), v2.data() );
-    return *this;
-  }
-
-  /// Computes the set difference, i.e. *this &= ~v2
-  constexpr
-  bitset2 &
-  difference( bitset2 const & v2 ) noexcept
-  {
-    detail::array_funcs<bitset2::n_array,T>()
-              .bitwise_setdiff_assgn( this->get_data(), v2.data() );
-    return *this;
-  }
-
-  constexpr
-  bitset2 &
-  set() noexcept
-  { detail::bitset2_impl<N,T>::set(); return *this; }
-
-  constexpr
-  bitset2 &
-  set( size_t bit, bool value= true )
-  { detail::bitset2_impl<N,T>::set( bit, value ); return *this; }
-
-  constexpr
-  bitset2 &
-  reset() noexcept
-  { detail::bitset2_impl<N,T>::reset(); return *this; }
-
-  constexpr
-  bitset2 &
-  reset( size_t bit )
-  {
-    if( bit >= N  ) throw std::out_of_range( "bitset2: reset out of range" );
-   return set( bit, false );
- }
-
- /// \brief Sets the specified bit if value==true,
- /// clears it otherwise. Returns the previous state of the bit.
- constexpr
- bool
- test_set( size_t bit, bool value= true )
- { return detail::bitset2_impl<N,T>::test_set( bit, value ); }
-
- constexpr
- bitset2 &
- flip() noexcept
- { detail::bitset2_impl<N,T>::flip(); return *this; }
-
- constexpr
- bitset2 &
- flip( size_t bit )
- { detail::bitset2_impl<N,T>::flip( bit ); return *this; }
-
- constexpr std::size_t size() const noexcept { return N; }
-
- template<class CharT = char,
-          class Traits = std::char_traits<CharT>,
-          class Allocator = std::allocator<CharT> >
- std::basic_string<CharT,Traits,Allocator>
- to_string( CharT zero = CharT('0'), CharT one = CharT('1') ) const
- {
-   std::basic_string<CharT,Traits,Allocator> ret_val;
-   ret_val.reserve( N );
-   for( size_t ct= N; ct > 0; )
-   {
-     --ct;
-     ret_val += this->operator[]( ct ) ? one : zero;
-   }
-   return ret_val;
- } // to_string
-
- template<class CharT = char,
-          class Traits = std::char_traits<CharT>,
-          class Allocator = std::allocator<CharT>,
-          typename std::enable_if<base_t_n_bits % 4 == 0>::type* = nullptr >
- std::basic_string<CharT,Traits,Allocator>
- to_hex_string( hex_params<CharT,Traits,Allocator> const &params=
-                hex_params<CharT,Traits,Allocator>{} ) const
- {
-   using arr_acc=  detail::array_access<N,T>;
-   arr_acc         a_a;
-   constexpr auto  div_four= arr_acc::div_four;
-   constexpr auto  mod_four= arr_acc::mod_four;
-   constexpr auto  n_char= div_four + ( mod_four > 0 );
-
-   auto const      zeroCh= params.zeroCh;
-   auto const      aCh=    params.aCh;
-
-   std::basic_string<CharT,Traits,Allocator> ret_val;
-   ret_val.reserve( n_char + params.prefix.size() );
-   ret_val= params.prefix;
-   size_t ct= n_char;
-   if( !params.leadingZeroes )
-   {
-     for( ; ct > 0; --ct )
-     {
-       auto  const val= a_a.get_four_bits( this->data(), 4 * ct - 1 );
-       if( val != 0 ) break;
-     }
-   }
-   if( ct == 0 && params.nonEmpty ) ret_val += zeroCh;
-   for( ; ct > 0; --ct )
-   {
-     auto  const val= a_a.get_four_bits( this->data(), 4 * ct - 1 );
-     CharT const c=
-     ( val < 10 ) ? ( zeroCh + val ) : ( aCh + ( val - 10 ) );
-     ret_val += c;
-   }
-   return ret_val;
- } // to_hex_string
-
-}; // class bitset2
-
-
-template<size_t N, class T>
-constexpr
-bitset2<N,T>
-rotate_left( bitset2<N,T> const & bs, size_t n_rot ) noexcept
-{
-  return
-    bitset2<N,T>( detail::array_ops<N,T>( n_rot ).rotate_left( bs.data() ) );
-}
-
-
-template<size_t N, class T>
-constexpr
-bitset2<N,T>
-rotate_right( bitset2<N,T> const & bs, size_t n_rot ) noexcept
-{
-  return
-    bitset2<N,T>( detail::array_ops<N,T>( N - ( n_rot % N ) ).
-                                               rotate_left( bs.data() ) );
-}
-
-
-/// Computes the set difference, i.e. bs1 & ~bs2
-template<size_t N, class T>
-constexpr
-bitset2<N,T>
-difference( bitset2<N,T> const & bs1, bitset2<N,T> const & bs2 ) noexcept
-{
-  return
-    bitset2<N,T>( detail::array_funcs<bitset2<N,T>::n_array,T>()
-                            .bitwise_setdiff( bs1.data(), bs2.data() ) );
-}
-
-
-/// Returns bs with bits reversed
-template<size_t N, class T>
-constexpr
-bitset2<N,T>
-reverse( bitset2<N,T> const & bs ) noexcept
-{ return bitset2<N,T>( detail::array_ops<N,T>( 0 ).reverse( bs.data() ) ); }
-
-
-/// Computes the two's complement
-template<size_t N, class T>
-constexpr
-bitset2<N,T>
-complement2( bitset2<N,T> const & bs ) noexcept
-{ return bitset2<N,T>( detail::array_complement2<N,T>().comp2(bs.data()) ); }
-
-
-/// Converts an M-bit bitset2 to an N-bit bitset2.
-template<size_t N,class T1,size_t M, class T2>
-constexpr
-bitset2<N,T1>
-convert_to( bitset2<M,T2> const & bs ) noexcept
-{
-  using a2a=
-    detail::array2array<bitset2<N,T1>::n_array,bitset2<M,T2>::n_array,T1,T2>;
-  return
-    bitset2<N,T1>(a2a()(detail::bit_chars<N,T1>::hgh_bit_pattern, bs.data()));
-}
-
-
-/// Converts an M-bit bitset2 to an N-bit bitset2.
-template<size_t N,size_t M, class T>
-constexpr
-bitset2<N,T>
-convert_to( bitset2<M,T> const & bs ) noexcept
-{ return bitset2<N,T>( bs.data() ); }
-
-
-/// \brief Returns true if f returns true for each pair
-/// of base_t=T values in bs1 and bs2. f should be a binary function
-/// taking two base_t values and returning bool.
-/// zip_fold_and does short circuit if possible.
-template<size_t N, class F, class T>
-constexpr
-bool
-zip_fold_and( bitset2<N,T> const & bs1, bitset2<N,T> const & bs2,
-              F f ) noexcept(noexcept( f( T(0), T(0) ) ))
-{
-  return
-    detail::array_funcs<bitset2<N,T>::n_array,T>().zip_fold_and(bs1.data(),
-                                                                bs2.data(), f);
-}
-
-
-/// \brief Returns true if f returns true for at least one pair
-/// of base_t=T values in bs1 and bs2. f should be a binary function
-/// taking two base_t values and returning bool.
-/// zip_fold_or does short circuit if possible.
-template<size_t N, class F,class T>
-constexpr
-bool
-zip_fold_or( bitset2<N,T> const & bs1, bitset2<N,T> const & bs2,
-             F f ) noexcept(noexcept( f( T(0), T(0) ) ))
-{
-  return
-    detail::array_funcs<bitset2<N,T>::n_array,T>().zip_fold_or( bs1.data(),
-                                                                bs2.data(), f );
-}
-
-
-} // namespace Bitset2
-
-
-
-
-/// Stream output
-template <class CharT, class Traits, size_t N,class T>
-std::basic_ostream<CharT, Traits>&
-operator<<( std::basic_ostream<CharT, Traits> & os,
-            Bitset2::bitset2<N,T> const & x )
-{
-  for( size_t ct= N; ct > 0; )
-  {
-     --ct;
-     os << ( x[ct] ? "1" : "0" );
-  }
-  return os;
-}
-
-/// Stream input
-template <class CharT, class Traits, size_t N,class T>
-std::basic_istream<CharT, Traits>&
-operator>>( std::basic_istream<CharT, Traits> & is,
-            Bitset2::bitset2<N,T> & x )
-{
-  std::bitset<N>  bs;
-  is >> bs;
-  x= Bitset2::bitset2<N,T>( bs );
-  return is;
-}
-
-
-
-/// Shift left
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator<<( Bitset2::bitset2<N,T> const & bs, size_t n_shift ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>( Bitset2::detail::array_ops<N,T>( n_shift )
-                                                 .shift_left( bs.data() ) );
-}
-
-
-/// Shift right
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator>>( Bitset2::bitset2<N,T> const & bs, size_t n_shift ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>( Bitset2::detail::array_ops<N,T>( n_shift )
-                                                 .shift_right( bs.data() ) );
-}
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator|( Bitset2::bitset2<N,T> const & bs1,
-           Bitset2::bitset2<N,T> const & bs2 ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>(
-      Bitset2::detail::array_funcs<Bitset2::bitset2<N,T>::n_array,T>()
-                                    .bitwise_or( bs1.data(), bs2.data() ) );
-}
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator&( Bitset2::bitset2<N,T> const & bs1,
-           Bitset2::bitset2<N,T> const & bs2 ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>(
-      Bitset2::detail::array_funcs<Bitset2::bitset2<N,T>::n_array,T>()
-                                  .bitwise_and( bs1.data(), bs2.data() ) );
-}
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator^( Bitset2::bitset2<N,T> const & bs1,
-           Bitset2::bitset2<N,T> const & bs2 ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>(
-      Bitset2::detail::array_funcs<Bitset2::bitset2<N,T>::n_array,T>()
-                                 .bitwise_xor( bs1.data(), bs2.data() ) );
-}
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-operator+( Bitset2::bitset2<N,T> const & bs1,
-           Bitset2::bitset2<N,T> const & bs2 ) noexcept
-{
-  return
-    Bitset2::bitset2<N,T>(
-      Bitset2::detail::array_add<N,T>().add( bs1.data(), bs2.data() ) );
-}
-
-
-namespace std
-{
-  template<size_t N,class T>
-  struct hash<Bitset2::bitset2<N,T> >
-  {
-  private:
-    enum : size_t
-    { n_array= Bitset2::detail::bitset2_impl<N,T>::n_array };
-
-    Bitset2::detail::hash_impl<n_array,T>   m_func;
-
-  public:
-    using argument_type= Bitset2::bitset2<N,T>;
-    using result_type=
-          typename Bitset2::detail::hash_impl<n_array,T>::result_type;
-
-    result_type operator()( argument_type const& bs ) const
-    { return m_func( bs.data() ); }
-  }; // struct hash
-
-} // namespace std
-
-
-#endif // BITSET2_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array2array.hpp b/ThirdParty/bitset2/detail/array2array.hpp
deleted file mode 100644
index 618af64ee..000000000
--- a/ThirdParty/bitset2/detail/array2array.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY2ARRAY_CB_HPP
-#define BITSET2_ARRAY2ARRAY_CB_HPP
-
-
-#include "h_types.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-
-/// \brief Convert std::array<Tsrc,src_n> to std::array<Ttrgt,trgt_n>
-template<size_t trgt_n, size_t src_n, class Ttrgt, class Tsrc>
-struct array2array
-{
-  using h_t_trgt=           h_types<Ttrgt>;
-  using h_t_src=            h_types<Tsrc>;
-  using trgt_array_t=       typename h_t_trgt::template array_t<trgt_n>;
-  using src_array_t=        typename h_t_src:: template array_t<src_n>;
-
-  enum : size_t
-  { trgt_base_n_bits=   h_t_trgt::base_t_n_bits
-  , src_base_n_bits=    h_t_src:: base_t_n_bits
-  };
-
-  enum : bool
-  { small_to_large= ( src_base_n_bits < trgt_base_n_bits ) };
-
-  enum : size_t
-  { ts_div= small_to_large ? trgt_base_n_bits / src_base_n_bits
-                           : src_base_n_bits  / trgt_base_n_bits };
-
-  enum : Tsrc
-  { h_all_set= Tsrc( Ttrgt(~Ttrgt(0)) ) };
-
-  /// Applies pttrn to most significant entry in result
-  constexpr
-  trgt_array_t
-  operator()( Ttrgt pttrn, src_array_t const &src ) const noexcept
-  {
-    static_assert( ( small_to_large && trgt_base_n_bits % src_base_n_bits == 0)
-                || (!small_to_large && src_base_n_bits % trgt_base_n_bits == 0),
-                   "Conversion between arrays of these types not supported" );
-    return small_to_large
-      ? conv_small_to_large( pttrn, src, std::make_index_sequence<trgt_n-1>() )
-      : conv_large_to_small( pttrn, src, std::make_index_sequence<trgt_n-1>() );
-  }
-
-
-  template<size_t ... S1>
-  constexpr
-  trgt_array_t
-  conv_small_to_large( Ttrgt                      pttrn,
-                       src_array_t const          &src,
-                       std::index_sequence<S1...> ) const noexcept
-  {
-    return {{ get_from_smaller( S1, src, S1 * ts_div )...,
-              Ttrgt(   get_from_smaller( trgt_n-1, src, (trgt_n-1) * ts_div )
-                     & pttrn ) }};
-  }
-
-  template<size_t ... S1>
-  constexpr
-  trgt_array_t
-  conv_large_to_small( Ttrgt                      pttrn,
-                       src_array_t const          &src,
-                       std::index_sequence<S1...> ) const noexcept
-  {
-    return
-      {{ get_from_larger( S1 / ts_div, S1 % ts_div, src )...,
-         Ttrgt( get_from_larger((trgt_n-1) / ts_div, (trgt_n-1) % ts_div, src)
-                & pttrn ) }};
-  }
-
-  constexpr
-  Ttrgt
-  get_from_smaller( size_t             trgt_idx,
-                    src_array_t const  &src,
-                    size_t             src_idx,
-                    size_t             src_ct= 0,
-                    Ttrgt              so_far= Ttrgt(0) ) const noexcept
-  {
-    return ( src_ct >= ts_div || src_idx >= src_n )
-      ? so_far
-      : get_from_smaller( trgt_idx, src, src_idx + 1, src_ct + 1,
-                          so_far | Ttrgt(    Ttrgt(src[src_idx])
-                                          << (src_base_n_bits * src_ct) ) );
-  }
-
-  constexpr
-  Ttrgt
-  get_from_larger( size_t             div_val,
-                   size_t             mod_val,
-                   src_array_t const  &src )  const noexcept
-  {
-    return ( div_val >= src_n ) ? Ttrgt(0)
-      : Ttrgt(Tsrc( src[div_val] >> (mod_val*trgt_base_n_bits) ) & h_all_set );
-  }
-}; // struct array2array
-
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-#endif // BITSET2_ARRAY2ARRAY_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array2u_long_t.hpp b/ThirdParty/bitset2/detail/array2u_long_t.hpp
deleted file mode 100644
index ec2ddc4ca..000000000
--- a/ThirdParty/bitset2/detail/array2u_long_t.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#ifndef BITSET2_ARRAY2U_LONG_T_CB_HPP
-#define BITSET2_ARRAY2U_LONG_T_CB_HPP
-
-#include "bit_chars.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  /// \brief Takes a std::array 'arr' and returns a variable 'x' of type Tlong.
-  /// Bits in 'x' are set if corresponding bits in 'arr' are set.
-  template<size_t N, class T, class Tlong>
-  struct array2u_long_t
-  {
-    using  base_t=    T;
-    using  b_c=       bit_chars<N,T>;
-
-    enum : size_t
-    { n_bits= N
-    , base_t_n_bits=  b_c::base_t_n_bits
-    , long_t_n_bits=  sizeof( Tlong ) * CHAR_BIT
-    , n_array=        b_c::n_array
-    , div_val=        long_t_n_bits / base_t_n_bits
-    , mod_val=        long_t_n_bits % base_t_n_bits
-    , use_vals=       ce_min( div_val + (mod_val!=0), n_array )
-    , bit_diff=       mod_val == 0 ? 0 : ( base_t_n_bits - mod_val )
-    };
-
-    enum : base_t
-    { allset=  base_t( ~base_t(0) )
-    , h_pttrn= use_vals < n_array ? allset : ce_right_shift( allset, bit_diff )
-    , i_pttrn= base_t( ~h_pttrn )
-    };
-
-    using array_t= typename h_types<T>::template array_t<n_array>;
-
-    constexpr
-    Tlong
-    operator()( array_t const & arr ) const noexcept
-    {
-      return
-        base_t_n_bits >= long_t_n_bits ? Tlong( arr[0] )
-                                       : combine( Tlong(0), arr, 0 );
-    }
-
-    /// \brief Returns true if arr cannot be converted to Tlong.
-    constexpr
-    bool
-    check_overflow( array_t const & arr ) const noexcept
-    { return N <= long_t_n_bits ? false : check_impl( arr, use_vals - 1 ); }
-
-
-
-    constexpr
-    Tlong
-    combine( Tlong v, array_t const & arr, size_t idx ) const noexcept
-    {
-      return ( idx >= use_vals ) ? v
-               : idx + 1 == use_vals
-                 ? Tlong( v + take_v( arr, idx, h_pttrn ) )
-                 : combine( Tlong( v + take_v( arr, idx ) ), arr, idx + 1 );
-    }
-
-    constexpr
-    Tlong
-    take_v( array_t const & arr, size_t idx, base_t pttrn= allset ) const noexcept
-    { return ce_left_shift( Tlong( arr[idx] & pttrn ), idx * base_t_n_bits ); }
-
-    constexpr
-    bool
-    check_impl( array_t const & arr, size_t idx ) const noexcept
-    {
-      return idx >= n_array ? false
-             : ( ( take_check( arr, idx ) != base_t(0) )
-                 || check_impl( arr, idx + 1 ) );
-    }
-
-    constexpr
-    base_t
-    take_check( array_t const & arr, size_t idx ) const noexcept
-    { return arr[idx] & ( idx + 1 == use_vals ? i_pttrn : allset ); }
-
-  }; // struct array2u_long_t
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-
-
-
-#endif // BITSET2_ARRAY2U_LONG_T_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array_access.hpp b/ThirdParty/bitset2/detail/array_access.hpp
deleted file mode 100644
index a4e42b492..000000000
--- a/ThirdParty/bitset2/detail/array_access.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY_ACCESS_CB_HPP
-#define BITSET2_ARRAY_ACCESS_CB_HPP
-
-#include "bit_chars.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  /// \brief array_access is used for getting bunches of 4 bits, which is
-  /// needed when creating hex-strings
-  template<size_t N,class T>
-  struct array_access
-  {
-    using base_t=                      T;
-    using b_chars=                     bit_chars<N,T>;
-    enum : size_t {   base_t_n_bits=   b_chars::base_t_n_bits
-                    , n_array=         b_chars::n_array
-                  };
-    enum : size_t {   div_four=        N / 4
-                    , mod_four=        N % 4
-                  };
-    using array_t=       typename h_types<T>::template array_t<n_array>;
-
-    constexpr
-    base_t
-    get_four_bits( array_t const &arr, size_t offset ) const noexcept
-    {
-      return
-        get_four_bits_impl( arr,
-                            offset / base_t_n_bits, offset % base_t_n_bits );
-    }
-
-    constexpr
-    base_t
-    get_four_bits_impl( array_t const &arr,
-                        size_t idx, size_t bit_idx ) const noexcept
-    {
-      return ( bit_idx >= 3 )
-             ? h1_get_four_bits( arr[idx], bit_idx )
-             : h2_get_four_bits( arr, idx, bit_idx );
-    }
-
-    constexpr
-    base_t
-    h1_get_four_bits( base_t v, size_t bit_idx ) const noexcept
-    { return ( v >> ( bit_idx - 3 ) ) & base_t(0xF); }
-
-    constexpr
-    base_t
-    h2_get_four_bits( array_t const &arr,
-                      size_t idx, size_t bit_idx ) const noexcept
-    {
-      return
-        (( arr[idx] & ( ( base_t(1) << (bit_idx+1) ) - 1 ) ) << ( 3 - bit_idx ))
-        + ( ( idx == 0 ) ? base_t(0)
-                         : ( arr[idx-1] >> (base_t_n_bits - (3 - bit_idx)) ) );
-    }
-  }; // struct array_access
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_ARRAY_ACCESS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array_add.hpp b/ThirdParty/bitset2/detail/array_add.hpp
deleted file mode 100644
index 55dc6f7a1..000000000
--- a/ThirdParty/bitset2/detail/array_add.hpp
+++ /dev/null
@@ -1,153 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY_ADD_CB_HPP
-#define BITSET2_ARRAY_ADD_CB_HPP
-
-
-#include "bit_chars.hpp"
-#include "array_funcs.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  template<size_t N,size_t it_n,class T>
-  struct array_add_base
-  {
-    using base_t=                      T;
-    using b_chars=                     bit_chars<N,T>;
-    enum : size_t {   n_array=         b_chars::n_array };
-    enum : base_t
-    {   hgh_bit_pattern= b_chars::hgh_bit_pattern
-    ,   all_one=         b_chars::all_one
-    };
-    using array_t=            typename h_types<T>::template array_t<n_array>;
-    using zero_array_t=       typename h_types<T>::template array_t<0>;
-
-    /// Used to submit the curent result of the addition and the carry over
-    template<size_t n>
-    using array_pair_t= std::pair<base_t,
-                                  typename h_types<T>::template array_t<n> >;
-
-
-    constexpr
-    array_pair_t<it_n+1>
-    add_h1( base_t a, base_t b, base_t sm1, base_t sum,
-            typename
-            h_types<T>::template array_t<it_n> const &so_far ) const noexcept
-    {
-      return
-        std::make_pair( ( sum < a || sm1 < b ) ? base_t(1) : base_t(0)
-                      , array_funcs<it_n,T>()
-                             .append( so_far
-                                    , ( it_n + 1 < n_array )
-                                            ? sum
-                                            : base_t(sum & hgh_bit_pattern) ) );
-    }
-
-    constexpr
-    array_pair_t<it_n+1>
-    add_h2( base_t a, base_t b, array_pair_t<it_n> const &a_p ) const noexcept
-    { return add_h1( a, b, b + a_p.first, a + b + a_p.first, a_p.second ); }
-  }; //struct array_add_base
-
-
-  /// \brief This struct is introduced for beeing able to partially
-  /// specialize function add_h3.
-  template<size_t N,size_t it_n,class T>
-  struct array_add_h : public array_add_base<N,it_n,T>
-  {
-    using array_t= typename array_add_base<N,it_n,T>::array_t;
-
-    template<size_t n>
-    using array_pair_t=
-          typename array_add_base<N,it_n,T>::template array_pair_t<n>;
-
-    constexpr
-    array_pair_t<it_n+1>
-    add_h3( array_t const &arr1, array_t const &arr2 ) const noexcept
-    {
-      return
-        this->add_h2( arr1[it_n], arr2[it_n]
-                    , array_add_h<N,it_n-1,T>().add_h3( arr1, arr2 ) );
-    }
-  }; // struct array_add_h
-
-
-  template<size_t N,class T>
-  struct array_add_h<N,0,T> : public array_add_base<N,0,T>
-  {
-    using array_t=      typename array_add_base<N,0,T>::array_t;
-    using zero_array_t= typename array_add_base<N,0,T>::zero_array_t;
-
-    template<size_t n>
-    using array_pair_t=typename array_add_base<N,0,T>::template array_pair_t<n>;
-
-    constexpr
-    array_pair_t<1>
-    add_h3( array_t const &arr1, array_t const &arr2 ) const noexcept
-    {
-      return
-          this->add_h2( arr1[0], arr2[0]
-                      , std::make_pair( T(0), zero_array_t{} ) );
-    }
-  }; // struct array_add_h
-
-
-  /// Allows to add two std::array's in a constexpr
-  template<size_t N,class T>
-  struct array_add
-  {
-    using base_t=                      T;
-    using b_chars=                     bit_chars<N,T>;
-    enum : base_t
-    {   hgh_bit_pattern= b_chars::hgh_bit_pattern
-    ,   all_one=         b_chars::all_one
-    };
-    enum : size_t {   n_array=         b_chars::n_array   };
-    using array_t=            typename h_types<T>::template array_t<n_array>;
-
-    constexpr
-    array_t
-    add( array_t const &arr1, array_t const &arr2 ) const noexcept
-    {
-      return
-        ( N == 0 ) ? array_t{}
-                   : array_add_h<N,n_array-1,T>().add_h3( arr1, arr2 ).second;
-    }
-
-    constexpr
-    void
-    add_assgn( array_t &arr1, array_t const &arr2 ) const noexcept
-    {
-      base_t  carry= base_t(0);
-      for( size_t  c= 0; c < n_array; ++c )
-      {
-        auto const sm1= base_t( arr2[c] + carry );
-        auto const sm=  base_t( arr1[c] + sm1 );
-        carry=  sm < arr1[c] || sm1 < arr2[c];
-        arr1[c]= sm;
-      }
-      arr1[n_array-1] &= hgh_bit_pattern;
-    } // add_assgn
-  }; // struct array_add
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_ARRAY_ADD_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array_complement2.hpp b/ThirdParty/bitset2/detail/array_complement2.hpp
deleted file mode 100644
index eaab57be6..000000000
--- a/ThirdParty/bitset2/detail/array_complement2.hpp
+++ /dev/null
@@ -1,149 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY_COMPLEMENT2_CB_HPP
-#define BITSET2_ARRAY_COMPLEMENT2_CB_HPP
-
-
-#include "bit_chars.hpp"
-#include "array_funcs.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  template<size_t N,size_t it_n,class T>
-  struct array_complement2_base
-  {
-    using base_t=                      T;
-    using b_chars=                     bit_chars<N,T>;
-    enum : base_t {   hgh_bit_pattern= b_chars::hgh_bit_pattern };
-    enum : size_t {   n_array=         b_chars::n_array   };
-    using array_t=            typename h_types<T>::template array_t<n_array>;
-
-    template<size_t n>
-    using arr_t= typename h_types<T>::template array_t<n>;
-
-    constexpr
-    arr_t<it_n+1>
-    comp2_h1( arr_t<it_n> const &so_far, base_t sum ) const noexcept
-    {
-      return
-        array_funcs<it_n,T>().append( so_far
-                                    , ( it_n + 1 < n_array )
-                                      ? sum
-                                      : base_t(sum & hgh_bit_pattern) );
-    }
-
-    constexpr
-    arr_t<it_n+1>
-    comp2_h2( array_t     const &arr,
-              arr_t<it_n> const &so_far,
-              base_t            carry ) const noexcept
-    { return comp2_h1( so_far, base_t( base_t(~arr[it_n]) + carry ) ); }
-
-    constexpr
-    arr_t<it_n+1>
-    comp2_h3( array_t     const &arr,
-              arr_t<it_n> const &so_far ) const noexcept
-    {
-      return comp2_h2( arr, so_far,
-                       it_n == 0
-                       ? base_t(1)
-                       : base_t(so_far[it_n-1] == 0 && arr[it_n-1] == 0) );
-    }
-
-  }; // struct array_complement2_base
-
-
-  template<size_t N,size_t it_n,class T>
-  struct array_complement2_h : array_complement2_base<N,it_n,T>
-  {
-    using array_t= typename array_complement2_base<N,it_n,T>::array_t;
-
-    template<size_t n>
-    using arr_t= typename array_complement2_base<N,it_n,T>::template arr_t<n>;
-
-    constexpr
-    arr_t<it_n+1>
-    comp2_h4( array_t const &arr ) const noexcept
-    {
-      return
-        this->comp2_h3( arr,
-                        array_complement2_h<N,it_n-1,T>().comp2_h4( arr ) );
-    }
-
-  }; // struct array_complement2_h
-
-
-  template<size_t N,class T>
-  struct array_complement2_h<N,0,T> : array_complement2_base<N,0,T>
-  {
-    using array_t= typename array_complement2_base<N,0,T>::array_t;
-
-    template<size_t n>
-    using arr_t= typename array_complement2_base<N,0,T>::template arr_t<n>;
-
-    constexpr
-    arr_t<1>
-    comp2_h4( array_t const &arr ) const noexcept
-    { return this->comp2_h3( arr, arr_t<0>{} ); }
-
-  }; // struct array_complement2_h<N,0,T>
-
-
-
-  /// Computes the two's complement of the number encoded in the array
-  template<size_t N,class T>
-  struct array_complement2
-  {
-    using base_t=                      T;
-    using b_chars=                     bit_chars<N,T>;
-    enum : base_t {   hgh_bit_pattern= b_chars::hgh_bit_pattern };
-    enum : size_t {   n_array=         b_chars::n_array   };
-    using array_t=            typename h_types<T>::template array_t<n_array>;
-
-
-    constexpr
-    array_t
-    comp2( array_t const &arr ) const noexcept
-    {
-      return
-        ( N == 0 ) ? array_t{}
-                   : array_complement2_h<N,n_array-1,T>().comp2_h4( arr );
-    }
-
-    constexpr
-    void
-    comp2_assgn( array_t &arr ) const noexcept
-    {
-      base_t  carry= base_t(1);
-      for( size_t  c= 0; c < n_array; ++c )
-      {
-        auto const sm= base_t( base_t(~arr[c]) + carry );
-        carry=  base_t( (carry == base_t(1)) && ( sm == 0 ) );
-        arr[c]= sm;
-      } // for c
-      arr[n_array-1] &= hgh_bit_pattern;
-    } // comp2_assgn
-
-  }; // struct array_complement2
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-#endif // BITSET2_ARRAY_COMPLEMENT2_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array_funcs.hpp b/ThirdParty/bitset2/detail/array_funcs.hpp
deleted file mode 100644
index f75afb02d..000000000
--- a/ThirdParty/bitset2/detail/array_funcs.hpp
+++ /dev/null
@@ -1,346 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY_FUNCS_CB_HPP
-#define BITSET2_ARRAY_FUNCS_CB_HPP
-
-
-#include "h_types.hpp"
-#include "count_bits.hpp"
-#include "index_lsb_set.hpp"
-#include <utility>
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  template<size_t n_array,class T>
-  struct array_funcs
-  {
-      using base_t=                 T;
-      using array_t=       typename h_types<T>::template array_t<n_array>;
-      using array_p1_t=    typename h_types<T>::template array_t<n_array+1>;
-
-      enum : size_t { base_t_n_bits=  h_types<T>::base_t_n_bits
-                    , npos=           h_types<T>::npos };
-
-      /// Binary operator type
-      enum class op_type { or_op, and_op, xor_op, sdiff_op };
-
-      constexpr
-      array_t
-      bitwise_or( array_t const &arr1, array_t const &arr2 ) const noexcept
-      {
-          return bitwise_op_impl( op_type::or_op, arr1, arr2,
-                                  std::make_index_sequence<n_array>() );
-      }
-
-      /// Used for |= operator. Separate implementation for better performance.
-      constexpr
-      void
-      bitwise_or_assgn( array_t &arr1, array_t const &arr2 ) const noexcept
-      { return bitwise_op_assgn_impl( op_type::or_op, arr1, arr2 ); }
-
-      constexpr
-      array_t
-      bitwise_and( array_t const &arr1, array_t const &arr2 ) const noexcept
-      {
-        return bitwise_op_impl( op_type::and_op, arr1, arr2,
-                                std::make_index_sequence<n_array>() );
-      }
-
-      /// Used for &= operator. Separate implementation for better performance.
-      constexpr
-      void
-      bitwise_and_assgn( array_t &arr1, array_t const &arr2 ) const noexcept
-      { return bitwise_op_assgn_impl( op_type::and_op, arr1, arr2 ); }
-
-      constexpr
-      array_t
-      bitwise_xor( array_t const &arr1, array_t const &arr2 ) const noexcept
-      {
-        return bitwise_op_impl( op_type::xor_op, arr1, arr2,
-                                std::make_index_sequence<n_array>() );
-      }
-
-      /// Used for ^= operator. Separate implementation for better performance.
-      constexpr
-      void
-      bitwise_xor_assgn( array_t &arr1, array_t const &arr2 ) const noexcept
-      { return bitwise_op_assgn_impl( op_type::xor_op, arr1, arr2 ); }
-
-      /// Computes the set difference, i.e. arr1 & ~arr2
-      constexpr
-      array_t
-      bitwise_setdiff( array_t const &arr1, array_t const &arr2 ) const noexcept
-      {
-        return bitwise_op_impl( op_type::sdiff_op, arr1, arr2,
-                                std::make_index_sequence<n_array>() );
-      }
-
-      /// \brief Computes the set difference, i.e. arr1 & ~arr2.
-      /// Separate implementation for better performance.
-      constexpr
-      void
-      bitwise_setdiff_assgn( array_t &arr1, array_t const &arr2 ) const noexcept
-      { return bitwise_op_assgn_impl( op_type::sdiff_op, arr1, arr2 ); }
-
-
-      constexpr
-      bool
-      none( array_t const &arr ) const noexcept
-      { return none_impl( n_array - 1, arr ); }
-
-
-      constexpr
-      size_t
-      count( array_t const &arr ) const noexcept
-      {
-        return
-          sum_impl( count_impl( arr, std::make_index_sequence<n_array>() ) );
-      }
-
-
-      constexpr
-      bool
-      equal( array_t const &arr1, array_t const &arr2 ) const noexcept
-      { return equal_impl( arr1, arr2, 0 ); }
-
-
-      constexpr
-      bool
-      less_than( array_t const &arr1, array_t const &arr2 ) const noexcept
-      { return less_than_impl( arr1, arr2, n_array - 1 ); }
-
-
-      /// \brief Returns true if f returns true for each pair
-      /// of elements in arr1 and arr2
-      template<class F>
-      constexpr
-      bool
-      zip_fold_and( array_t const &arr1, array_t const &arr2,
-                    F &f ) const noexcept(noexcept( f( base_t(0), base_t(0) ) ))
-      { return zip_fold_and_impl( arr1, arr2, f, 0 ); }
-
-
-      /// \brief Returns true if f returns true for at least one pair
-      /// of elements in arr1 and arr2
-      template<class F>
-      constexpr
-      bool
-      zip_fold_or( array_t const &arr1, array_t const &arr2,
-                   F &f ) const noexcept(noexcept( f( base_t(0), base_t(0) ) ))
-      { return zip_fold_or_impl( arr1, arr2, f, 0 ); }
-
-
-      /// Prepend v1 in front of arr
-      constexpr
-      array_p1_t
-      prepend( base_t const v1, array_t const &arr ) const noexcept
-      { return prepend_impl( v1, arr, std::make_index_sequence<n_array>()); }
-
-
-      /// Append v1 to arr
-      constexpr
-      array_p1_t
-      append( array_t const &arr, base_t const v1 ) const noexcept
-      { return append_impl( arr, v1, std::make_index_sequence<n_array>()); }
-
-
-      /// Copy each element in arr but apply pttrn to most significant entry
-      template<size_t n>
-      constexpr
-      array_t
-      copy_and_map( base_t const                          pttrn,
-                    typename
-                    h_types<T>::template array_t<n> const &arr ) const noexcept
-      {
-        return
-          n_array == 0 ? array_t{}
-             : copy_and_map_impl(
-                 pttrn,
-                 arr,
-                 gen_empty_array<n_array,T>(),
-                 n >= n_array,
-                 std::make_index_sequence<ce_min( n_array-1, n )>(),
-                 std::make_index_sequence<n_array-1-ce_min(n_array-1, n)>() );
-      } // copy_and_map
-
-
-      //** _impl functions
-
-      template<size_t n,size_t ... S1,size_t ... S2>
-      constexpr
-      array_t
-      copy_and_map_impl( base_t const                          pttrn,
-                         typename
-                         h_types<T>::template array_t<n> const &arr,
-                         array_t const                         &zeroes,
-                         bool const                            take_all,
-                         std::index_sequence<S1...>,
-                         std::index_sequence<S2...> ) const noexcept
-      {
-        return {{ arr[S1]..., zeroes[S2]...,
-                  base_t(( take_all ? arr[n_array-1] : base_t(0) ) & pttrn) }};
-      }
-
-
-
-      constexpr
-      bool
-      none_impl( size_t idx, array_t const &arr ) const noexcept
-      {
-        return    ( arr[idx] == base_t(0) )
-               && ( ( idx == 0 ) ? true : none_impl( idx - 1, arr )  );
-      }
-
-
-      template<size_t ... S>
-      constexpr
-      array_p1_t
-      append_impl( array_t const &arr, base_t const v1,
-                   std::index_sequence<S...> ) const noexcept
-      { return {{ arr[S]..., v1 }}; }
-
-
-      template<size_t ... S>
-      constexpr
-      array_p1_t
-      prepend_impl( base_t const v1, array_t const &arr,
-                    std::index_sequence<S...> ) const noexcept
-      { return {{ v1, arr[S]... }}; }
-
-
-      constexpr
-      bool
-      equal_impl( array_t const &arr1, array_t const &arr2,
-                  size_t ct ) const noexcept
-      {
-        return   ( ct == n_array ) ? true
-               : ( arr1[ct] == arr2[ct] ) && equal_impl( arr1, arr2, ct + 1 );
-      }
-
-
-      constexpr
-      bool
-      less_than_impl( array_t const &arr1, array_t const &arr2,
-                      size_t ct ) const noexcept
-      {
-        return
-          ( arr1[ct] < arr2[ct] )
-          || ( arr1[ct] == arr2[ct]
-               && ( ct == 0 ? false : less_than_impl( arr1, arr2, ct-1 ) ) );
-      }
-
-
-      template<class F>
-      constexpr
-      bool
-      zip_fold_and_impl( array_t const &arr1, array_t const &arr2,
-                         F      &f,
-                         size_t ct )
-                            const noexcept(noexcept( f(base_t(0), base_t(0))))
-      {
-        return   ( ct == n_array ) ? true
-               : (    f( arr1[ct], arr2[ct] )
-                   && zip_fold_and_impl( arr1, arr2, f, ct + 1 ) );
-      }
-
-
-      template<class F>
-      constexpr
-      bool
-      zip_fold_or_impl( array_t const &arr1, array_t const &arr2,
-                        F      &f,
-                        size_t ct )
-                            const noexcept(noexcept( f(base_t(0), base_t(0))))
-      {
-        return   ( ct == n_array ) ? false
-               : (    f( arr1[ct], arr2[ct] )
-                   || zip_fold_or_impl( arr1, arr2, f, ct + 1 ) );
-      }
-
-
-      constexpr
-      void
-      bitwise_op_assgn_impl( op_type opt,
-                             array_t &arr1, array_t const &arr2 ) const noexcept
-      {
-        for( size_t c= 0; c < n_array; ++c )
-        {
-          if(      opt == op_type::or_op  ) arr1[c] |=  arr2[c];
-          else if( opt == op_type::and_op ) arr1[c] &=  arr2[c];
-          else if( opt == op_type::xor_op ) arr1[c] ^=  arr2[c];
-          else                              arr1[c] &= ~arr2[c];
-        }
-      } // bitwise_op_assgn_impl
-
-
-      template<size_t ... S>
-      constexpr
-      array_t
-      bitwise_op_impl( op_type opt,
-                       array_t const &arr1, array_t const &arr2,
-                       std::index_sequence<S...> ) const noexcept
-      { return {{ h_bitwise_op( S, opt, arr1, arr2 )... }};  }
-
-      constexpr
-      base_t
-      h_bitwise_op( size_t idx, op_type opt,
-                     array_t const &arr1, array_t const &arr2 ) const noexcept
-      {
-        return   (   opt == op_type::or_op )  ? ( arr1[idx] | arr2[idx] )
-               : ( ( opt == op_type::and_op ) ? ( arr1[idx] & arr2[idx] )
-                   : ( opt == op_type::xor_op ) ? ( arr1[idx] ^ arr2[idx] )
-                                                : ( arr1[idx] & ~arr2[idx] ) );
-      }
-
-      /// Count bits in each element of arr
-      template<size_t ... S>
-      constexpr
-      std::array<size_t, n_array>
-      count_impl( array_t const &arr, std::index_sequence<S...> ) const noexcept
-      { return {{ count_bits( arr[S] )... }};  }
-
-
-      /// Sum over all elements in vals
-      template<class T1>
-      constexpr
-      T1
-      sum_impl( std::array<T1, n_array> const &vals,
-                size_t ct= n_array - 1 ) const noexcept
-      { return vals[ct] + ( ( ct == 0 ) ? T1(0) : sum_impl( vals, ct - 1 ) ); }
-
-
-      constexpr
-      size_t
-      idx_lsb_set( array_t const &arr, base_t v, size_t idx ) const noexcept
-      {
-        return
-          v == base_t(0)
-            ? ( idx + 1 == n_array ? npos
-                                   : idx_lsb_set( arr, arr[idx+1], idx + 1 ) )
-            : idx * base_t_n_bits + index_lsb_set<base_t>()( v );
-      }
-
-  }; // struct array_funcs
-
-} // namespace detail
-
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_ARRAY_FUNCS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/array_ops.hpp b/ThirdParty/bitset2/detail/array_ops.hpp
deleted file mode 100644
index eecbc6d03..000000000
--- a/ThirdParty/bitset2/detail/array_ops.hpp
+++ /dev/null
@@ -1,336 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_ARRAY_OPS_CB_HPP
-#define BITSET2_ARRAY_OPS_CB_HPP
-
-#include "bit_chars.hpp"
-#include "reverse_bits.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  template<size_t N,class T>
-  struct array_ops
-  {
-    using base_t=                      T;
-    using this_t=                      array_ops<N,T>;
-    using b_chars=                     bit_chars<N,T>;
-    enum : size_t {   base_t_n_bits=   b_chars::base_t_n_bits
-                    , n_words=         b_chars::n_words
-                    , n_array=         b_chars::n_array
-                    , mod_val=         b_chars::mod_val
-                    , n_m_mod=         mod_val == 0 ? 0 : base_t_n_bits-mod_val
-                  };
-    enum : base_t
-    {   hgh_bit_pattern= b_chars::hgh_bit_pattern
-    ,   all_one=         b_chars::all_one };
-    using array_t=            typename h_types<T>::template array_t<n_array>;
-    using zero_array_t=       typename h_types<T>::template array_t<0>;
-
-    constexpr
-    array_ops( size_t n_shift ) noexcept
-    : m_n_shift_mod( n_shift % N )
-    , m_shft_div( n_shift / base_t_n_bits )
-    , m_shft_mod( n_shift % base_t_n_bits )
-    , m_shft_leftright_shift( base_t_n_bits-(n_shift % base_t_n_bits) )
-    , m_shft_left_pattern( ce_left_shift( T(~T(0)),
-                                          base_t_n_bits
-                                             - (n_shift % base_t_n_bits) ))
-    , m_shft_right_pattern( ce_right_shift( T(~T(0)),
-                                            base_t_n_bits
-                                             - (n_shift % base_t_n_bits) ))
-    {}
-
-    constexpr
-    array_t
-    shift_left( array_t const &arr ) const noexcept
-    { return shift_left_impl( arr, std::make_index_sequence<n_array>() ); }
-
-    constexpr
-    array_t
-    shift_right( array_t const &arr ) const noexcept
-    { return shift_right_impl( arr, std::make_index_sequence<n_array>() ); }
-
-    /// Used for <<= operator. Separate implementation for better performance.
-    constexpr
-    void
-    shift_left_assgn( array_t &arr ) const noexcept
-    {
-      for( size_t c= n_words; c > 0; )
-      {
-        --c;
-        if( c >= m_shft_div )
-        {
-          auto const c2= c - m_shft_div;
-          base_t const v1= arr[c2] << m_shft_mod;
-          base_t const v2=
-            c2 == 0 ? base_t(0)
-                    : ce_right_shift( base_t(arr[c2-1] & m_shft_left_pattern),
-                                      m_shft_leftright_shift );
-          arr[c]= base_t( v1 | v2 );
-        }
-        else arr[c]= base_t(0);
-      } // for c
-      arr[n_array-1] &= hgh_bit_pattern;
-    } // shift_left_assgn
-
-    /// Used for >>= operator. Separate implementation for better performance.
-    constexpr
-    void
-    shift_right_assgn( array_t &arr ) const noexcept
-    {
-      for( size_t c= 0; c < n_words; ++c )
-      {
-        auto const c2= c + m_shft_div;
-        if( c2 < n_words )
-        {
-          base_t const v1= arr[c2] >> m_shft_mod;
-          base_t const v2=
-            ( c2 + 1 >= n_words ) ? base_t(0)
-                  : ce_left_shift( base_t( arr[c2+1] & m_shft_right_pattern ),
-                                           m_shft_leftright_shift );
-          arr[c]= v1 | v2;
-        }
-        else arr[c]= base_t(0);
-      } // for c
-      arr[n_array-1] &= hgh_bit_pattern;
-    } // shift_right_assgn
-
-
-    constexpr
-    array_t
-    rotate_left( array_t const &arr ) const noexcept
-    {
-      return
-        ( n_array == 1 )
-          ? array_t{{ base_t((   base_t( arr[0] << m_n_shift_mod )
-                               | ( ce_right_shift( arr[0], N - m_n_shift_mod ) )
-                             ) & hgh_bit_pattern ) }}
-          : rotate_left_impl( arr,
-                              array_ops<N,T>(     m_n_shift_mod ),
-                              array_ops<N,T>( N - m_n_shift_mod ),
-                              std::make_index_sequence<n_array>() );
-    } // rotate_left
-
-    constexpr
-    array_t
-    flip( array_t const &arr ) const noexcept
-    { return flip_impl( arr, std::make_index_sequence<n_array>() ); }
-
-    constexpr
-    bool
-    all( array_t const &arr ) const noexcept
-    { return ( N > 0 ) && all_impl( n_words - 1, arr ); }
-
-
-    /// Used for ++ operator.
-    constexpr
-    void
-    increment( array_t &arr ) const noexcept
-    {
-      if( N == 0 ) return;
-
-      size_t  c= 0;
-      for( ; c + 1 < n_words; ++c )
-      {
-        if( ( ++arr[c] ) != base_t(0) ) return;
-      }
-      ++arr[c];
-      arr[c] &= hgh_bit_pattern;
-    } // increment
-
-
-    /// Used for -- operator.
-    constexpr
-    void
-    decrement( array_t &arr ) const noexcept
-    {
-      if( N == 0 ) return;
-
-      size_t  c= 0;
-      for( ; c + 1 < n_words; ++c )
-      {
-        if( ( arr[c]-- ) != base_t(0) ) return;
-      }
-      --arr[c];
-      arr[c] &= hgh_bit_pattern;
-    } // decrement
-
-    /// Reverse bits
-    constexpr
-    array_t
-    reverse( array_t const &arr ) const noexcept
-    {
-      return   n_array == 1
-             ? array_t{{ base_t( reverse_bits<base_t>()(arr[0]) >> n_m_mod ) }}
-             : reverse_impl( arr, std::make_index_sequence<n_array>() );
-    } // reverse
-
-
-    //****************************************************
-
-
-    constexpr
-    bool
-    all_impl( size_t idx, array_t const &arr ) const noexcept
-    {
-      return    h_all( idx, arr )
-             && ( ( idx == 0 ) ? true : all_impl( idx - 1, arr ) );
-    }
-
-    constexpr
-    bool
-    h_all( size_t idx, array_t const &arr ) const noexcept
-    {
-      return ( idx + 1 ==  n_words ) ? ( arr[idx] == hgh_bit_pattern )
-                                     : ( arr[idx] == all_one );
-    }
-
-
-    template<size_t ... S>
-    constexpr
-    array_t
-    shift_left_impl( array_t const &arr,
-                     std::index_sequence<S...> ) const noexcept
-    { return {{ h_shift_left( S, arr )... }};  }
-
-    constexpr
-    base_t
-    h_shift_left( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   h_shift_left1( idx, arr )
-             & ( ( idx+1 == n_words ) ?  hgh_bit_pattern : all_one );
-    }
-
-    constexpr
-    base_t
-    h_shift_left1( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   ( idx >= n_words || idx < m_shft_div ) ? base_t(0)
-             : base_t( ( arr[idx-m_shft_div] << m_shft_mod )
-                       | h_shift_left_rem( idx - m_shft_div, arr ) );
-    }
-
-    constexpr
-    base_t
-    h_shift_left_rem( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   ( idx == 0 ) ? base_t(0)
-             : ce_right_shift( base_t( arr[idx-1] & m_shft_left_pattern ),
-                                m_shft_leftright_shift );
-    }
-
-
-    template<size_t ... S>
-    constexpr
-    array_t
-    shift_right_impl( array_t const &arr,
-                      std::index_sequence<S...> ) const noexcept
-    { return {{ h_shift_right( S, arr )... }};  }
-
-    constexpr
-    base_t
-    h_shift_right( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   ( idx + m_shft_div >= n_words ) ? base_t(0)
-             : base_t(   ( arr[idx+m_shft_div] >> m_shft_mod )
-                       | h_shift_right_rem( idx + m_shft_div, arr ) );
-    }
-
-    constexpr
-    base_t
-    h_shift_right_rem( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   ( idx + 1 >= n_words ) ? base_t(0)
-             : ce_left_shift( base_t( arr[idx+1] & m_shft_right_pattern ),
-                              m_shft_leftright_shift );
-    }
-
-
-    template<size_t ... S>
-    constexpr
-    array_t
-    rotate_left_impl( array_t const &arr,
-                      this_t  lft,
-                      this_t  rgt,
-                      std::index_sequence<S...> ) const noexcept
-    {
-      return
-        {{ ( S > lft.m_shft_div ? lft.h_shift_left( S, arr )
-             : S ==  lft.m_shft_div
-               ? base_t( lft.h_shift_left(  lft.m_shft_div, arr )
-                         | rgt.h_shift_right( lft.m_shft_div, arr ) )
-               : rgt.h_shift_right( S, arr ) )... }};
-    } // rotate_left_impl
-
-
-    template<size_t ... S>
-    constexpr
-    array_t
-    flip_impl( array_t const &arr, std::index_sequence<S...> ) const noexcept
-    { return {{ h_flip( S, arr )... }}; }
-
-    constexpr
-    base_t
-    h_flip( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   ( idx >= n_words ) ? base_t(0)
-             :   ( ~arr[idx] )
-               & ( (idx+1 == n_words) ? hgh_bit_pattern : all_one );
-    }
-
-
-    template<size_t ... S>
-    constexpr
-    array_t
-    reverse_impl( array_t const &arr, std::index_sequence<S...> ) const noexcept
-    { return {{ h_reverse( S, arr )... }}; }
-
-    constexpr
-    base_t
-    h_reverse( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   idx + 1 == n_words
-             ? base_t( reverse_bits<base_t>()( arr[0] ) >> n_m_mod )
-             : reverse_bits<base_t>()( h2_reverse( idx, arr ) );
-    }
-
-    constexpr
-    base_t
-    h2_reverse( size_t idx, array_t const &arr ) const noexcept
-    {
-      return   mod_val == 0 ? arr[n_words-idx-1]
-             : base_t(   ( arr[n_words-idx-1] << n_m_mod )
-                       | ( arr[n_words-idx-2] >> mod_val ) );
-    }
-
-
-    size_t const     m_n_shift_mod;
-    size_t const     m_shft_div;
-    size_t const     m_shft_mod;
-    size_t const     m_shft_leftright_shift;
-    base_t const     m_shft_left_pattern;
-    base_t const     m_shft_right_pattern;
-
-  }; // struct array_ops
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_ARRAY_OPS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/bit_chars.hpp b/ThirdParty/bitset2/detail/bit_chars.hpp
deleted file mode 100644
index 5823d384d..000000000
--- a/ThirdParty/bitset2/detail/bit_chars.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_BIT_CHARS_CB_HPP
-#define BITSET2_BIT_CHARS_CB_HPP
-
-#include "h_types.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  template<size_t N,class T>
-  struct bit_chars
-  {
-      using h_t=      h_types<T>;
-      using ULONG_t=  typename h_t::ULONG_t;
-      using ULLONG_t= typename h_t::ULLONG_t;
-      using base_t=   T;
-      //
-      enum : size_t
-      { n_bits=         N
-      , ulong_n_bits=   h_t::ulong_n_bits                ///< #bits in ULONG_t
-      , ullong_n_bits=  h_t::ullong_n_bits               ///< #bits in ULLONG_t
-      , base_t_n_bits=  h_t::base_t_n_bits               ///< #bits in T
-      , div_val=        n_bits / base_t_n_bits
-      , mod_val=        n_bits % base_t_n_bits
-      , n_words=        mod_val ? div_val + 1 : div_val  ///< #words required
-      , n_array=        ( n_words == 0 ) ? 1 : n_words   ///< #words used
-      };
-      enum : ULONG_t
-      { ulong_max=      ULONG_MAX };
-      enum : base_t
-      { all_one= base_t(~base_t(0))
-      , low_bit_pattern=                         ///< Mask for idx==0
-              n_bits == 0 ? base_t(0)
-              : ( div_val > 0 || mod_val == 0 )
-                ? all_one
-                : ce_right_shift( all_one, base_t_n_bits - mod_val )
-      , hgh_bit_pattern=                        ///< Mask for idx+1==n_words
-              n_bits == 0 ? base_t(0)
-              : mod_val == 0
-                ? all_one
-                : ce_right_shift( all_one, base_t_n_bits - mod_val )
-      };
-  }; // struct bit_chars
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_BIT_CHARS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/bitset2_impl.hpp b/ThirdParty/bitset2/detail/bitset2_impl.hpp
deleted file mode 100644
index 835d76b96..000000000
--- a/ThirdParty/bitset2/detail/bitset2_impl.hpp
+++ /dev/null
@@ -1,400 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_IMPL_CB_HPP
-#define BITSET2_IMPL_CB_HPP
-
-#include "bit_chars.hpp"
-#include "array_add.hpp"
-#include "ullong2array.hpp"
-#include "array2u_long_t.hpp"
-#include <bitset>
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-template<size_t N,class T>
-class bitset2_impl
-{
-  using b_chars=                     bit_chars<N,T>;
-  using h_t=                         h_types<T>;
-
-public:
-  enum : size_t { n_array= b_chars::n_array
-                , npos=    h_t::npos };
-  using base_t=      T;
-  using ULONG_t=     typename b_chars::ULONG_t;
-  using ULLONG_t=    typename b_chars::ULLONG_t;
-  using array_t=     typename h_types<T>::template array_t<n_array>;
-
-protected:
-  enum : size_t
-  { n_words=         b_chars::n_words
-  , ulong_n_bits=    b_chars::ulong_n_bits
-  , ullong_n_bits=   b_chars::ullong_n_bits
-  , base_t_n_bits=   b_chars::base_t_n_bits
-  };
-  enum : ULONG_t
-  { ulong_max=       b_chars::ulong_max };
-  enum : base_t
-  { low_bit_pattern= b_chars::low_bit_pattern
-  , hgh_bit_pattern= b_chars::hgh_bit_pattern
-  , all_one=         b_chars::all_one
-  };
-
-  template<size_t n_arr_src, class Tsrc>
-  using a2a= detail::array2array<n_array, n_arr_src,T,Tsrc>;
-
-
-  /* ----------------------------------------------------------------------- */
-  constexpr
-  bitset2_impl() noexcept
-  {}
-
-  constexpr
-  bitset2_impl( bitset2_impl const & ) noexcept= default;
-
-  constexpr
-  bitset2_impl( bitset2_impl && ) noexcept= default;
-
-  constexpr
-  bitset2_impl &
-  operator=( bitset2_impl const & ) noexcept= default;
-
-  constexpr
-  bitset2_impl &
-  operator=( bitset2_impl && ) noexcept= default;
-
-  explicit
-  constexpr
-  bitset2_impl( ULLONG_t v ) noexcept
-  : m_value( ullong2array<N,T>()( v ) )
-  {}
-
-  template<size_t n,class Tsrc>
-  explicit
-  constexpr
-  bitset2_impl( std::array<Tsrc,n> const & value ) noexcept
-  : m_value( a2a<n,Tsrc>()( hgh_bit_pattern, value ) )
-  {}
-
-  explicit
-  bitset2_impl( const std::bitset<N> &bs ) noexcept
-  {
-    if( N == 0 ) return;
-    if( ullong_n_bits <= base_t_n_bits && n_words == 1 )
-    {
-      m_value[0]= bs.to_ullong();
-      return;
-    }
-
-    size_t offset= 0;
-    for( size_t ct= 0; ct < n_words; ++ct )
-    {
-      base_t  val= base_t(0);
-      auto const bit_limit=
-                 ( ct < n_words - 1 ) ? base_t_n_bits : N - offset;
-      for( size_t bit_ct= 0; bit_ct < bit_limit; ++bit_ct )
-      {
-        auto const test_bit= offset + bit_limit - bit_ct - 1;
-        val <<= 1;
-        if( bs.test( test_bit ) ) val |= base_t(1);
-      } // for bit_ct
-      m_value[ct]= val;
-      offset += base_t_n_bits;
-    } // for ct
-  } // bitset2_impl( const std::bitset<N> &bs )
-
-
-  template< class CharT, class Traits, class Alloc >
-  explicit
-  bitset2_impl( std::basic_string<CharT,Traits,Alloc> const      &str,
-                typename
-                std::basic_string<CharT,Traits,Alloc>::size_type pos,
-                typename
-                std::basic_string<CharT,Traits,Alloc>::size_type n,
-                CharT                                            zero,
-                CharT                                            one )
-  {
-    auto const str_sz= str.size();
-    if( pos > str_sz )
-            throw std::out_of_range( "bitset2: String submitted to "
-                                     "constructor smaller than pos" );
-    auto const n_bits= std::min( N, std::min( n, str_sz - pos ) );
-
-    for( size_t bit_ct= 0; bit_ct < n_bits; ++bit_ct )
-    {
-      auto const chr= str[bit_ct+pos];
-      if(       Traits::eq( one,  chr ) ) set( n_bits - bit_ct - 1 );
-      else if( !Traits::eq( zero, chr ) )
-              throw std::invalid_argument( "bitset2: Invalid argument in "
-                                           "string submitted to constructor" );
-    } // for bit_ct
-  }
-  /* ----------------------------------------------------------------------- */
-
-
-  //**********************************************************
-
-
-  constexpr
-  array_t &
-  get_data() noexcept
-  { return m_value; }
-
-  constexpr
-  bool
-  operator[]( size_t bit ) const noexcept
-  { return test_noexcept( bit ); }
-
-  constexpr
-  bool
-  test_noexcept( size_t bit ) const noexcept
-  { return m_value[bit / base_t_n_bits] & ( T(1) << ( bit % base_t_n_bits ) ); }
-
-  constexpr
-  bitset2_impl &
-  set( size_t bit, bool value= true )
-  {
-    if( bit >= N  )
-            throw std::out_of_range( "bitset2: Setting of bit out of range" );
-    set_noexcept( bit, value );
-    return *this;
-  } // set
-
-  constexpr
-  bitset2_impl &
-  set() noexcept
-  {
-    if( N > 0 )
-    {
-      size_t c= 0;
-      for( ; c < n_words - 1; ++c ) m_value[c]= ~base_t(0);
-      m_value[c]= hgh_bit_pattern;
-    }
-    return *this;
-  } // set
-
-  constexpr
-  bitset2_impl &
-  reset() noexcept
-  {
-    for( size_t c= 0; c < n_array; ++c ) m_value[c]= base_t(0);
-    return *this;
-  }
-
-  constexpr
-  bool
-  test_set( size_t bit, bool value= true )
-  {
-    if( bit >= N  )
-        throw std::out_of_range( "bitset2: test_set out of range" );
-    return test_set_noexcept( bit, value );
-  } // test_set
-
-  constexpr
-  bitset2_impl &
-  flip_noexcept( size_t bit ) noexcept
-  {
-    m_value[bit / base_t_n_bits] ^= ( base_t(1) << ( bit % base_t_n_bits ) );
-    return *this;
-  }
-
-  constexpr
-  bitset2_impl &
-  flip( size_t bit )
-  {
-    if( bit >= N  )
-            throw std::out_of_range( "bitset2: Flipping of bit out of range" );
-    return flip_noexcept( bit );
-  } // flip
-
-  constexpr
-  bitset2_impl &
-  flip() noexcept
-  {
-    if( N > 0 )
-    {
-      size_t c= 0;
-      for( ; c < n_words - 1; ++c ) m_value[c] ^= ~base_t(0);
-      m_value[c] ^= hgh_bit_pattern;
-    }
-    return *this;
-  } // flip
-
-public:
-  constexpr
-  array_t const &
-  data() const noexcept
-  { return m_value; }
-
-  constexpr
-  ULONG_t
-  to_ulong() const
-  {
-    using a2l= array2u_long_t<N,T,ULONG_t>;
-    return  ( N == 0 ) ? 0ul
-            : a2l().check_overflow( m_value )
-              ? throw std::overflow_error( "Cannot convert bitset2 "
-                                           "to unsigned long" )
-              : a2l()( m_value );
-  } // to_ulong
-
-  constexpr
-  ULLONG_t
-  to_ullong() const
-  {
-    using a2l= array2u_long_t<N,T,ULLONG_t>;
-    return  ( N == 0 ) ? 0ull
-            : a2l().check_overflow( m_value )
-              ? throw std::overflow_error( "Cannot convert bitset2 "
-                                           "to unsigned long long" )
-              : a2l()( m_value );
-  } // to_ullong
-
-  constexpr
-  bool
-  test( size_t bit ) const
-  {
-    return  ( bit >= N )
-            ? throw std::out_of_range( "bitset2: Testing of bit out of range" )
-            : operator[]( bit );
-  }
-
-  constexpr
-  void
-  set_noexcept( size_t bit, bool value= true ) noexcept
-  {
-    if( value ) m_value[bit / base_t_n_bits]
-                   |=  base_t(   base_t(1) << ( bit % base_t_n_bits )  );
-    else        m_value[bit / base_t_n_bits]
-                   &=  base_t(~( base_t(1) << ( bit % base_t_n_bits ) ));
-  }
-
-  constexpr
-  bool
-  test_set_noexcept( size_t bit, bool value= true ) noexcept
-  {
-    auto const dv= bit / base_t_n_bits;
-    auto const md= bit % base_t_n_bits;
-    auto const pttrn= ( base_t(1) << md );
-    auto const ret_val= bool( m_value[dv] & pttrn );
-
-    if( value ) m_value[dv] |=  pttrn;
-    else        m_value[dv] &= ~pttrn;
-
-    return ret_val;
-  } // test_set_noexcept
-
-  constexpr
-  bool
-  none() const noexcept
-  { return detail::array_funcs<n_array,T>().none( m_value ); }
-
-  constexpr
-  bool
-  any() const noexcept
-  { return ( N > 0 ) && !none(); }
-
-  constexpr
-  bool
-  all() const noexcept
-  { return ( N > 0 ) && detail::array_ops<N,T>( 0 ).all( m_value ); }
-
-  constexpr
-  size_t
-  count() const noexcept
-  { return detail::array_funcs<n_array,T>().count( m_value ); }
-
-  /// \brief Returns index of first (least significant) bit set.
-  /// Returns npos if all bits are zero.
-  constexpr
-  size_t
-  find_first() const noexcept
-  {
-    return detail::array_funcs<n_array,T>().idx_lsb_set(m_value, m_value[0], 0);
-  }
-
-  /// \brief Returns index of next (> idx) bit set.
-  /// Returns npos if no more bits set.
-  /// Throws out_of_range if idx >= N.
-  constexpr
-  size_t
-  find_next( size_t idx ) const
-  {
-    return idx >= N
-      ? throw std::out_of_range( "bitset2: find_next index out of range" )
-      : idx + 1 == N
-        ? npos
-        : detail::array_funcs<n_array,T>()
-            .idx_lsb_set( m_value,
-                          base_t( m_value[(idx+1) / base_t_n_bits]
-                            & ce_left_shift(T(~T(0)),(idx+1) % base_t_n_bits) ),
-                          (idx+1) / base_t_n_bits );
-  }
-
-  constexpr
-  bool
-  operator==( bitset2_impl const &v2 ) const noexcept
-  { return detail::array_funcs<n_array,T>().equal( m_value, v2.m_value ); }
-
-  constexpr
-  bool
-  operator!=( bitset2_impl const &v2 ) const noexcept
-  { return !( *this == v2 ); }
-
-  constexpr
-  bool
-  operator<( bitset2_impl const &v2 ) const noexcept
-  { return detail::array_funcs<n_array,T>().less_than( m_value, v2.m_value ); }
-
-  constexpr
-  bool
-  operator<=( bitset2_impl const &v2 ) const noexcept
-  { return ! ( *this > v2 ); }
-
-  constexpr
-  bool
-  operator>( bitset2_impl const &v2 ) const noexcept
-  { return detail::array_funcs<n_array,T>().less_than(v2.m_value, m_value); }
-
-  constexpr
-  bool
-  operator>=( bitset2_impl const &v2 ) const noexcept
-  { return ! ( *this < v2 ); }
-
-  explicit
-  operator std::bitset<N>() const
-  {
-    using b_t= std::bitset<N>;
-    if( N == 0 ) return b_t{};
-    if( n_words == 1 ) return b_t( to_ullong() );
-
-    b_t  ret_val;
-    for( size_t ct= 0; ct < N; ++ct ) ret_val[ct]= operator[](ct);
-
-    return ret_val;
-  }
-private:
-  array_t   m_value= (detail::gen_empty_array<n_array,T>)();
-}; // class bitset2_impl
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-#endif // BITSET2_IMPL_CB_HPP
diff --git a/ThirdParty/bitset2/detail/count_bits.hpp b/ThirdParty/bitset2/detail/count_bits.hpp
deleted file mode 100644
index 221e7b05b..000000000
--- a/ThirdParty/bitset2/detail/count_bits.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_COUNT_BITS_CB_HPP
-#define BITSET2_COUNT_BITS_CB_HPP
-
-
-#include "h_types.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  /// Returns the number of bits set in val
-  template<class T>
-  constexpr
-  inline
-  size_t
-  count_bits( T val, size_t count= 0 ) noexcept
-  {
-    return
-      ( val == T(0) )
-               ? count
-               : count_bits( T(val & T( val - T(1) )), // clears lowest set bit
-                             count + 1 );
-  }
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_COUNT_BITS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/h_types.hpp b/ThirdParty/bitset2/detail/h_types.hpp
deleted file mode 100644
index 94b9d9eed..000000000
--- a/ThirdParty/bitset2/detail/h_types.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_H_TYPES_CB_HPP
-#define BITSET2_H_TYPES_CB_HPP
-
-#include <array>
-#include <utility>
-#include <climits>
-#include <type_traits>
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-    template<class T,class Enabled=void>      struct h_types;
-
-    template<class T>
-    struct h_types<T,
-                   typename std::enable_if<   std::is_integral<T>::value
-                                           && std::is_unsigned<T>::value>::type>
-    {
-      using ULONG_t=  unsigned long;
-      using ULLONG_t= unsigned long long;
-      using base_t=   T;
-
-      template<size_t n_array>
-      using array_t= std::array<base_t,n_array>;
-
-      enum : size_t
-      { ulong_n_bits=   sizeof(ULONG_t)  * CHAR_BIT  ///< #bits in ULONG_t
-      , ullong_n_bits=  sizeof(ULLONG_t) * CHAR_BIT  ///< #bits in ULLONG_t
-      , base_t_n_bits=  sizeof(base_t)   * CHAR_BIT  ///< #bits in base_t
-      , npos=          ~size_t(0)
-      };
-    }; // struct h_types
-
-
-    template<class T>
-    constexpr
-    T
-    ce_min( T v1, T v2 ) noexcept
-    { return ( v1 < v2 ) ? v1 : v2; }
-
-
-
-    /// http://stackoverflow.com/q/29136207/3876684
-    template<class T>
-    constexpr
-    T
-    ce_left_shift( T v1, size_t n_shift ) noexcept
-    {
-      return   ( n_shift == 0 ) ? v1
-             : ( ( n_shift >= h_types<T>::base_t_n_bits ) ? T(0)
-               : T( v1 << n_shift ) );
-    }
-
-    template<class T>
-    constexpr
-    T
-    ce_right_shift( T v1, size_t n_shift ) noexcept
-    {
-      return   ( n_shift == 0 ) ? v1
-             : ( ( n_shift >= h_types<T>::base_t_n_bits ) ? T(0)
-               : T( v1 >> n_shift ) );
-    }
-
-
-
-    template<size_t n_array,class T,size_t ... S>
-    inline constexpr
-    typename h_types<T>::template array_t<n_array>
-    gen_empty_array_impl( std::index_sequence<S...> ) noexcept
-    {
-      return
-        typename h_types<T>::template array_t<n_array>{{ ( T(S) & T(0) ) ... }};
-    }
-
-
-
-    template<size_t n_array,class T>
-    inline constexpr
-    typename h_types<T>::template array_t<n_array>
-    gen_empty_array() noexcept
-    {
-      return
-        gen_empty_array_impl<n_array,T>( std::make_index_sequence<n_array>() );
-    } // gen_empty_array
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_H_TYPES_CB_HPP
diff --git a/ThirdParty/bitset2/detail/hash.hpp b/ThirdParty/bitset2/detail/hash.hpp
deleted file mode 100644
index 6248737c8..000000000
--- a/ThirdParty/bitset2/detail/hash.hpp
+++ /dev/null
@@ -1,126 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_HASH_CB_HPP
-#define BITSET2_HASH_CB_HPP
-
-#include "h_types.hpp"
-
-#include <functional>
-#include <array>
-#include <climits>
-#include <algorithm>
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-
-template<size_t n_words,class T>
-struct hash_impl
-{
-  using    base_t=        T;
-  using    result_type=   std::size_t;
-  using    array_t=       typename h_types<T>::template array_t<n_words>;
-
-  enum : size_t
-  { size_t_bits=    sizeof(result_type) * CHAR_BIT   ///< #bits in result_type
-  , base_t_n_bits=  h_types<T>::base_t_n_bits        ///< #bits in T
-  , bits_mod=       base_t_n_bits % size_t_bits
-  , bits_div=       base_t_n_bits / size_t_bits + ( bits_mod > 0 )
-  , size_t_mod=     size_t_bits % base_t_n_bits
-  , size_t_div=     size_t_bits / base_t_n_bits
-  };
-
-  enum : bool
-  { easy_bits=  ( size_t_bits >= base_t_n_bits )
-  , easy_ratio= ( size_t_mod == 0 )
-  };
-
-  result_type
-  operator()( array_t const & arr ) const noexcept
-  {
-    if( n_words == 0 ) return 0;
-    if( n_words == 1 )
-    {
-      if( easy_bits ) return arr[0];
-      return to_result_t( arr[0] );
-    } // if n_words == 1
-
-    return cmpsd_hash( arr );
-  }
-
-  result_type
-  to_result_t( base_t a ) const noexcept
-  {
-    result_type ret_val= 0;
-    size_t      shft=    0;
-    for( size_t c= 0; c < bits_div; ++c, shft += size_t_bits )
-    {
-      auto const crrnt= result_type( a >> shft );
-      do_combine( ret_val, crrnt, c );
-    }
-    return ret_val;
-  } // to_result_t
-
-  result_type
-  cmpsd_hash( array_t const & arr ) const noexcept
-  {
-    result_type ret_val= 0;
-
-    if( easy_ratio )
-    {
-      for( size_t c= 0; c < n_words; c += size_t_div )
-      {
-        result_type  r= 0;
-        auto const uppr= std::min( n_words, c + size_t_div );
-        for( size_t w= c; w < uppr; ++w )
-             r |= ( result_type(arr[w]) << ((w-c)*base_t_n_bits) );
-        do_combine( ret_val, r, c / size_t_div );
-      }
-    }
-    else
-    {
-      for( size_t c= 0; c < n_words; ++c )
-      {
-        auto const crrnt= easy_bits
-                          ? result_type(arr[c]) : to_result_t(arr[c]);
-        do_combine( ret_val, crrnt, c );
-      }
-    }
-
-    return ret_val;
-  } // cmpsd_hash
-
-  void
-  do_combine( result_type &r, result_type crrnt, size_t cnt ) const noexcept
-  {
-    crrnt += cnt;
-    auto const n_rot= cnt % size_t_bits;
-    if( n_rot > 0 )
-              crrnt= ( crrnt << n_rot ) | ( crrnt >> (size_t_bits-n_rot) );
-
-    r ^= crrnt;
-  } // do_combine
-}; // struct hash_impl
-
-
-
-
-} } // namespace Bitset2::detail
-
-
-
-
-#endif // BITSET2_HASH_CB_HPP
diff --git a/ThirdParty/bitset2/detail/hex_params.hpp b/ThirdParty/bitset2/detail/hex_params.hpp
deleted file mode 100644
index 66e21f664..000000000
--- a/ThirdParty/bitset2/detail/hex_params.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_HEX_PARAMS_CB_HPP
-#define BITSET2_HEX_PARAMS_CB_HPP
-
-#include <string>
-
-
-namespace Bitset2
-{
-
-
-template< class CharT = char,
-          class Traits = std::char_traits<CharT>,
-          class Allocator = std::allocator<CharT> >
-struct hex_params
-{
-  using str_t= std::basic_string<CharT,Traits,Allocator>;
-
-  hex_params( CharT         zero_ch=        CharT('0'),
-              CharT         a_ch=           CharT('a'),
-              bool          leading_zeroes= true,
-              bool          non_empty=      true,
-              str_t const & prfx=           str_t{} )
-  : zeroCh{ zero_ch }
-  , aCh{ a_ch }
-  , leadingZeroes{ leading_zeroes }
-  , nonEmpty{ non_empty }
-  , prefix{ prfx }
-  {}
-
-  CharT        zeroCh=         CharT( '0' );
-  CharT        aCh=            CharT( 'a' );
-  bool         leadingZeroes=  true;
-  bool         nonEmpty=       true;
-  str_t        prefix;
-}; // struct hex_params
-
-
-
-} // namespace Bitset2
-
-
-#endif // BITSET2_HEX_PARAMS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/index_lsb_set.hpp b/ThirdParty/bitset2/detail/index_lsb_set.hpp
deleted file mode 100644
index 5c986ca64..000000000
--- a/ThirdParty/bitset2/detail/index_lsb_set.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#ifndef BITSET2_INDEX_LSB_SET_CB_HPP
-#define BITSET2_INDEX_LSB_SET_CB_HPP
-
-
-#include <limits>
-#include <climits>
-#include <cstddef>
-
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-
-/// https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightBinSearch
-template<class T>
-struct index_lsb_set
-{
-  enum : size_t { npos=   std::numeric_limits<size_t>::max()
-                , n_bits= sizeof(T) * CHAR_BIT };
-
-  constexpr
-  index_lsb_set() noexcept
-  {
-    static_assert( ( n_bits & ( n_bits - 1 ) ) == 0,
-                   "Number of bits in data type is not a power of 2" );
-  }
-
-  /// \brief Returns index of first (least significant) bit set in val.
-  /// Returns npos if all bits are zero.
-  constexpr
-  size_t
-  operator()( T val ) const noexcept
-  {
-    return   ( T(0) == val ) ? npos
-           : find_idx( val, T( T(~T(0)) >> (n_bits >> 1) ), n_bits >> 1, 1 );
-  }
-
-private:
-  constexpr
-  size_t
-  find_idx( T val, T pttrn, size_t sh_rght, size_t ct ) const noexcept
-  {
-    return   ( sh_rght == 1 ) ? ( ct - size_t( T(val & T(0x1)) ) )
-           : T( val & pttrn ) == T(0)
-             ? find_idx( T(val >> sh_rght), T( pttrn >> ( sh_rght >> 1 )),
-                         sh_rght >> 1, ct + sh_rght )
-             : find_idx( val, T(pttrn >> ( sh_rght >> 1 )), sh_rght >> 1, ct );
-  }
-}; // struct index_lsb_set
-
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-#endif // BITSET2_INDEX_LSB_SET_CB_HPP
diff --git a/ThirdParty/bitset2/detail/reverse_bits.hpp b/ThirdParty/bitset2/detail/reverse_bits.hpp
deleted file mode 100644
index f4e8db66d..000000000
--- a/ThirdParty/bitset2/detail/reverse_bits.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_REVERSE_BITS_CB_HPP
-#define BITSET2_REVERSE_BITS_CB_HPP
-
-#include <limits>
-#include <climits>
-#include <cstddef>
-
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-
-/// https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel
-template<class T>
-struct reverse_bits
-{
-  enum : size_t { n_bits=   sizeof(T) * CHAR_BIT
-                , n_bits_h= n_bits >> 1 };
-
-  constexpr
-  reverse_bits() noexcept
-  {
-    static_assert( ( n_bits & ( n_bits - 1 ) ) == 0,
-                   "Number of bits in data type is not a power of 2" );
-  }
-
-  /// \brief Reverses bits in val.
-  constexpr
-  T
-  operator()( T val ) const noexcept  { return rvrs( val ); }
-
-private:
-  constexpr
-  T
-  rvrs( T       val,
-        T       mask= T( ~T(0) ) >> n_bits_h,
-        size_t  s=    n_bits_h ) const noexcept
-  {
-    return   s == 0 ? val
-           : rvrs( ( (val >> s) & mask ) | ( (val << s) & ~mask ),
-                   mask ^ ( mask << ( s >> 1 ) ),
-                   s >> 1 );
-  }
-}; // struct reverse_bits
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-#endif // BITSET2_REVERSE_BITS_CB_HPP
diff --git a/ThirdParty/bitset2/detail/select_base_t.hpp b/ThirdParty/bitset2/detail/select_base_t.hpp
deleted file mode 100644
index abfe92744..000000000
--- a/ThirdParty/bitset2/detail/select_base_t.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#ifndef BITSET2_SELECT_BASE_T_CB_HPP
-#define BITSET2_SELECT_BASE_T_CB_HPP
-
-#include <cstdint>
-#include <cstddef>
-
-namespace Bitset2
-{
-namespace detail
-{
-
-
-template<bool b,class T1, class T2>
-struct if_else                 {  using type= T1; };
-
-template<class T1, class T2>
-struct if_else<false,T1,T2>    {  using type= T2; };
-
-template<bool b,class T1, class T2>
-using if_else_t= typename if_else<b,T1,T2>::type ;
-
-
-/// \brief Select any of uint8_t, uint16_t, uint32_t or
-/// unsigned long long. Result depends on N and on provision
-/// of these types by compiler.
-template<size_t N>
-struct select_base
-{
-#ifdef INT8_MIN
-  enum : bool { has_int8= true };
-  using  UI8= uint8_t;
-#else
-  enum : bool { has_int8= false };
-  using  UI8= void;
-#endif
-#ifdef INT16_MIN
-  enum : bool { has_int16= true };
-  using  UI16= uint16_t;
-#else
-  enum : bool { has_int16= false };
-  using  UI16= void;
-#endif
-#ifdef INT32_MIN
-  enum : bool { has_int32= true };
-  using  UI32= uint32_t;
-#else
-  enum : bool { has_int32= false };
-  using  UI32= void;
-#endif
-
-  using type=
-        if_else_t< has_int8  && (N<=8),  UI8,
-        if_else_t< has_int16 && (N<=16), UI16,
-        if_else_t< has_int32 && (N<=32), UI32,
-                   unsigned long long > > >;
-}; // struct select_base
-
-
-template<size_t N>
-using select_base_t= typename select_base<N>::type;
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-
-#endif // BITSET2_SELECT_BASE_T_CB_HPP
diff --git a/ThirdParty/bitset2/detail/ullong2array.hpp b/ThirdParty/bitset2/detail/ullong2array.hpp
deleted file mode 100644
index 41559858d..000000000
--- a/ThirdParty/bitset2/detail/ullong2array.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#ifndef BITSET2_ULLONG2ARRAY_CB_HPP
-#define BITSET2_ULLONG2ARRAY_CB_HPP
-
-#include "bit_chars.hpp"
-
-
-namespace Bitset2
-{
-namespace detail
-{
-
-  /// \brief Takes a variable 'v' of type unsigned long long
-  /// and returns a std::array 'a' equivalent to v. 'a' represents
-  /// an N bit bitset2 with base_t == T.
-  template<size_t N,class T>
-  struct ullong2array
-  {
-    using  base_t=    T;
-    using  b_c=       bit_chars<N,T>;
-    using  ULLONG_t=  typename b_c::ULLONG_t;
-
-    enum : size_t
-    { n_bits= N
-    , base_t_n_bits=  b_c::base_t_n_bits
-    , ullong_n_bits=  b_c::ullong_n_bits
-    , n_array=        b_c::n_array
-    , centrl_i=       ce_min( (ullong_n_bits-1) / base_t_n_bits, n_array - 1 )
-    , n_empty_vals=   n_array - centrl_i - 1
-    };
-
-    enum : base_t
-    { hgh_bit_pattern= b_c::hgh_bit_pattern
-    , use_pattern=     (n_empty_vals==0) ? hgh_bit_pattern : base_t(~base_t(0))
-    };
-
-    using array_t= typename h_types<T>::template array_t<n_array>;
-
-    constexpr
-    array_t
-    operator()( ULLONG_t v ) const noexcept
-    {
-      return fill( gen_empty_array<n_array,T>(), v,
-                   std::make_index_sequence<n_empty_vals>(),
-                   std::make_index_sequence<centrl_i>() );
-    }
-
-    template<size_t ... S1,size_t ... S2>
-    constexpr
-    array_t
-    fill( array_t const & empty, ULLONG_t v,
-          std::index_sequence<S1...>,
-          std::index_sequence<S2...> ) const noexcept
-    {
-      return {{ base_t(ce_right_shift(v,       S2 * base_t_n_bits))...,
-                base_t(ce_right_shift(v, centrl_i * base_t_n_bits)&use_pattern),
-                empty[S1]... }};
-    }
-  }; // struct ullong2array
-
-
-} // namespace detail
-} // namespace Bitset2
-
-
-
-
-#endif // BITSET2_ULLONG2ARRAY_CB_HPP
diff --git a/ThirdParty/bitset2/tests/bench01.cpp b/ThirdParty/bitset2/tests/bench01.cpp
deleted file mode 100644
index 5e5e00716..000000000
--- a/ThirdParty/bitset2/tests/bench01.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "../bitset2.hpp"
-#include "gen_randoms.hpp"
-#include <iostream>
-#include <cassert>
-#include <chrono>
-
-
-
-using ULLONG= unsigned long long;
-
-template<size_t N>
-using t1= Bitset2::bitset2<N>;
-
-template<size_t N>
-using vec_t= std::vector<t1<N> >;
-
-
-constexpr size_t n_loops= 1000000;
-
-template<size_t N>
-vec_t<N>
-gen_bs_vec( size_t n )
-{
-  std::vector<t1<N> >           ret_val;
-  gen_random_bitset2<N,ULLONG>  gen_rand;
-  ret_val.reserve( n );
-  for( size_t c= 0; c < n; ++c ) ret_val.push_back( gen_rand() );
-
-  return ret_val;
-} // gen_bs_vec
-
-
-template<size_t N>
-void
-apply_or_equal( vec_t<N> & v1, vec_t<N> const & v2 )
-{
-  auto it2= v2.begin();
-  for( auto & bs: v1 ) bs |= *(it2++);
-} // apply_or_equal
-
-
-template<size_t n>
-std::array<ULLONG,n> &
-rm_const( std::array<ULLONG,n> const & a )
-{ return const_cast<std::array<ULLONG,n> &>(a); }
-
-
-template<size_t N>
-void
-array_or_equal( vec_t<N> & v1, vec_t<N> const & v2 )
-{
-  auto const n_array= v1[0].data().size();
-  auto it2= v2.begin();
-  for( auto & bs: v1 )
-  {
-    auto & a1= rm_const( bs.data() );
-    auto & a2= it2->data();
-    for( size_t c= 0; c < n_array; ++c ) a1[c] |= a2[c];
-
-    ++it2;
-  }
-}
-
-
-int main()
-{
-  auto const vec1= gen_bs_vec<2048>( 128 );
-  auto const vec2= gen_bs_vec<2048>( 128 );
-
-  std::cout << "Running computations\n";
-
-  auto const t1 = std::chrono::high_resolution_clock::now();
-
-  auto v1= vec1;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    v1= vec1;
-    apply_or_equal( v1, vec2 );
-  }
-
-  auto const t2 = std::chrono::high_resolution_clock::now();
-
-  auto v1a= vec1;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    v1a= vec1;
-    array_or_equal( v1a, vec2 );
-  }
-
-  auto const t3 = std::chrono::high_resolution_clock::now();
-
-  assert( v1 == v1a );
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    v1a= vec1;
-    array_or_equal( v1a, vec2 );
-  }
-
-  auto const t4 = std::chrono::high_resolution_clock::now();
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    v1= vec1;
-    apply_or_equal( v1, vec2 );
-  }
-
-  auto const t5 = std::chrono::high_resolution_clock::now();
-  const std::chrono::duration<double> dt21 = t2 -t1;
-  const std::chrono::duration<double> dt32 = t3 -t2;
-  const std::chrono::duration<double> dt43 = t4 -t3;
-  const std::chrono::duration<double> dt54 = t5 -t4;
-
-  std::cout << "dt21= " << dt21.count() * 1.0e3 << "ms\n";
-  std::cout << "dt32= " << dt32.count() * 1.0e3 << "ms\n";
-  std::cout << "dt43= " << dt43.count() * 1.0e3 << "ms\n";
-  std::cout << "dt54= " << dt54.count() * 1.0e3 << "ms\n";
-} // main
diff --git a/ThirdParty/bitset2/tests/counter128.cpp b/ThirdParty/bitset2/tests/counter128.cpp
deleted file mode 100644
index 8adbb6983..000000000
--- a/ThirdParty/bitset2/tests/counter128.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-
-#include <iostream>
-#include "bitset2.hpp"
-
-
-int main()
-{
-  Bitset2::bitset2<128> c;
-  constexpr Bitset2::bitset2<128> tst{ 0xFFFFFFFFull };
-
-  for( ;; ++c )
-  {
-    if( ( c & tst) == tst )
-      std::cout << c.to_hex_string() << "\n";
-  }
-} // main
diff --git a/ThirdParty/bitset2/tests/example01.cpp b/ThirdParty/bitset2/tests/example01.cpp
deleted file mode 100644
index af1aa2b3e..000000000
--- a/ThirdParty/bitset2/tests/example01.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-#include <iostream>
-#include <array>
-#include <cassert>
-#include "bitset2.hpp"
-
-template<size_t n_bits>
-using BS2=      Bitset2::bitset2<n_bits>;
-
-int main()
-{
-  using bs_128= BS2<128>;
-  using base_t_128= bs_128::base_t;
-  constexpr std::array<base_t_128,2>
-            ar1{{ ~(base_t_128(0)), base_t_128(0xFEDCBA) }};
-  constexpr bs_128                  b1{ ar1 };
-  constexpr auto                    b1_add=  b1 + b1;
-  constexpr auto                    b1_shft= b1 << 1; // binary shift
-  static_assert( b1_add == b1_shft, "" );
-
-  std::cout << b1.to_hex_string()       // 0000000000fedcbaffffffffffffffff
-            << "\n"
-            << b1_add.to_hex_string()   // 0000000001fdb975fffffffffffffffe
-            << "\n";
-
-  BS2<12>   b2;
-  for( size_t c= 0; c < 12; c += 2 ) b2[c]= true;
-  auto      b3= ~b2;
-  std::cout << b2 << "\n";         // 010101010101
-  std::cout << b2.flip() << "\n";  // 101010101010
-  assert( b2 == b3 );
-
-  BS2<7> const   b4{ "1110000" };
-  auto const     b5= Bitset2::rotate_left( b4, 3 );
-  std::cout << b4 << "\n"     // 1110000
-            << b5 << "\n";    // 0000111
-
-  BS2<7>        b6{ "1010010" };
-  b6.reverse();
-  std::cout << b6 << "\n";    // 0100101
-} // main
diff --git a/ThirdParty/bitset2/tests/gen_randoms.hpp b/ThirdParty/bitset2/tests/gen_randoms.hpp
deleted file mode 100644
index 9a95e27d2..000000000
--- a/ThirdParty/bitset2/tests/gen_randoms.hpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#ifndef BITSET2_GEN_RANDOMS_CB_HPP
-#define BITSET2_GEN_RANDOMS_CB_HPP
-
-#include "../bitset2.hpp"
-#include <random>
-#include <climits>
-#include <array>
-#include <vector>
-
-
-
-template<class T>
-class gen_randoms
-{
-public:
-  gen_randoms( T max_val, T min_val= 0 )
-  : m_generator( std::random_device{}() )
-  , m_distri( min_val, max_val )
-  {}
-  //
-  T
-  operator()()
-  { return m_distri( m_generator ); }
-  //
-private:
-  std::mt19937                                        m_generator;
-  std::uniform_int_distribution<T>                    m_distri;
-}; // class gen_randoms
-
-
-
-
-/// Generate N-bit sized bitset2 randomly
-template<size_t N,class T>
-class gen_random_bitset2
-{
-  //
-  enum : size_t
-  {   base_t_n_bits=  sizeof(T) * CHAR_BIT
-    , div_val=        N / base_t_n_bits
-    , mod_val=        N % base_t_n_bits
-    , n_words=        mod_val ? div_val + 1 : div_val
-  };
-  enum : T
-  {   max_ullong= T(~T(0))
-    , hgh_bit_pattern=
-              N == 0 ? T(0)
-              : mod_val == 0
-                ? max_ullong
-                : max_ullong >> T(base_t_n_bits-mod_val)
-  };
-  //
-  using arr_t=  std::array<T,n_words>;
-  //
-public:
-  using b_t= Bitset2::bitset2<N,T>;
-  //
-  gen_random_bitset2()
-  : m_gen{ gen_generators() }
-  {}
-  //
-  b_t
-  operator()()
-  {
-    arr_t  a;
-    for( size_t c= 0; c < n_words; ++c ) a[c]= m_gen[c]();
-    return b_t( a );
-  }
-  //
-private:
-  using gen_rand_t= gen_randoms<T>;
-
-  std::vector<gen_rand_t>  m_gen;
-  //
-  std::vector<gen_rand_t>
-  gen_generators()
-  {
-    std::vector<gen_rand_t>  ret_val;
-
-    if( n_words > 0 )
-    {
-      ret_val.reserve( n_words );
-      for( size_t c= 0; c < n_words - 1; ++c )
-          ret_val.push_back( gen_rand_t{ max_ullong } );
-      ret_val.push_back( gen_rand_t{ hgh_bit_pattern } );
-    }
-
-    return ret_val;
-  }
-}; // gen_random_bitset2
-
-
-
-
-#endif // BITSET2_GEN_RANDOMS_CB_HPP
diff --git a/ThirdParty/bitset2/tests/gray_code.cpp b/ThirdParty/bitset2/tests/gray_code.cpp
deleted file mode 100644
index 72765bb92..000000000
--- a/ThirdParty/bitset2/tests/gray_code.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "../bitset2.hpp"
-#include <cassert>
-#include <iostream>
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-binary_to_gray( Bitset2::bitset2<N,T> const &bs )
-{ return bs ^ (bs >> 1); }
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-gray_to_binary( Bitset2::bitset2<N,T> bs )
-{
-  Bitset2::bitset2<N,T>   mask= bs >> 1;
-  for( ; !mask.none(); mask >>= 1 )  bs ^= mask;
-  return bs;
-} // gray_to_binary
-
-
-int main()
-{
-  using ULLONG= unsigned long long;
-  constexpr std::array<ULLONG,2>  arr_01a{{ 0xFEFDFCFBFAF9F8F7ull, 1ull }};
-  constexpr Bitset2::bitset2<129> bs_01a{ arr_01a };
-  constexpr auto                  gray_01a= binary_to_gray( bs_01a );
-  constexpr auto                  bin_01a=  gray_to_binary( gray_01a );
-
-  static_assert( bs_01a == bin_01a );
-
-  std::cout << bs_01a << '\n' << gray_01a << '\n';
-
-  return 0;
-} // main
diff --git a/ThirdParty/bitset2/tests/mk.sh b/ThirdParty/bitset2/tests/mk.sh
deleted file mode 100755
index 45d30d119..000000000
--- a/ThirdParty/bitset2/tests/mk.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-cc=g++-7
-#cc=clang++
-
-
-p=gray_code
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -I../detail -fdiagnostics-color=auto $p.cpp -o $p
-
-p=test_nonconst_constexpr01
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -I../detail -fdiagnostics-color=auto $p.cpp -o $p
-
-p=test_array2array
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -I../detail -fdiagnostics-color=auto $p.cpp -o $p
-
-p=tests01
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -fdiagnostics-color=auto $p.cpp -o $p
-
-p=test_bitset2_01
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -Wno-unused-but-set-variable -std=c++1z -I.. -fdiagnostics-color=auto $p.cpp -o $p
-
-p=test_bitset2_02
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -fdiagnostics-color=auto $p.cpp -o $p
-
-p=counter128
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -fdiagnostics-color=auto $p.cpp -o $p
-
-p=bench01
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -fdiagnostics-color=auto -D_GLIBCXX_USE_NANOSLEEP $p.cpp -o $p
-
-p=example01
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -fdiagnostics-color=auto $p.cpp -o $p
-
-p=test_ullong2array
-echo "Compiling $p"
-$cc -O2 -Wall -Wextra -std=c++1z -I.. -I../detail -fdiagnostics-color=auto $p.cpp -o $p
diff --git a/ThirdParty/bitset2/tests/test_array2array.cpp b/ThirdParty/bitset2/tests/test_array2array.cpp
deleted file mode 100644
index 70bb3e5ab..000000000
--- a/ThirdParty/bitset2/tests/test_array2array.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "array2array.hpp"
-#include "gen_randoms.hpp"
-#include <iostream>
-#include <cstdint>
-#include <cassert>
-
-
-
-constexpr size_t n_loops= 100000;
-
-
-
-template<class T1,class T2>
-void
-fwd_bckwd()
-{
-  constexpr size_t  bits_T1= sizeof(T1) * CHAR_BIT;
-  constexpr size_t  bits_T2= sizeof(T2) * CHAR_BIT;
-
-  constexpr size_t  t_n1= 8,  s_n1= 1;
-  constexpr size_t  t_n2= 24, s_n2= 3;
-
-  using a2a_t1a= Bitset2::detail::array2array<t_n1,s_n1,T2,T1>;
-  using a2a_t1b= Bitset2::detail::array2array<s_n1,t_n1,T1,T2>;
-  using a2a_t2a= Bitset2::detail::array2array<t_n1,s_n1,T1,T2>;
-  using a2a_t2b= Bitset2::detail::array2array<s_n1,t_n1,T2,T1>;
-
-  using a2a_t3a= Bitset2::detail::array2array<t_n2,s_n2,T2,T1>;
-  using a2a_t3b= Bitset2::detail::array2array<s_n2,t_n2,T1,T2>;
-  using a2a_t4a= Bitset2::detail::array2array<t_n2,s_n2,T1,T2>;
-  using a2a_t4b= Bitset2::detail::array2array<s_n2,t_n2,T2,T1>;
-
-  gen_random_bitset2<s_n1*bits_T1,T1>  gen_rand1a;
-  gen_random_bitset2<s_n1*bits_T2,T2>  gen_rand1b;
-
-  gen_random_bitset2<s_n2*bits_T1-bits_T1/2,T1>  gen_rand2a;
-  gen_random_bitset2<s_n2*bits_T2-bits_T2/2,T2>  gen_rand2b;
-
-  for( size_t ct= 0; ct < n_loops; ++ct )
-  {
-    // if( (ct+1) % 1000 == 0 ) std::cout << (ct+1) << '\n';
-
-    auto const bs1= gen_rand1a();
-    auto const a1a= a2a_t1a()( ~T2(0), bs1.data() );
-    auto const a1b= a2a_t1b()( ~T1(0), a1a );
-    assert( bs1.data() == a1b );
-
-    auto const bs2= gen_rand1b();
-    auto const a2a= a2a_t2a()( ~T1(0), bs2.data() );
-    auto const a2b= a2a_t2b()( ~T2(0), a2a );
-    assert( bs2.data() == a2b );
-
-    auto const bs3= gen_rand2a();
-    auto const a3a= a2a_t3a()( ~T2(0), bs3.data() );
-    auto const a3b= a2a_t3b()( T1(T1(~T1(0)) >> (bits_T1/2)), a3a );
-    assert( bs3.data() == a3b );
-
-    auto const bs4= gen_rand2b();
-    auto const a4a= a2a_t4a()( ~T1(0), bs4.data() );
-    auto const a4b= a2a_t4b()( T2(T2(~T2(0)) >> (bits_T2/2)), a4a );
-    assert( bs4.data() == a4b );
-  } // for ct
-} // fwd_bckwd
-
-
-int main()
-{
-
-  constexpr size_t  t_n1= 2, s_n1= 2;
-
-  std::cout << Bitset2::detail::array2array<t_n1,s_n1,uint16_t,uint8_t>::h_all_set
-            << "  "
-            // << Bitset2::detail::array2array<t_n1,s_n1,uint8_t,uint16_t>::h_all_set
-            // << "  "
-            << Bitset2::detail::array2array<t_n1,s_n1,uint8_t,uint32_t>::h_all_set
-            << "  "
-            << Bitset2::detail::array2array<t_n1,s_n1,uint16_t,uint32_t>::h_all_set
-            << "  "
-            << Bitset2::detail::array2array<t_n1,s_n1,uint16_t,uint64_t>::h_all_set
-            << "  "
-            << Bitset2::detail::array2array<t_n1,s_n1,uint32_t,uint64_t>::h_all_set
-            << '\n';
-
-  std::cout << " 8 <-> 64\n";
-  fwd_bckwd<uint8_t,uint64_t>();
-  std::cout << "16 <-> 64\n";
-  fwd_bckwd<uint16_t,uint64_t>();
-  std::cout << "32 <-> 64\n";
-  fwd_bckwd<uint32_t,uint64_t>();
-
-  std::cout << "\n 8 <-> 32\n";
-  fwd_bckwd<uint8_t,uint32_t>();
-  std::cout << "16 <-> 32\n";
-  fwd_bckwd<uint16_t,uint32_t>();
-
-  std::cout << "\n 8 <-> 16\n";
-  fwd_bckwd<uint8_t,uint16_t>();
-} // main
diff --git a/ThirdParty/bitset2/tests/test_bitset2_01.cpp b/ThirdParty/bitset2/tests/test_bitset2_01.cpp
deleted file mode 100644
index 2113e96f5..000000000
--- a/ThirdParty/bitset2/tests/test_bitset2_01.cpp
+++ /dev/null
@@ -1,420 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include <iostream>
-#include <sstream>
-#include <cassert>
-#include "bitset2.hpp"
-
-
-template<size_t N,class T>
-constexpr
-bool
-is_subset_of( Bitset2::bitset2<N,T> const &bs1,
-              Bitset2::bitset2<N,T> const &bs2 ) noexcept
-{
-  using base_t= T;
-  return Bitset2::zip_fold_and( bs1, bs2,
-                                []( base_t v1, base_t v2 ) noexcept
-                                  { return (v1 & ~v2) == 0; } );
-} // is_subset_of
-
-
-template<size_t N,class T>
-constexpr
-bool
-unequal( Bitset2::bitset2<N,T> const &bs1,
-         Bitset2::bitset2<N,T> const &bs2 ) noexcept
-{
-  using base_t= T;
-  return Bitset2::zip_fold_or( bs1, bs2,
-                               []( base_t v1, base_t v2 ) noexcept
-                                 { return v1 != v2; } );
-} // unequal
-
-
-
-int main()
-{
-  using namespace Bitset2;
-  using ULLONG= unsigned long long;
-
-  constexpr bitset2<32>   b1;
-  constexpr auto          v1= b1.to_ullong();
-  constexpr auto          b1_n= ~b1;
-  constexpr bool          b1_n_none= b1_n.none();
-  constexpr bool          b1_n_all= b1_n.all();
-  constexpr bool          b1_n_any= b1_n.any();
-
-  bitset2<63>             b_63;
-  bitset2<64>             b_64;
-  bitset2<65>             b_65;
-  auto                    b1a= b1;
-  b1a.set();
-  b_63.set();
-  b_64.set();
-  b_65.set();
-
-  std::bitset<65>         sb1;
-  auto                    sb2= std::bitset<32>( b1 );
-  sb1[64]= 1;
-
-  bitset2<65>             b2( sb1 );
-
-  std::cout << v1 << "\n"
-            << b2 << "\n"
-            << sb2 << "\n"
-            << b1_n << "\n"
-            << "b1.none()= " << b1.none() << "  "
-            << "b1.any()= " << b1.any() << "  "
-            << "b1.all()= " << b1.all() << "\n"
-            << "b1a.none()= " << b1a.none() << "  "
-            << "b1a.any()= " << b1a.any() << "  "
-            << "b1a.all()= " << b1a.all() << "\n"
-            << "b2.none()= " << b2.none() << "  "
-            << "b2.any()= " << b2.any() << "  "
-            << "b2.all()= " << b2.all() << "\n"
-            << "b1_n.none()= " << b1_n_none << "  "
-            << "b1_n.any()= " << b1_n_any << "  "
-            << "b1_n.all()= " << b1_n_all << "\n"
-            << "b_63.all()= " << b_63.all() << "  "
-            << "b_64.all()= " << b_64.all() << "  "
-            << "b_65.all()= " << b_65.all() << "\n";
-  std::cout << "b_63.flip()= " << b_63.flip() << "\n"
-            << "b_64.flip()= " << b_64.flip() << "\n"
-            << "b_65.flip()= " << b_65.flip() << "\n";
-  std::cout << "b_63.flip()= " << b_63.flip() << "\n"
-            << "b_64.flip()= " << b_64.flip() << "\n"
-            << "b_65.flip()= " << b_65.flip() << "\n";
-  std::cout << "b_63.reset()= " << b_63.reset() << "\n"
-            << "b_64.reset()= " << b_64.reset() << "\n"
-            << "b_65.reset()= " << b_65.reset() << "\n";
-
-  detail::bit_chars<4,ULLONG>   bc1;
-  detail::bit_chars<64,ULLONG>  bc2;
-  detail::bit_chars<65,ULLONG>  bc3;
-  detail::bit_chars<63,ULLONG>  bc4;
-
-  bitset2<64>  lbp1( bc1.low_bit_pattern );
-  bitset2<64>  lbp2( bc2.low_bit_pattern );
-  bitset2<64>  lbp3( bc3.low_bit_pattern );
-  bitset2<64>  lbp4( bc4.low_bit_pattern );
-
-  std::cout << bc1.low_bit_pattern << "  " << bc1.mod_val << "\n"
-            << "  " << lbp1 << "\n"
-            << bc2.low_bit_pattern << "  " << bc2.mod_val << "\n"
-            << "  " << lbp2 << "\n"
-            << bc3.low_bit_pattern << "  " << bc3.mod_val << "\n"
-            << "  " << lbp3 << "\n"
-            << bc4.low_bit_pattern << "  " << bc4.mod_val << "\n"
-            << "  " << lbp4 << "\n";
-
-  constexpr
-  std::array<unsigned long long,2>  ar1{{ ~(0ull), 1 }};
-
-  constexpr
-  auto s_ar1= detail::array_ops<128,ULLONG>( 63 ).shift_left( ar1 );
-
-  std::cout << "\n" << ar1[1] << "  " << ar1[0] << "\n";
-  std::cout << "\n" << s_ar1[1] << "  " << s_ar1[0] << "\n";
-
-  bitset2<63>  bc5{ 1ull };
-  bitset2<64>  bc6{ 1ull };
-  bitset2<65>  bc7{ 1ull };
-  constexpr bitset2<63>  bc5a{ 1ull };
-  constexpr bitset2<64>  bc6a{ 1ull };
-  constexpr bitset2<65>  bc7a{ 1ull };
-  constexpr bitset2<127>  bc8a{  1ull };
-  constexpr bitset2<128>  bc9a{  1ull };
-  constexpr bitset2<129>  bc10a{ 1ull };
-  constexpr auto bc5b= bc5a << 62;
-  constexpr auto bc6b= bc6a << 63;
-  constexpr auto bc7b= bc7a << 64;
-  constexpr auto bc8b= bc8a  << 62;
-  constexpr auto bc8c= bc8a  << 63;
-  constexpr auto bc8d= bc8a  << 64;
-  constexpr auto bc9b= bc9a  << 62;
-  constexpr auto bc9c= bc9a  << 63;
-  constexpr auto bc9d= bc9a  << 64;
-  constexpr auto bc10b= bc10a << 62;
-  constexpr auto bc10c= bc10a << 63;
-  constexpr auto bc10d= bc10a << 64;
-  std::cout << "  " << bc8b << "\n  " << bc8c << "\n  " << bc8d << "\n";
-  std::cout << " " << bc9b << "\n " << bc9c << "\n " << bc9d << "\n";
-  std::cout << bc10b << "\n" << bc10c << "\n" << bc10d << "\n";
-  std::cout << bc5b << " " << bc6b << " " << bc7b << "\n";
-  for( size_t c= 0; c < 66; ++c )
-  {
-    std::cout << bc5 << " " << bc6 << " " << bc7 << "\n";
-    bc5 <<= 1;    bc6 <<= 1;   bc7 <<= 1;
-  }
-
-  std::cout << "\n";
-  constexpr auto bc5c= bc5b >> 62;
-  constexpr auto bc6c= bc6b >> 63;
-  constexpr auto bc7c= bc7b >> 64;
-  std::cout << bc5c << " " << bc6c << " " << bc7c << "\n";
-
-  constexpr auto bc5d= bc5a | bc5b;
-  constexpr auto bc5e= bc5d & bc5a;
-  constexpr auto bc5f= bc5d & bc5b;
-  constexpr auto bc5g= bc5a ^ bc5b;
-  constexpr auto bc5h= bc5d ^ bc5a;
-  constexpr auto bc5i= bc5d ^ bc5b;
-  constexpr auto bc5j= bc5a << 1;
-  std::cout << "\n" << bc5a << " |\n" << bc5b << " =\n" << bc5d << "\n";
-  std::cout << "\n" << bc5d << " &\n" << bc5a << " =\n" << bc5e << "\n";
-  std::cout << "\n" << bc5d << " &\n" << bc5b << " =\n" << bc5f << "\n";
-  std::cout << "\n" << bc5a << " ^\n" << bc5b << " =\n" << bc5g << "\n";
-  std::cout << "\n" << bc5d << " ^\n" << bc5a << " =\n" << bc5h << "\n";
-  std::cout << "\n" << bc5d << " ^\n" << bc5b << " =\n" << bc5i << "\n";
-  std::cout << "\n" << bc5a << " << 1 = " << bc5j << "\n";
-
-  constexpr auto bc7d= bc7a | bc7b;
-  constexpr auto bc7e= bc7d & bc7a;
-  constexpr auto bc7f= bc7d & bc7b;
-  constexpr auto bc7g= bc7a ^ bc7b;
-  constexpr auto bc7h= bc7d ^ bc7a;
-  constexpr auto bc7i= bc7d ^ bc7b;
-  std::cout << "\n" << bc7a << " |\n" << bc7b << " =\n" << bc7d << "\n";
-  std::cout << "\n" << bc7d << " &\n" << bc7a << " =\n" << bc7e << "\n";
-  std::cout << "\n" << bc7d << " &\n" << bc7b << " =\n" << bc7f << "\n";
-  std::cout << "\n" << bc7a << " ^\n" << bc7b << " =\n" << bc7g << "\n";
-  std::cout << "\n" << bc7d << " ^\n" << bc7a << " =\n" << bc7h << "\n";
-  std::cout << "\n" << bc7d << " ^\n" << bc7b << " =\n" << bc7i << "\n";
-
-  constexpr auto bc5a_f= ~bc5a;
-  constexpr auto bc5d_f= ~bc5d;
-  constexpr auto bc7a_f= ~bc7a;
-  constexpr auto bc7d_f= ~bc7d;
-  std::cout << "\n~" << bc5a << " =\n " << bc5a_f << "\n";
-  std::cout << "\n~" << bc5d << " =\n " << bc5d_f << "\n";
-  std::cout << "\n~" << bc7a << " =\n " << bc7a_f << "\n";
-  std::cout << "\n~" << bc7d << " =\n " << bc7d_f << "\n";
-  std::cout << "\n";
-  bitset2<65>  bc11a{ 1ull };
-  bitset2<65>  bc11b{ 1ull };
-  bc11b <<= 64;
-  bc11b |= ( bc11a << 1 );
-  std::cout << bc11b << "\n";
-  bc11b >>= 1;
-  std::cout << bc11b << "\n";
-  std::cout << bc11b.to_string( '.', 'x' ) << "\n";
-
-  constexpr auto n_5a=   bc5a.count();
-  constexpr auto n_5a_f= bc5a_f.count();
-  constexpr auto n_7a=   bc7a.count();
-  constexpr auto n_7a_f= bc7a_f.count();
-  std::cout << "count( " << bc5a << " )= " << n_5a << "\n";
-  std::cout << "count( " << bc5a_f << " )= " << n_5a_f << "\n";
-  std::cout << "count( " << bc7a << " )= " << n_7a << "\n";
-  std::cout << "count( " << bc7a_f << " )= " << n_7a_f << "\n";
-  std::cout << "\n";
-  b_63.reset();
-  b_64.reset();
-  b_65.reset();
-  auto b_63a= b_63;
-  auto b_64a= b_64;
-  auto b_65a= b_65;
-  for( size_t c= 0; c < 64; c += 2 )
-  {
-    if( c < 63 ) b_63[c]= true;
-    if( c < 64 ) b_64[c]= true;
-    if( c < 65 ) b_65[c]= true;
-    b_63a[c/2]= true;  b_64a[c/2]= true;  b_65a[c/2]= true;
-  }
-  std::cout << "Hash values:\n";
-  std::cout << "  " << b_63 << " " << std::hash<bitset2<63>>()( b_63 ) << "\n"
-            << " "  << b_64 << " " << std::hash<bitset2<64>>()( b_64 ) << "\n"
-            << b_65 << " " << std::hash<bitset2<65>>()( b_65 ) << "\n";
-
-  bitset2<0>  b_0a, b_0b;
-  constexpr auto bl_c7d= bc7d == bc7d;
-  std::cout << "\n" << ( b_63 == b_63 ) << "  "
-            << ( b_64 == b_64 ) << "  "
-            << ( b_65 == b_65 ) << "\n"
-            << ( b_63 != b_63a ) << "  "
-            << ( b_64 != b_64a ) << "  "
-            << ( b_65 != b_65a ) << "  "
-            << bl_c7d  << "\n"
-            << ( b_0a == b_0b ) << "\n";
-
-  constexpr bitset2<65>  bs33a( 0xFFFFFFFFFFFFFFFFull );
-  // constexpr auto         bs33b= ( bs33a << 1 );
-  //constexpr
-  auto         bs33a_v= bs33a.to_ulong();
-  std::cout << bs33a << " == " << bs33a_v << " == " << bs33a.to_hex_string() << "\n";
-  // auto                   bs33b_v= bs33b.to_ulong(); // throws
-  // std::cout << bs33b << " == " << bs33b_v << "\n";
-
-  bitset2<63>  bc2_63{ 0x700000000000000Eull };
-  constexpr bitset2<63>  bc2_63a{ 0x700000000000000Eull };
-  constexpr auto         bc2_63b= rotate_right( bc2_63a, 5 );
-  bitset2<65>  bc2_65{ 0x700000000000000Eull };
-  constexpr bitset2<65>  bc2_65a{ 0x700000000000000Eull };
-  constexpr auto         bc2_65b= rotate_right( bc2_65a, 5 );
-  std::cout << "               bc2_63=   " << bc2_63
-            << " == " << bc2_63.to_hex_string()  << "\n";
-  bc2_63.rotate_left( 5 );
-  std::cout << "rot_left( bc2_63, 5) =   " << bc2_63 << "\n";
-  std::cout << "rot_right( bc2_63a,5)=   " << bc2_63b << "\n";
-
-  std::cout << "               bc2_65= " << bc2_65
-            << " == " << bc2_65.to_hex_string()  << "\n";
-  bc2_65.rotate_left( 5 );
-  std::cout << "rot_left( bc2_65, 5) = " << bc2_65 << "\n";
-  std::cout << "rot_right( bc2_65a,5)= " << bc2_65b << "\n";
-
-  constexpr auto add_b5a= bc5a + bc5j;
-  constexpr auto add_b5b= bc5a + bc5a;
-  std::cout << bc5a << " +\n" << bc5j << " =\n" << add_b5a << "\n";
-  std::cout << bc5a << " +\n" << bc5a << " =\n" << add_b5b << "\n";
-
-  constexpr std::array<ULLONG,2>  arr_add_01a{{ 0xFFFFFFFFFFFFFFFFull, 0ull }};
-  std::array<ULLONG,2>  arr_add_01ap{{ 0xFFFFFFFFFFFFFFFFull, 0ull }};
-  constexpr std::array<ULLONG,2>  arr_add_01b{{ 0xFFFFFFFFFFFFFFFFull, 1ull }};
-  constexpr bitset2<64>  b_a_01a( 0xFFFFFFFFFFFFFFFFull );
-  constexpr bitset2<128> b_a_02a( arr_add_01a );
-  bitset2<128> b_a_02ap( arr_add_01ap );
-  constexpr bitset2<128> b_a_02b( arr_add_01b );
-
-  std::cout << b_a_02ap.to_hex_string() << "\n";
-
-  constexpr auto add_b_a_01a= b_a_01a + b_a_01a;
-  constexpr auto add_b_a_02a= b_a_02a + b_a_02a;
-  constexpr auto add_b_a_02b= b_a_02a + b_a_02b;
-  constexpr auto add_b_a_02c= b_a_02b + b_a_02b;
-  std::cout << b_a_01a << " +\n" << b_a_01a << " =\n" << add_b_a_01a << "\n\n";
-  std::cout << b_a_02a << " +\n" << b_a_02a << " =\n" << add_b_a_02a << "\n\n";
-  std::cout << b_a_02a << " +\n" << b_a_02b << " =\n" << add_b_a_02b << "\n\n";
-  std::cout << b_a_02b << " +\n" << b_a_02b << " =\n" << add_b_a_02c << "\n\n";
-
-  bitset2<65>  bc2_65c{ 0xF00000000000000Eull };
-  std::cout << bc2_65c << " +\n" << bc2_65a << " =\n";
-  bc2_65c += bc2_65a;
-  std::cout << bc2_65c << "\n\n";
-
-  bitset2<65>  bc2_65d{ 0xFFFFFFFFFFFFFFFEull };
-  std::cout << "++" << bc2_65d << "=\n  ";
-  std::cout << (++bc2_65d) << "\n";
-
-  bitset2<65>  bc2_65e = bc2_65d << 1;
-
-  std::cout << "++" << bc2_65d << "=\n  ";
-  std::cout << (++bc2_65d) << "\n";
-
-  std::cout << "++" << bc2_65e << "=\n  ";
-  std::cout << (++bc2_65e) << "\n";
-  std::cout << "  " << bc2_65e << "++ =\n  ";
-  bc2_65e++;
-  std::cout << bc2_65e << "\n";
-
-  bitset2<65>  bc2_65f= bitset2<65>{1ull} << 64;
-  bitset2<65>  bc2_65g;
-  std::cout << "\n--" << bc2_65f << "=\n  ";
-  std::cout << (--bc2_65f) << "\n";
-  std::cout << "  " << bc2_65f << "-- =\n  ";
-  bc2_65f--;
-  std::cout << bc2_65f << "\n";
-  std::cout << "--" << bc2_65g << "=\n  ";
-  std::cout << (--bc2_65g) << "\n";
-
-  std::string bit_string = "101110";
-  std::istringstream bit_stream( bit_string );
-  bitset2<3>  b_from_stream1;
-  bitset2<3>  b_from_str2( bit_string, 3 );
-  bitset2<4>  b_from_str3( bit_string.c_str() + 1, 3 );
-  bit_stream >> b_from_stream1;
-  std::cout << b_from_stream1
-            << "= 0x" << b_from_stream1.to_hex_string() << '\n';
-  std::cout << b_from_str2
-            << "= 0x" << b_from_str2.to_hex_string() << '\n';
-  std::cout << b_from_str3
-            << "= 0x" << b_from_str3.to_hex_string() << '\n';
-
-
-  constexpr std::array<ULLONG,1>  s_arr_01a{{ 1ull }};
-  constexpr std::array<ULLONG,2>  s_arr_01b{{ 0xFFFFFFFFFFFFFFFFull, 1ull }};
-  constexpr std::array<ULLONG,3>  s_arr_01c{{ 0x1ull, 0xFFFFFFFFFFFFFFFFull, 0x3ull }};
-  constexpr std::array<ULLONG,4>  s_arr_01d{{ 0xEEEEEEEEEEEEEEEEull, 0xDull, 1ull, 0xFFFFFFFFFFFFFFFFull }};
-  constexpr bitset2<129>          b_from_s_arr01a{ s_arr_01a };
-  constexpr bitset2<129>          b_from_s_arr01b{ s_arr_01b };
-  constexpr bitset2<129>          b_from_s_arr01c{ s_arr_01c };
-  constexpr bitset2<129>          b_from_s_arr01d{ s_arr_01d };
-  std::cout << "b_from_s_arr01a= " << b_from_s_arr01a.to_hex_string() << "\n";
-  std::cout << "b_from_s_arr01b= " << b_from_s_arr01b.to_hex_string() << "\n";
-  std::cout << "b_from_s_arr01c= " << b_from_s_arr01c.to_hex_string() << "\n";
-  std::cout << "b_from_s_arr01d= " << b_from_s_arr01d.to_hex_string() << "\n";
-
-  constexpr bitset2<24>      b24_empty{ 0ull };
-  constexpr bitset2<24>      b24_full= ~b24_empty;
-  constexpr bitset2<23>      b23_a=        convert_to<23>( b24_full );
-  constexpr bitset2<25>      b25_a=        convert_to<25>( b24_full );
-  constexpr auto             b24_full_ui8= convert_to<24,uint8_t>( b24_full );
-  std::cout << "b24_full=     "  << b24_full << "\n";
-  std::cout << "b23_a=         " << b23_a << "\n";
-  std::cout << "b25_a=       "   << b25_a << "\n";
-  std::cout << "b24_full_ui8= "  << b24_full_ui8 << '\n';
-
-  bitset2<7>    b7_a( "1010101" );
-  bitset2<7>    b7_b( "1000101" );
-  bitset2<7>    b7_c( "1110101" );
-  bitset2<7>    b7_d( "0110101" );
-  bitset2<7>    b7_e( "1010101" );
-
-  constexpr bitset2<7>    b7_a_ce( 0b1010101ull );
-  constexpr bitset2<7>    b7_b_ce( 0b1000101ull );
-
-  assert(  is_subset_of( b7_b, b7_a ) );
-  assert( !is_subset_of( b7_c, b7_a ) );
-  assert( !is_subset_of( b7_d, b7_a ) );
-  assert( !is_subset_of( b7_a, b7_d ) );
-
-  assert(  unequal( b7_a, b7_b ) );
-  assert( !unequal( b7_e, b7_a ) );
-
-  static_assert( is_subset_of( b7_b_ce, b7_a_ce ), "" );
-  static_assert( unequal( b7_a_ce, b7_b_ce ), "" );
-
-  assert( b7_b <  b7_a );
-  assert( b7_c >  b7_a );
-  assert( b7_e <= b7_a );
-  assert( b7_a >= b7_d );
-
-  bitset2<2047>  b2047_a( 1ull );
-  auto           b2047_b= b2047_a << 999;
-  auto           b2047_c= b2047_a + b2047_b;
-  auto           b2047_d= b2047_a << 1999;
-  std::cout << "b2047_a= " << b2047_a.to_hex_string() << "\n"
-            << "b2047_b= " << b2047_b.to_hex_string() << "\n"
-            << "b2047_c= " << b2047_c.to_hex_string() << "\n";
-  std::cout << "bitset2<2047>::n_array= " << bitset2<2047>::n_array << '\n';
-  assert( unequal( b2047_a, b2047_b ) );
-  assert( unequal( b2047_b, b2047_d ) );
-  assert(  is_subset_of( b2047_a, b2047_c ) );
-  assert( !is_subset_of( b2047_b, b2047_d ) );
-
-  bitset2<16>  b16_a( "0000101000011111" );
-  bitset2<16>  b16_b;
-  hex_params<> hp1;
-  hp1.aCh=           'A';
-  hp1.leadingZeroes= false;
-  hp1.prefix=        "0x";
-  std::cout << '\n'
-    << b16_a.to_hex_string() << '\n'                                    // 0a1f
-    << b16_a.to_hex_string( hp1 )                                       // 0xA1F
-    << '\n'
-    << b16_b.to_hex_string() << '\n'                                    // 0000
-    << b16_b.to_hex_string( hex_params<>{'0', 'a', false, false, "0X"}) // 0X
-    << '\n';
-} // main
diff --git a/ThirdParty/bitset2/tests/test_bitset2_02.cpp b/ThirdParty/bitset2/tests/test_bitset2_02.cpp
deleted file mode 100644
index 9c8de9c84..000000000
--- a/ThirdParty/bitset2/tests/test_bitset2_02.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-
-#include <iostream>
-#include "bitset2.hpp"
-
-
-int main()
-{
-  using namespace Bitset2;
-
-  using ULLONG= unsigned long long;
-
-  constexpr
-  std::array<ULLONG,1>  a01{{1ull}};
-
-  constexpr
-  std::array<ULLONG,0>  a02{};
-
-  constexpr auto a_app01= detail::array_funcs<1,ULLONG>().prepend( 2ull, a01 );
-  constexpr auto a_app02= detail::array_funcs<0,ULLONG>().prepend( 3ull, a02 );
-  std::cout << a_app01[0] << "\t" << a_app01[1] << "\n";
-  std::cout << a_app02[0] << "\n";
-
-  //constexpr
-  auto aop0=  detail::array_ops<65,ULLONG>( 0 );
-  //constexpr
-  auto aop65= detail::array_ops<65,ULLONG>( 65 );
-  //constexpr
-  auto slp65= Bitset2::bitset2<64>{ aop65.m_shft_left_pattern };
-
-  std::cout << "(aop0)  m_n_shift_mod= " << aop0.m_n_shift_mod
-            << "\n        m_shft_div=    " << aop0.m_shft_div
-            << "\n        m_shft_mod=    " << aop0.m_shft_mod
-            << "\n        m_shft_leftright_shift= " << aop0.m_shft_leftright_shift
-            << "\n        m_shft_left_pattern=    " << aop0.m_shft_left_pattern
-            << "\n        m_shft_right_pattern=   " << aop0.m_shft_right_pattern
-            << "\n        n_words=                " << aop0.n_words
-            << "\n        n_array=                " << aop0.n_array
-            << "\n";
-  std::cout << "(aop65) m_n_shift_mod= " << aop65.m_n_shift_mod
-            << "\n        m_shft_div=    " << aop65.m_shft_div
-            << "\n        m_shft_mod=    " << aop65.m_shft_mod
-            << "\n        m_shft_leftright_shift= " << aop65.m_shft_leftright_shift
-            << "\n        m_shft_left_pattern=    " << aop65.m_shft_left_pattern
-            << "\n                           =    " << slp65
-            << "\n        m_shft_right_pattern=   " << aop65.m_shft_right_pattern
-            << "\n        n_words=                " << aop65.n_words
-            << "\n        n_array=                " << aop65.n_array
-            << "\n";
-}
diff --git a/ThirdParty/bitset2/tests/test_nonconst_constexpr01.cpp b/ThirdParty/bitset2/tests/test_nonconst_constexpr01.cpp
deleted file mode 100644
index 03a2aa1bc..000000000
--- a/ThirdParty/bitset2/tests/test_nonconst_constexpr01.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "../bitset2.hpp"
-#include <iostream>
-#include <array>
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-ce_op( Bitset2::bitset2<N,T> const &bs, size_t n, size_t op_t )
-{
-  auto ret_val= bs;
-  for( size_t c= 0; c < n; c++ )
-  {
-    switch( op_t )
-    {
-      case 1: ++ret_val; break;
-      case 2: ret_val++; break;
-      case 3: --ret_val; break;
-      case 4: ret_val--; break;
-    }
-  }
-  return ret_val;
-} // ce_op
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-ce_opequal( Bitset2::bitset2<N,T> const &bs1,
-            Bitset2::bitset2<N,T> const &bs2,
-            size_t                      op_t )
-{
-  auto ret_val= bs1;
-
-  switch( op_t )
-  {
-      case 1: ret_val += bs2; break;
-      case 2: ret_val |= bs2; break;
-      case 3: ret_val &= bs2; break;
-      case 4: ret_val ^= bs2; break;
-      case 5: ret_val.difference( bs2 ); break;
-  }
-  return ret_val;
-} // ce_opequal
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-ce_shftequal( Bitset2::bitset2<N,T> const &bs1,
-              size_t                      shft,
-              size_t                      op_t )
-{
-  auto ret_val= bs1;
-
-  switch( op_t )
-  {
-      case 1: ret_val <<= shft; break;
-      case 2: ret_val >>= shft; break;
-      case 3: ret_val.rotate_left(  shft ); break;
-      case 4: ret_val.rotate_right( shft ); break;
-  }
-  return ret_val;
-} // ce_shftequal
-
-
-template<size_t N,class T>
-constexpr
-Bitset2::bitset2<N,T>
-ce_sme_fncs( Bitset2::bitset2<N,T> const &bs1 )
-{
-  auto ret_val= bs1;
-  Bitset2::bitset2<N,T> b2;
-  b2.set();
-  b2.set( 12, false );
-  b2.test_set( 15, false );
-
-  ret_val.reverse();
-  ret_val.complement2();
-  ret_val ^= b2;
-
-  ret_val.flip();
-  ret_val.flip( 42 );
-  ret_val.flip();
-
-  return ret_val;
-} // ce_sme_fncs
-
-
-int main()
-{
-  using ULLONG= unsigned long long;
-  using namespace Bitset2;
-
-  constexpr std::array<ULLONG,2>  s_arr_01a{{ 0xFFFFFFFFFFFFFFFFull, 1ull }};
-  constexpr std::array<ULLONG,2>  s_arr_01b{{ 5ull, 0ull }};
-  constexpr std::array<ULLONG,2>  bit12{{ 1ull << 12, 0ull }};
-  constexpr std::array<ULLONG,2>  bit15{{ 1ull << 15, 0ull }};
-  constexpr std::array<ULLONG,2>  bit42{{ 1ull << 42, 0ull }};
-  constexpr bitset2<129>          zero;
-  constexpr bitset2<129>          all_set= ~zero;
-  constexpr bitset2<129>          sme_set1=
-                                  all_set ^ bitset2<129>{ bit12 } ^ bitset2<129>{ bit15 };
-  constexpr bitset2<129>          b_from_s_arr01a{ s_arr_01a };
-  constexpr bitset2<129>          b_from_s_arr01b{ s_arr_01b };
-  constexpr auto                  minus_s_arr_01b= complement2( b_from_s_arr01b );
-  constexpr auto                  add_01a_b= b_from_s_arr01a + b_from_s_arr01b;
-  constexpr auto                  sub_01a_b= b_from_s_arr01a + minus_s_arr_01b;
-  constexpr auto                  inc_01a_5= ce_op( b_from_s_arr01a, 5, 1 );
-  constexpr auto                  inc_01b_5= ce_op( b_from_s_arr01a, 5, 2 );
-  constexpr auto                  dec_01c_5= ce_op( b_from_s_arr01a, 5, 3 );
-  constexpr auto                  dec_01d_5= ce_op( b_from_s_arr01a, 5, 4 );
-
-  constexpr auto                  or_01a_b=  b_from_s_arr01a | b_from_s_arr01b;
-  constexpr auto                  and_01a_b= b_from_s_arr01a & b_from_s_arr01b;
-  constexpr auto                  xor_01a_b= b_from_s_arr01a ^ b_from_s_arr01b;
-  constexpr auto                  sdi_01a_b= difference( b_from_s_arr01a, b_from_s_arr01b );
-  constexpr auto                  shl4_01a=  b_from_s_arr01a << 4;
-  constexpr auto                  shr4_01a=  b_from_s_arr01a >> 4;
-  constexpr auto                  rol4_01a=  rotate_left(  b_from_s_arr01a, 4 );
-  constexpr auto                  ror4_01a=  rotate_right( b_from_s_arr01a, 4 );
-
-  constexpr auto                  rev_01a=   reverse( b_from_s_arr01a );
-  constexpr auto                  cpl2_01a=  complement2( rev_01a );
-  constexpr auto                  xor12_01a= cpl2_01a ^ sme_set1;
-  constexpr auto                  xor42_01a= xor12_01a ^ bitset2<129>{ bit42 };
-
-  constexpr auto                  pe1= ce_opequal( b_from_s_arr01a, b_from_s_arr01b, 1 );
-  constexpr auto                  oe1= ce_opequal( b_from_s_arr01a, b_from_s_arr01b, 2 );
-  constexpr auto                  ae1= ce_opequal( b_from_s_arr01a, b_from_s_arr01b, 3 );
-  constexpr auto                  xe1= ce_opequal( b_from_s_arr01a, b_from_s_arr01b, 4 );
-  constexpr auto                  de1= ce_opequal( b_from_s_arr01a, b_from_s_arr01b, 5 );
-
-  constexpr auto                  sl4_1= ce_shftequal( b_from_s_arr01a, 4, 1 );
-  constexpr auto                  sr4_1= ce_shftequal( b_from_s_arr01a, 4, 2 );
-  constexpr auto                  rl4_1= ce_shftequal( b_from_s_arr01a, 4, 3 );
-  constexpr auto                  rr4_1= ce_shftequal( b_from_s_arr01a, 4, 4 );
-  constexpr auto                  smf_a= ce_sme_fncs( b_from_s_arr01a );
-
-  static_assert( add_01a_b == inc_01a_5, "" );
-  static_assert( add_01a_b == inc_01b_5, "" );
-  static_assert( sub_01a_b == dec_01c_5, "" );
-  static_assert( sub_01a_b == dec_01d_5, "" );
-  static_assert( add_01a_b  == pe1, "" );
-  static_assert( or_01a_b   == oe1, "" );
-  static_assert( and_01a_b  == ae1, "" );
-  static_assert( xor_01a_b  == xe1, "" );
-  static_assert( sdi_01a_b  == de1, "" );
-  static_assert( shl4_01a   == sl4_1, "" );
-  static_assert( shr4_01a   == sr4_1, "" );
-  static_assert( rol4_01a   == rl4_1, "" );
-  static_assert( ror4_01a   == rr4_1, "" );
-  static_assert( xor42_01a  == smf_a, "" );
-
-  std::cout << inc_01a_5 << '\n' << inc_01b_5.to_hex_string() << "\n";
-  std::cout << sub_01a_b << '\n' << dec_01c_5.to_hex_string() << "\n";
-
-  return 0;
-} // main
diff --git a/ThirdParty/bitset2/tests/test_ullong2array.cpp b/ThirdParty/bitset2/tests/test_ullong2array.cpp
deleted file mode 100644
index 7649f6abe..000000000
--- a/ThirdParty/bitset2/tests/test_ullong2array.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "ullong2array.hpp"
-#include "array2u_long_t.hpp"
-#include <iostream>
-#include <cstdint>
-#include <cassert>
-
-
-int main()
-{
-  using ULLONG= unsigned long long;
-
-  auto const all_set= ~ULLONG(0);
-
-  using namespace Bitset2::detail;
-
-  using a2l_65ll= Bitset2::detail::array2u_long_t<65,ULLONG,ULLONG>;
-
-  auto const a1= ullong2array<18,uint32_t>()( all_set );
-  std::array<uint32_t,1> const expt1{{ uint32_t((1ull << 18) - 1) }};
-  size_t ct= 0;
-  for( auto v: a1 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt1[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 1 );
-
-
-  auto const a2= ullong2array<34,uint32_t>()( all_set );
-  std::array<uint32_t,2> const
-       expt2{{ uint32_t(~uint32_t(0)), uint32_t((1ull << 2) - 1) }};
-  ct= 0;
-  for( auto v: a2 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt2[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 2 );
-
-
-  auto const a3= ullong2array<18,uint16_t>()( all_set );
-  std::array<uint32_t,2> const
-       expt3{{ uint16_t(~uint16_t(0)), uint16_t((1ull << 2) - 1) }};
-  ct= 0;
-  for( auto v: a3 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt3[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 2 );
-
-
-  auto const a4= ullong2array<18,uint8_t>()( all_set );
-  std::array<uint8_t,3> const
-    expt4{{uint8_t(~uint8_t(0)),uint8_t(~uint8_t(0)),uint8_t((1ull << 2) - 1)}};
-  ct= 0;
-  for( auto v: a4 )
-  {
-    std::cout << int(v) << ",  ";
-    assert( v == expt4[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 3 );
-
-
-  auto const a5= ullong2array<18,uint64_t>()( all_set );
-  std::array<uint64_t,1> const expt5{{ uint64_t((1ull << 18) - 1) }};
-  ct= 0;
-  for( auto v: a5 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt5[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 1 );
-
-
-  auto const a6= ullong2array<34,uint64_t>()( all_set );
-  std::array<uint64_t,1> const expt6{{ uint64_t((1ull << 34) - 1) }};
-  ct= 0;
-  for( auto v: a6 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt6[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 1 );
-
-
-  auto const a7= ullong2array<66,uint64_t>()( all_set );
-  std::array<uint64_t,2> const
-       expt7{{ uint64_t(~uint64_t(0)), uint64_t(0) }};
-  ct= 0;
-  for( auto v: a7 )
-  {
-    std::cout << v << ",  ";
-    assert( v == expt7[ct] );  ct++;
-  }
-  std::cout << "\n";
-  assert( ct == 2 );
-  
-
-  a2l_65ll::array_t  arr1{{ all_set, 0ull }};
-
-  std::cout << '\n' << a2l_65ll::i_pttrn << '\n';
-  std::cout << a2l_65ll::h_pttrn << '\n';
-  std::cout << a2l_65ll::allset << '\n';
-  std::cout << a2l_65ll::n_array << '\n';
-  std::cout << a2l_65ll::use_vals << '\n';
-  std::cout << a2l_65ll().check_overflow( arr1 ) << '\n';
-}
diff --git a/ThirdParty/bitset2/tests/tests01.cpp b/ThirdParty/bitset2/tests/tests01.cpp
deleted file mode 100644
index 040e578f5..000000000
--- a/ThirdParty/bitset2/tests/tests01.cpp
+++ /dev/null
@@ -1,903 +0,0 @@
-// BITSET2
-//
-//  Copyright Claas Bontus
-//
-//  Use, modification and distribution is subject to the
-//  Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// Project home: https://github.com/ClaasBontus/bitset2
-//
-
-
-#include "../bitset2.hpp"
-#include "gen_randoms.hpp"
-#include <bitset>
-#include <cassert>
-#include <cstdint>
-#include <iostream>
-
-#define TESTMANY(F) \
-    F <7  >(); \
-    F <8  >(); \
-    F <9  >(); \
-    F <63 >(); \
-    F <64 >(); \
-    F <65 >(); \
-    F <95 >(); \
-    F <96 >(); \
-    F <97 >(); \
-    F <127>(); \
-    F <128>(); \
-    F <129>(); \
-    F <255>(); \
-    F <256>(); \
-    F <257>();
-
-#define TESTMANY2(F,T,S) \
-    F <7,  T>(S); \
-    F <8,  T>(S); \
-    F <9,  T>(S); \
-    F <63, T>(S); \
-    F <64, T>(S); \
-    F <65, T>(S); \
-    F <95, T>(S); \
-    F <96, T>(S); \
-    F <97, T>(S); \
-    F <127,T>(S); \
-    F <128,T>(S); \
-    F <129,T>(S); \
-    F <255,T>(S); \
-    F <256,T>(S); \
-    F <257,T>(S);
-
-
-#define TESTMNY(F) \
-    TESTMANY2(F,uint8_t, "uint8_t" ) \
-    TESTMANY2(F,uint16_t,"uint16_t") \
-    TESTMANY2(F,uint32_t,"uint32_t") \
-    TESTMANY2(F,unsigned long long,"U_L_LONG")
-
-
-template<size_t N,class T=unsigned long long>
-using t1= Bitset2::bitset2<N,T>;
-
-template<size_t N>
-using t1a= Bitset2::bitset2<N>;
-
-template<size_t N>
-using t2= std::bitset<N>;
-
-
-constexpr size_t n_loops= 100000;
-
-constexpr bool verbose= false;
-
-
-template<size_t N,class T>
-struct dummy_add
-{
-  enum : size_t
-  {   ull_bits= sizeof(T) * CHAR_BIT
-    , div_val=  N / ull_bits
-    , mod_val=  N % ull_bits
-    , n_ull=    ( mod_val != 0 ) ? (div_val+1) : div_val
-    , n_array=  ( N == 0 )       ? 1 : n_ull
-  };
-  //
-  enum : T
-  {   all_one= T(~T(0))
-  ,   hgh_pattern=  (N==0) ? T(0)
-                           : (mod_val==0) ? T(all_one)
-                                          : T(all_one >> (ull_bits-mod_val))
-  };
-  //
-  using array_t= std::array<T,n_array>;
-  //
-  array_t
-  add( array_t const &a1, array_t const &a2 ) const
-  {
-    array_t  ret_val;
-    T        crry= T(0);
-
-    for( size_t c= 0; c < n_ull; ++c )
-    {
-      T const v= T( a1[c] + a2[c] + crry );
-      if( v < a1[c] || v < a2[c] ||
-          ( a1[c] == all_one && a2[c] == all_one ) ) crry= T(1);
-      else                                           crry= T(0);
-      ret_val[c]= v;
-    }
-    if( n_ull > 0 ) ret_val[n_ull-1] &= hgh_pattern;
-
-    return ret_val;
-  } // add
-  //
-  // Returns false if a1 != a2
-  bool
-  compare( array_t const &a1, array_t const &a2 )
-  {
-    for( size_t c= 0; c < n_array; ++c )
-    {
-      if( a1[c] != a2[c] ) return false;
-    }
-    return true;
-  }
-}; // struct dummy_add
-
-
-template<size_t N,class T>
-t1<N,T>
-dummy_reverse( t1<N,T> const & bs )
-{
-  t1<N,T>  ret_val;
-  for( size_t c= 0; c < N; ++c ) ret_val[c]= bs[N-c-1];
-
-  return ret_val;
-}
-
-
-
-template<size_t N,class T>
-void
-test_any_all_none( char const * type_str )
-{
-  std::cout << "Entering test_any_all_none N= " << N << " type= " << type_str << "\n";
-
-  t1<N,T> const empty1;
-  t2<N>   const empty2;
-  auto  const   full1= ~empty1;
-  auto  const   full2= ~empty2;
-
-  auto const  empty1a= t1<N,T>( empty2 );
-  auto const  empty2a= t2<N>(   empty1 );
-  auto const  full1a=  t1<N,T>( full2 );
-  auto const  full2a=  t2<N>(   full1 );
-
-  assert(  empty1.none()  && !empty1.all()  && !empty1.any() );
-  assert(  empty1a.none() && !empty1a.all() && !empty1a.any() );
-  assert(  empty2a.none() && !empty2a.all() && !empty2a.any() );
-  assert( !full1.none()   &&  full1.all()   &&  full1.any() );
-  assert( !full1a.none()  &&  full1a.all()  &&  full1a.any() );
-  assert( !full2a.none()  &&  full2a.all()  &&  full2a.any() );
-
-
-  constexpr t1<N,T> ce_empty1;
-  constexpr auto    ce_full1= ~ce_empty1;
-  static_assert(  ce_empty1.none()  && !ce_empty1.all()  && !ce_empty1.any(), "" );
-  static_assert( !ce_full1.none()   &&  ce_full1.all()   &&  ce_full1.any(), "" );
-
-
-  gen_random_bitset2<N,T>  gen_rand;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1= gen_rand();
-    auto const  bs2=  t2<N>( bs1 );
-    auto const  bs1a= t1<N,T>( bs2 );
-
-    if( verbose ) std::cout << bs1.to_hex_string() << "\t" << c << "\n";
-
-    assert( bs1 == bs1a );
-    assert( bs1.none() == bs2.none() );
-    assert( bs1.all()  == bs2.all() );
-    assert( bs1.any()  == bs2.any() );
-  } // for c
-} // test_any_all_none
-
-
-
-
-template<size_t N,class T>
-void
-test_set_count_size( char const * type_str )
-{
-  std::cout << "Entering test_set_count_size N= " << N << " type= " << type_str << "\n";
-
-  t1<N,T> const      empty1;
-  constexpr t1<N,T>  ce_empty1;
-  constexpr t1<N,T>  ce_full1= ~ce_empty1;
-  assert( empty1.size() == N );
-  static_assert( ce_empty1.size() == N, "" );
-  static_assert( ce_full1.count() == N, "" );
-  static_assert( !ce_empty1.test( N - 3 ), "" );
-  static_assert( ce_full1.test( N - 2 ), "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  cnt1= bs1.count();
-    size_t      n_set1= 0, n_set2= 0;
-    for( size_t b_c= 0; b_c < N; ++b_c )
-    {
-      if( bs1.test( b_c ) ) ++n_set1;
-      if( bs1[b_c] )        ++n_set2;
-    }
-
-    if( verbose ) std::cout << bs1.to_hex_string() << "\t" << n_set1
-                            << "\t" << c << "\t" << bs1 << "\n";
-
-    auto bs2= bs1;
-    bs2.flip();
-    auto const cnt2= bs2.count();
-
-    assert( n_set1 == cnt1 );
-    assert( n_set1 == n_set2 );
-    assert( cnt2   == N - cnt1 );
-  } // for c
-} // test_set_count_size
-
-
-
-
-template<size_t N,class T>
-void
-test_set( char const * type_str )
-{
-  std::cout << "Entering test_set N= " << N << " type= " << type_str << "\n";
-
-  gen_random_bitset2<N,T>  gen_rand;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto  bs1=  gen_rand();
-    auto  bs2=  bs1;
-    auto  bs3=  t2<N>( bs1 );
-    bool  flag= false;
-    for( size_t b= 0; b < N; ++ b )
-    {
-      bool const bt1= bs1[b];
-      bs1.set( b, flag );
-      auto const bt2= bs2.test_set( b, flag);
-      assert( bt1 == bt2 );
-      bs3.set( b, flag );
-
-      flag= !flag;
-    }
-    assert( bs1 == bs2 );
-    assert( bs1 == (t1<N,T>( bs3 )) );
-  } // for c
-} // test_set
-
-
-
-
-template<size_t N,class T>
-void
-test_rotate( char const * type_str )
-{
-  std::cout << "Entering test_rotate N= " << N << " type= " << type_str << "\n";
-
-  constexpr std::array<T,2>  ce_arr1{{ T(2), T(5) }};
-  constexpr std::array<T,2>  ce_arr2{{ T(4), T(10) }};
-  constexpr t1<74,T>  ce_bs1( ce_arr1 );
-  constexpr t1<74,T>  ce_bs1_r= Bitset2::rotate_left( ce_bs1, 1 );
-  constexpr t1<74,T>  ce_bs2( ce_arr2 );
-  static_assert( ce_bs1_r == ce_bs2, "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  cnt1= bs1.count();
-
-    for( size_t b_c= 0; b_c < 2 * N; ++b_c )
-    {
-      auto const b_c_mod= b_c % N;
-      auto const bs2_r= Bitset2::rotate_right( bs1,   b_c );
-      auto const bs2_l= Bitset2::rotate_left(  bs1,   b_c );
-      auto const bs2a=  Bitset2::rotate_left(  bs2_r, b_c );
-      auto const bs2b=  Bitset2::rotate_right( bs2_l, b_c );
-      auto const bs2_r2= ( bs1 >> b_c_mod ) | ( bs1 << (N-b_c_mod) );
-      auto const bs2_l2= ( bs1 << b_c_mod ) | ( bs1 >> (N-b_c_mod) );
-
-      auto bc1_c1= bs1;
-      auto bc1_c2= bs1;
-      bc1_c1.rotate_left(  b_c );
-      bc1_c2.rotate_right( b_c );
-
-      if( verbose )
-        std::cout << bs1 << "\t"
-                  << b_c << "\t"
-                  << bs2_l << "\t"
-                  << bs2_r << "\n";
-      assert( cnt1 == bs2_r.count() );
-      assert( cnt1 == bs2_l.count() );
-      assert( bs2a == bs1 );
-      assert( bs2b == bs1 );
-      assert( bs2_r2 == bs2_r );
-      assert( bs2_l2 == bs2_l );
-      assert( bc1_c1 == bs2_l );
-      assert( bc1_c2 == bs2_r );
-    }
-  } // for c
-} // test_rotate
-
-
-
-
-template<size_t N,class T>
-void
-test_shift( char const * type_str )
-{
-  std::cout << "Entering test_shift N= " << N << " type= " << type_str << "\n";
-
-  gen_random_bitset2<N,T>  gen_rand;
-  t1<N,T> const            empty1;
-
-  constexpr size_t n_bts_m= sizeof(T) * CHAR_BIT - 1;
-  constexpr std::array<T,2>  ce_arr1{{ T(2), T(5) }};
-  constexpr std::array<T,2>  ce_arr2{{ T(4), T(10) }};
-  constexpr std::array<T,2>  ce_arr3{{ T(1) + T(T(1) << n_bts_m), T(2) }};
-  constexpr t1<74,T>  ce_bs1( ce_arr1 );
-  constexpr t1<74,T>  ce_bs1_s1= ce_bs1 << 1;
-  constexpr t1<74,T>  ce_bs1_s2= ce_bs1 >> 1;
-  constexpr t1<74,T>  ce_bs2( ce_arr2 );
-  constexpr t1<74,T>  ce_bs3( ce_arr3 );
-  static_assert( ce_bs1_s1 == ce_bs2, "" );
-  static_assert( ce_bs1_s2 == ce_bs3, "" );
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-
-    for( size_t b_c= 0; b_c <= N + 5; ++b_c )
-    {
-      auto const bs1_l= bs1 << b_c;
-      auto const bs1_r= bs1 >> b_c;
-      auto       bs1_c1= bs1;
-      auto       bs1_c2= bs1;
-      bs1_c1 <<= b_c;
-      bs1_c2 >>= b_c;
-      if( verbose )
-        std::cout << bs1 << "\t"
-                  << bs1_l << "\t"
-                  << bs1_r << "\n";
-      if( b_c < N )
-      {
-        t2<N>  const bs2{ bs1 };
-        auto const bs2_l= bs2 << b_c;
-        auto const bs2_r= bs2 >> b_c;
-        assert( bs2_l == t2<N>( bs1_l ) );
-        assert( bs2_r == t2<N>( bs1_r ) );
-        assert( bs1_c1 == bs1_l );
-        assert( bs1_c2 == bs1_r );
-      }
-      else
-      {
-        assert( bs1_l == empty1 );
-        assert( bs1_r == empty1 );
-        assert( bs1_c1 == empty1 );
-        assert( bs1_c2 == empty1 );
-      }
-    } // for b_c
-  } // for c
-} // test_shift
-
-
-
-
-template<size_t N,class T>
-void
-test_add( const char * type_str )
-{
-  std::cout << "Entering test_add N= " << N << " type= " << type_str << "\n";
-
-  gen_random_bitset2<N,T>  gen_rand;
-  dummy_add<N,T>           adder;
-  t1<N,T> const            zero;
-  t1<N,T> const            one{{ T(1) }};
-  t1<N,T> const            all= t1<N,T>().set();
-
-  auto const               all_twice=  all + all;
-  auto                     all_twice2= all;
-  all_twice2 += all;
-  auto                     a_m1= all;
-  a_m1--;
-  auto                     a_m2= a_m1;
-  a_m2--;
-  auto                     all_twice_m1= all + a_m1;
-  assert( all_twice    == a_m1 );
-  assert( all_twice2   == a_m1 );
-  assert( all_twice_m1 == a_m2 );
-
-  constexpr t1<N,T>        ce_one{{ T(1) }};
-  constexpr t1<N,T>        ce_empty;
-  constexpr t1<N,T>        ce_all= ~ce_empty;
-  constexpr t1<N,T>        ce_all_but_one= ~ce_one;
-  constexpr auto           ce_all_twice= ce_all + ce_all;
-  static_assert( ce_all_twice == ce_all_but_one, "" );
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  bs2=  gen_rand();
-    auto        bs3=  bs1;
-    auto        bs4=  bs1;
-    auto        bs5=  bs1;
-    ++bs3; --bs4;
-    bs5 += bs2;
-
-    auto const  add1= bs1 + bs2;
-    auto const  add2= adder.add( bs1.data(), bs2.data() );
-    auto const  add3= adder.add( bs1.data(), one.data() );
-    auto const  add4= adder.add( bs1.data(), all.data() );
-    if( verbose )
-      std::cout << "  " << bs1 << "\n+ " << bs2
-                << "\n= " << add1
-                << "\n, " << t1<N,T>(add2) << "\n\n";
-    auto const  cmp1= adder.compare( add2, add1.data() );
-    auto const  cmp2= adder.compare( add3, bs3.data() );
-    auto const  cmp3= adder.compare( add4, bs4.data() );
-    auto const  cmp4= adder.compare( add2, bs5.data() );
-
-    auto const  exp_zero= bs1 + (~bs1 + one);
-
-    assert( cmp1 );
-    assert( cmp2 );
-    assert( cmp3 );
-    assert( cmp4 );
-    assert( exp_zero == zero );
-  } // for c
-} // test_add
-
-
-
-
-template<size_t N,class T>
-void
-test_difference( char const * type_str )
-{
-  std::cout << "Entering test_difference N= " << N << " type= " << type_str << "\n";
-
-  constexpr std::array<T,2>  ce_arr1{{ T(3), T(5) }};
-  constexpr std::array<T,2>  ce_arr2{{ T(6), T(1) }};
-  constexpr t1<74,T>  ce_bs1( ce_arr1 );
-  constexpr t1<74,T>  ce_bs2( ce_arr2 );
-  constexpr auto      ce_diff1= Bitset2::difference( ce_bs1, ce_bs2 );
-  constexpr auto      ce_ref1=  ce_bs1 & ~ce_bs2;
-  static_assert( ce_diff1 == ce_ref1, "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  bs2=  gen_rand();
-    auto        bs3=  bs1;
-
-    auto const  d1=   Bitset2::difference( bs1, bs2 );
-    auto const  d2=   bs1 & ~bs2;
-    bs3.difference( bs2 );
-
-    assert( d2  == d1 );
-    assert( bs3 == d1 );
-  } // for c
-} // test_difference
-
-
-
-
-
-template<size_t N,class T>
-void
-test_not( char const * type_str )
-{
-  std::cout << "Entering test_not N= " << N << " type= " << type_str << "\n";
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  bs2=  ~bs1;
-    for( size_t b_c= 0; b_c < N; ++b_c )
-    {
-      if( verbose ) std::cout << "~" << bs1 << "\n=" << bs2 << "\n";
-      assert( bs1[b_c] != bs2[b_c] );
-    }
-  } // for c
-} // test_not
-
-
-template<size_t N,class T>
-std::vector<size_t>
-idx_lst( t1<N,T> const &bs )
-{
-  std::vector<size_t> ret_val;
-  for( size_t c= 0; c < N; ++c )
-    if( bs[c] ) ret_val.push_back( c );
-  return ret_val;
-} // idx_lst
-
-
-
-template<size_t N,class T>
-void
-test_find( char const * type_str )
-{
-  std::cout << "Entering test_find N= " << N << " type= " << type_str << "\n";
-
-  constexpr  t1<N,T>  ce_bs1( 12ull );
-  static_assert( ce_bs1.find_first() == 2, "" );
-  static_assert( ce_bs1.find_next( 2 ) == 3, "" );
-  static_assert( ce_bs1.find_next( 3 ) == t1<N,T>::npos, "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < N; ++ c)
-  {
-    auto bs1= t1<N,T>();
-
-    assert( bs1.find_first() == (Bitset2::bitset2<N,T>::npos) );
-    assert( bs1.find_next(0) == (Bitset2::bitset2<N,T>::npos) );
-
-    bs1[c]= true;
-    assert( bs1.find_first() == c );
-    if( c > 0 )
-    {
-      assert( bs1.find_next( c - 1 ) == c );
-
-      bs1[0]= true;
-      bs1[N-1]= true;
-      assert( bs1.find_first() == 0 );
-      auto idx= bs1.find_next( c );
-      if( c < N - 1 ) assert( idx == N - 1 );
-      else            assert( idx == (Bitset2::bitset2<N,T>::npos) );
-
-      for( size_t b= 0; b < c; ++b ) bs1[b]= true;
-      idx= bs1.find_next( c );
-      if( c < N - 1 ) assert( idx == N - 1 );
-      else            assert( idx == (Bitset2::bitset2<N,T>::npos) );
-    }
-  } // for c
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=  gen_rand();
-    auto const  lst=  idx_lst( bs1 );
-    if( lst.empty() ) assert( bs1.find_first() == (Bitset2::bitset2<N,T>::npos) );
-    else
-    {
-      auto b_it= lst.begin();
-      auto e_it= lst.end();
-      auto idx=  bs1.find_first();
-      assert( idx == *(b_it++) );
-      for( ; b_it != e_it; ++b_it )
-      {
-        idx= bs1.find_next( idx );
-        assert( idx == *b_it );
-      }
-      idx= bs1.find_next( idx );
-      assert( idx == (Bitset2::bitset2<N,T>::npos) );
-    }
-  } // for c
-
-} // test_find
-
-
-
-
-template<size_t N,class T>
-void
-test_bitwise_ops( char const * type_str )
-{
-  std::cout << "Entering test_bitwise_ops N= " << N << " type= " << type_str << "\n";
-
-  constexpr std::array<T,2>  ce_arr1{{ T(3), T(5) }};
-  constexpr std::array<T,2>  ce_arr2{{ T(5), T(1) }};
-  constexpr std::array<T,2>  ce_e_or{{  T(7), T(5) }};
-  constexpr std::array<T,2>  ce_e_and{{ T(1), T(1) }};
-  constexpr std::array<T,2>  ce_e_xor{{ T(6), T(4) }};
-  constexpr t1<74,T>  ce_bs1( ce_arr1 );
-  constexpr t1<74,T>  ce_bs2( ce_arr2 );
-  constexpr t1<74,T>  ce_bs_e_or(  ce_e_or );
-  constexpr t1<74,T>  ce_bs_e_and( ce_e_and );
-  constexpr t1<74,T>  ce_bs_e_xor( ce_e_xor );
-  constexpr auto      ce_or=  ce_bs1 | ce_bs2;
-  constexpr auto      ce_and= ce_bs1 & ce_bs2;
-  constexpr auto      ce_xor= ce_bs1 ^ ce_bs2;
-  static_assert( ce_or  == ce_bs_e_or,  "" );
-  static_assert( ce_and == ce_bs_e_and, "" );
-  static_assert( ce_xor == ce_bs_e_xor, "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=   gen_rand();
-    auto const  bs2=   gen_rand();
-    auto const  b_or=  bs1 | bs2;
-    auto const  b_and= bs1 & bs2;
-    auto const  b_xor= bs1 ^ bs2;
-
-    auto const  sbs1=   t2<N>( bs1 );
-    auto const  sbs2=   t2<N>( bs2 );
-    auto const  sb_or=  sbs1 | sbs2;
-    auto const  sb_and= sbs1 & sbs2;
-    auto const  sb_xor= sbs1 ^ sbs2;
-
-    if( verbose )
-      std::cout << "        " << bs1 << " op " << bs2
-                << "\nop= |:  " << b_or
-                << "\nop= &:  " << b_and
-                << "\nop= ^:  " << b_xor << "\n";
-
-    assert( sb_or  == t2<N>( b_or ) );
-    assert( sb_and == t2<N>( b_and ) );
-    assert( sb_xor == t2<N>( b_xor ) );
-  } // for c
-} // test_bitwise_ops
-
-
-
-
-template<size_t N,class T>
-void
-test_reverse( char const * type_str )
-{
-  std::cout << "Entering test_reverse N= " << N << " type= " << type_str << "\n";
-
-  constexpr t1<N,T>  ce_bs1( 3ull );
-  constexpr auto     ce_bs1_rev= Bitset2::reverse( ce_bs1 );
-  constexpr auto     ce_bs1_rot= Bitset2::rotate_right( ce_bs1, 2 );
-  static_assert( ce_bs1_rev == ce_bs1_rot, "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=   gen_rand();
-    auto        bs2=   bs1;
-    auto const  bs3=   dummy_reverse( bs1 );
-    auto const  bs4=   Bitset2::reverse( bs1 );
-    bs2.reverse();
-    if( verbose )
-      std::cout << "  " << bs1
-                << "\n2 " << bs2
-                << "\n3 " << bs3 << '\n';
-    assert( bs2 == bs3 );
-    assert( bs4 == bs3 );
-    bs2.reverse();
-    assert( bs2 == bs1 );
-  } // for c
-} // test_reverse
-
-
-
-template<size_t N,class T>
-void
-test_convert( char const * type_str )
-{
-  std::cout << "Entering test_convert N= " << N << " type= " << type_str << "\n";
-
-  constexpr t1<N,T>  ce_bs1( 0ull );
-  constexpr auto     ce_bs2= ~ce_bs1;
-  constexpr auto     ce_bs2a= ce_bs2 >> 1;
-  constexpr auto     ce_bs2b= Bitset2::convert_to<N-1>( ce_bs2 );
-  constexpr auto     ce_bs2c= Bitset2::convert_to<N>(   ce_bs2b );
-  constexpr auto     ce_bs2d= Bitset2::convert_to<N+1>( ce_bs2 );
-  constexpr auto     ce_bs2e= Bitset2::convert_to<N>(   ce_bs2d );
-  static_assert( ce_bs2c == ce_bs2a, "" );
-  static_assert( ce_bs2e == ce_bs2,  "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1=   gen_rand();
-    auto const  bs2a= bs1 & ce_bs2a;
-    auto const  bs2b= Bitset2::convert_to<N-1>( bs1 );
-    auto const  bs2c= Bitset2::convert_to<N>(   bs2b );
-    auto const  bs2d= Bitset2::convert_to<N+1>( bs1 );
-    auto const  bs2e= Bitset2::convert_to<N>(   bs2d );
-    assert( bs2c == bs2a );
-    assert( bs2e == bs1 );
-
-    auto const bs3a= Bitset2::convert_to<N,uint8_t>( bs1 );
-    auto const bs3b= Bitset2::convert_to<N,T>( bs3a );
-    auto const bs3c= Bitset2::convert_to<N,uint32_t>( bs3a );
-    auto const bs4a= Bitset2::convert_to<N,uint64_t>( bs1 );
-    auto const bs4b= Bitset2::convert_to<N,T>( bs4a );
-    auto const bs5a= Bitset2::convert_to<N,uint64_t>( bs3a );
-    auto const bs5b= Bitset2::convert_to<N,T>( bs5a );
-    auto const bs5c= Bitset2::convert_to<N,uint32_t>( bs5a );
-    assert( bs3b == bs1 );
-    assert( bs4b == bs1 );
-    assert( bs5b == bs1 );
-    assert( bs3c == bs5c );
-
-    const Bitset2::bitset2<N,uint8_t>   bs_1a{ bs1.data() };
-    const Bitset2::bitset2<N,uint64_t>  bs_1b{ bs1.data() };
-    assert( bs_1a == bs3a );
-    assert( bs_1b == bs4a );
-  } // for c
-} // test_convert
-
-
-
-
-template<size_t N,class T>
-void
-test_compare( char const * type_str )
-{
-  std::cout << "Entering test_compare N= " << N << " type= " << type_str << "\n";
-
-  constexpr t1<N,T>  ce_bs1( 0ull );
-  constexpr auto     ce_bs2= ~ce_bs1;
-  constexpr auto     ce_bs2a= ce_bs2 >> 1;
-  constexpr auto     ce_bs2b= ce_bs2a;
-  static_assert( ce_bs2a <  ce_bs2,  "" );
-  static_assert( ce_bs2b <= ce_bs2a, "" );
-  static_assert( ce_bs2  >  ce_bs2a,  "" );
-  static_assert( ce_bs2a >= ce_bs2b, "" );
-  static_assert( ce_bs2a != ce_bs2,  "" );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1= gen_rand();
-    auto        bs2= bs1;
-    auto const  bs3= bs1;
-    --bs2;
-    if( bs1 != ce_bs1 )
-    {
-      assert( bs2 <  bs1 );
-      assert( bs2 <= bs1 );
-      assert( bs1 >  bs2 );
-      assert( bs1 >= bs1 );
-    }
-    else
-    {
-      assert( bs1 == ce_bs1 );
-    }
-    assert( bs3 <= bs1 );
-    assert( bs3 >= bs1 );
-  } // for c
-} // test_compare
-
-
-
-
-template<size_t N,class T>
-void
-test_complement2( char const * type_str )
-{
-  std::cout << "Entering test_complement2 N= " << N << " type= " << type_str << "\n";
-
-  constexpr t1<N,T>  zero( 0ull );
-  constexpr auto     allset= ~zero;
-  auto one=          zero;
-  ++one;
-
-  constexpr auto     ce_bs1= Bitset2::complement2( zero );
-  constexpr auto     ce_bs2= Bitset2::complement2( allset );
-  auto               bs1= zero;
-  auto               bs2= allset;
-  bs1.complement2();
-  bs2.complement2();
-  static_assert( ce_bs1 == zero, "" );
-  assert( bs1 == zero );
-  assert( bs2 == one );
-  assert( ce_bs2 == one );
-
-  gen_random_bitset2<N,T>  gen_rand;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs_1a=   gen_rand();
-    auto        bs_1b=   bs_1a;
-    auto const  bs_1c=   ~bs_1a + one;
-    auto const  bs_2a=   Bitset2::complement2( bs_1a );
-    bs_1b.complement2();
-    assert( bs_1a + bs_2a == zero );
-    assert( bs_1a + bs_1b == zero );
-    assert( bs_1b == bs_1c );
-  } // for c
-} // test_complement2
-
-
-
-template<size_t N>
-void
-test_hash()
-{
-  std::cout << "Entering test_hash N= " << N << "\n";
-
-  gen_random_bitset2<N,uint8_t>   gen_rand8;
-  gen_random_bitset2<N,uint16_t>  gen_rand16;
-  gen_random_bitset2<N,uint32_t>  gen_rand32;
-  gen_random_bitset2<N,uint64_t>  gen_rand64;
-
-  for( size_t c= 0; c < n_loops; ++c )
-  {
-    auto const  bs1_8=   gen_rand8();
-    auto const  bs1a_8=  t2<N>( bs1_8 );
-    auto const  bs2_8=   t1<N,uint16_t>( bs1a_8 );
-    auto const  bs3_8=   t1<N,uint32_t>( bs1a_8 );
-    auto const  bs4_8=   t1<N,uint64_t>( bs1a_8 );
-
-    auto const hs1_8=  std::hash<std::remove_cv_t<decltype(bs1_8)> >{}( bs1_8 );
-    auto const hs2_8=  std::hash<std::remove_cv_t<decltype(bs2_8)> >{}( bs2_8 );
-    auto const hs3_8=  std::hash<std::remove_cv_t<decltype(bs3_8)> >{}( bs3_8 );
-    auto const hs4_8=  std::hash<std::remove_cv_t<decltype(bs4_8)> >{}( bs4_8 );
-    assert( hs1_8 == hs2_8 );
-    assert( hs1_8 == hs3_8 );
-    assert( hs1_8 == hs4_8 );
-
-
-    auto const  bs1_16=   gen_rand16();
-    auto const  bs1a_16=  t2<N>( bs1_16 );
-    auto const  bs2_16=   t1<N,uint8_t>(  bs1a_16 );
-    auto const  bs3_16=   t1<N,uint32_t>( bs1a_16 );
-    auto const  bs4_16=   t1<N,uint64_t>( bs1a_16 );
-
-    auto const hs1_16=  std::hash<std::remove_cv_t<decltype(bs1_16)> >{}( bs1_16 );
-    auto const hs2_16=  std::hash<std::remove_cv_t<decltype(bs2_16)> >{}( bs2_16 );
-    auto const hs3_16=  std::hash<std::remove_cv_t<decltype(bs3_16)> >{}( bs3_16 );
-    auto const hs4_16=  std::hash<std::remove_cv_t<decltype(bs4_16)> >{}( bs4_16 );
-    assert( hs1_16 == hs2_16 );
-    assert( hs1_16 == hs3_16 );
-    assert( hs1_16 == hs4_16 );
-
-
-    auto const  bs1_32=   gen_rand32();
-    auto const  bs1a_32=  t2<N>( bs1_32 );
-    auto const  bs2_32=   t1<N,uint8_t>(  bs1a_32 );
-    auto const  bs3_32=   t1<N,uint16_t>( bs1a_32 );
-    auto const  bs4_32=   t1<N,uint64_t>( bs1a_32 );
-
-    auto const hs1_32=  std::hash<std::remove_cv_t<decltype(bs1_32)> >{}( bs1_32 );
-    auto const hs2_32=  std::hash<std::remove_cv_t<decltype(bs2_32)> >{}( bs2_32 );
-    auto const hs3_32=  std::hash<std::remove_cv_t<decltype(bs3_32)> >{}( bs3_32 );
-    auto const hs4_32=  std::hash<std::remove_cv_t<decltype(bs4_32)> >{}( bs4_32 );
-    assert( hs1_32 == hs2_32 );
-    assert( hs1_32 == hs3_32 );
-    assert( hs1_32 == hs4_32 );
-
-
-    auto const  bs1_64=   gen_rand64();
-    auto const  bs1a_64=  t2<N>( bs1_64 );
-    auto const  bs2_64=   t1<N,uint8_t>(  bs1a_64 );
-    auto const  bs3_64=   t1<N,uint16_t>( bs1a_64 );
-    auto const  bs4_64=   t1<N,uint32_t>( bs1a_64 );
-
-    auto const hs1_64=  std::hash<std::remove_cv_t<decltype(bs1_64)> >{}( bs1_64 );
-    auto const hs2_64=  std::hash<std::remove_cv_t<decltype(bs2_64)> >{}( bs2_64 );
-    auto const hs3_64=  std::hash<std::remove_cv_t<decltype(bs3_64)> >{}( bs3_64 );
-    auto const hs4_64=  std::hash<std::remove_cv_t<decltype(bs4_64)> >{}( bs4_64 );
-    assert( hs1_64 == hs2_64 );
-    assert( hs1_64 == hs3_64 );
-    assert( hs1_64 == hs4_64 );
-  } // for c
-} // test_hash
-
-
-
-int
-main()
-{
-  std::cout << "sizeof( bitset2<8>  )= " << sizeof( t1a<8>  ) << '\n';
-  std::cout << "sizeof( bitset2<16> )= " << sizeof( t1a<16> ) << '\n';
-  std::cout << "sizeof( bitset2<32> )= " << sizeof( t1a<32> ) << '\n';
-  std::cout << "sizeof( bitset2<64> )= " << sizeof( t1a<64> ) << '\n';
-  std::cout << "sizeof( bitset2<65> )= " << sizeof( t1a<65> ) << '\n';
-
-  TESTMNY(test_complement2)
-  TESTMNY(test_convert)
-  TESTMNY(test_add)
-  TESTMNY(test_compare)
-  TESTMNY(test_reverse)
-  TESTMNY(test_find)
-  TESTMNY(test_difference)
-  TESTMNY(test_any_all_none)
-  TESTMNY(test_set_count_size)
-  TESTMNY(test_set)
-  TESTMNY(test_not)
-  TESTMNY(test_bitwise_ops)
-  TESTMNY(test_shift)
-  TESTMNY(test_rotate)
-
-  TESTMANY(test_hash)
-} // main
-- 
GitLab