Changeset - r28572:dd3e6f760743
[Not reviewed]
master
0 1 0
Rubidium - 3 months ago 2024-01-26 17:12:24
rubidium@openttd.org
Update: nlohmann/json to 3.11.3
1 file changed with 1047 insertions and 878 deletions:
0 comments (0 inline, 0 general)
src/3rdparty/nlohmann/json.hpp
Show inline comments
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 
/****************************************************************************\
 
@@ -27,7 +27,6 @@
 
#endif  // JSON_NO_IO
 
#include <iterator> // random_access_iterator_tag
 
#include <memory> // unique_ptr
 
#include <numeric> // accumulate
 
#include <string> // string, stoi, to_string
 
#include <utility> // declval, forward, move, pair, swap
 
#include <vector> // vector
 
@@ -35,10 +34,10 @@
 
// #include <nlohmann/adl_serializer.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -48,10 +47,10 @@
 
// #include <nlohmann/detail/abi_macros.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -60,7 +59,7 @@
 

	
 
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
 
    #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
 
        #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2
 
        #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3
 
            #warning "Already included a different version of the library!"
 
        #endif
 
    #endif
 
@@ -68,7 +67,7 @@
 

	
 
#define NLOHMANN_JSON_VERSION_MAJOR 3   // NOLINT(modernize-macro-to-enum)
 
#define NLOHMANN_JSON_VERSION_MINOR 11  // NOLINT(modernize-macro-to-enum)
 
#define NLOHMANN_JSON_VERSION_PATCH 2   // NOLINT(modernize-macro-to-enum)
 
#define NLOHMANN_JSON_VERSION_PATCH 3   // NOLINT(modernize-macro-to-enum)
 

	
 
#ifndef JSON_DIAGNOSTICS
 
    #define JSON_DIAGNOSTICS 0
 
@@ -150,10 +149,10 @@
 
// #include <nlohmann/detail/conversions/from_json.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -173,16 +172,19 @@
 
// #include <nlohmann/detail/exceptions.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 

	
 
#include <cstddef> // nullptr_t
 
#include <exception> // exception
 
#if JSON_DIAGNOSTICS
 
    #include <numeric> // accumulate
 
#endif
 
#include <stdexcept> // runtime_error
 
#include <string> // to_string
 
#include <vector> // vector
 
@@ -190,10 +192,10 @@
 
// #include <nlohmann/detail/value_t.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -206,10 +208,10 @@
 
// #include <nlohmann/detail/macro_scope.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -218,10 +220,10 @@
 
// #include <nlohmann/detail/meta/detected.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -231,10 +233,10 @@
 
// #include <nlohmann/detail/meta/void_t.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -318,10 +320,10 @@ NLOHMANN_JSON_NAMESPACE_END
 

	
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson <evan@nemerson.com>
 
// SPDX-License-Identifier: MIT
 

	
 
@@ -2483,6 +2485,14 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 
    #endif
 
#endif
 

	
 
#ifndef JSON_HAS_STATIC_RTTI
 
    #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0
 
        #define JSON_HAS_STATIC_RTTI 1
 
    #else
 
        #define JSON_HAS_STATIC_RTTI 0
 
    #endif
 
#endif
 

	
 
#ifdef JSON_HAS_CPP_17
 
    #define JSON_INLINE_VARIABLE inline
 
#else
 
@@ -2590,12 +2600,13 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 
             class NumberUnsignedType, class NumberFloatType,              \
 
             template<typename> class AllocatorType,                       \
 
             template<typename, typename = void> class JSONSerializer,     \
 
             class BinaryType>
 
             class BinaryType,                                             \
 
             class CustomBaseClass>
 

	
 
#define NLOHMANN_BASIC_JSON_TPL                                            \
 
    basic_json<ObjectType, ArrayType, StringType, BooleanType,             \
 
    NumberIntegerType, NumberUnsignedType, NumberFloatType,                \
 
    AllocatorType, JSONSerializer, BinaryType>
 
    AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>
 

	
 
// Macros to simplify conversion from/to types
 

	
 
@@ -2745,7 +2756,10 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 

	
 
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...)  \
 
    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
 
    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
 
    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
 

	
 
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...)  \
 
    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
 

	
 
/*!
 
@brief macro
 
@@ -2756,10 +2770,12 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 
    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
 
    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
 

	
 
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...)  \
 
    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
 

	
 
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...)  \
 
    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
 
    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
 

	
 
    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
 

	
 
// inspired from https://stackoverflow.com/a/26745591
 
// allows to call any std function as if (e.g. with begin):
 
@@ -2923,10 +2939,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/string_escape.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -2998,10 +3014,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/position_t.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -3040,10 +3056,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/cpp_future.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-FileCopyrightText: 2018 The Abseil Authors
 
// SPDX-License-Identifier: MIT
 

	
 
@@ -3214,10 +3230,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/type_traits.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -3226,14 +3242,15 @@ NLOHMANN_JSON_NAMESPACE_END
 
#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
 
#include <utility> // declval
 
#include <tuple> // tuple
 
#include <string> // char_traits
 

	
 
// #include <nlohmann/detail/iterators/iterator_traits.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -3298,10 +3315,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/call_std/begin.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -3318,10 +3335,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/call_std/end.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -3342,10 +3359,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/json_fwd.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 
#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
 
@@ -3389,7 +3406,8 @@ NLOHMANN_JSON_NAMESPACE_END
 
    template<typename U> class AllocatorType = std::allocator,
 
    template<typename T, typename SFINAE = void> class JSONSerializer =
 
    adl_serializer,
 
    class BinaryType = std::vector<std::uint8_t>>
 
    class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError
 
    class CustomBaseClass = void>
 
    class basic_json;
 

	
 
    /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
 
@@ -3577,6 +3595,63 @@ struct actual_object_comparator
 
template<typename BasicJsonType>
 
using actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type;
 

	
 
/////////////////
 
// char_traits //
 
/////////////////
 

	
 
// Primary template of char_traits calls std char_traits
 
template<typename T>
 
struct char_traits : std::char_traits<T>
 
{};
 

	
 
// Explicitly define char traits for unsigned char since it is not standard
 
template<>
 
struct char_traits<unsigned char> : std::char_traits<char>
 
{
 
    using char_type = unsigned char;
 
    using int_type = uint64_t;
 

	
 
    // Redefine to_int_type function
 
    static int_type to_int_type(char_type c) noexcept
 
    {
 
        return static_cast<int_type>(c);
 
    }
 

	
 
    static char_type to_char_type(int_type i) noexcept
 
    {
 
        return static_cast<char_type>(i);
 
    }
 

	
 
    static constexpr int_type eof() noexcept
 
    {
 
        return static_cast<int_type>(EOF);
 
    }
 
};
 

	
 
// Explicitly define char traits for signed char since it is not standard
 
template<>
 
struct char_traits<signed char> : std::char_traits<char>
 
{
 
    using char_type = signed char;
 
    using int_type = uint64_t;
 

	
 
    // Redefine to_int_type function
 
    static int_type to_int_type(char_type c) noexcept
 
    {
 
        return static_cast<int_type>(c);
 
    }
 

	
 
    static char_type to_char_type(int_type i) noexcept
 
    {
 
        return static_cast<char_type>(i);
 
    }
 

	
 
    static constexpr int_type eof() noexcept
 
    {
 
        return static_cast<int_type>(EOF);
 
    }
 
};
 

	
 
///////////////////
 
// is_ functions //
 
///////////////////
 
@@ -3613,7 +3688,6 @@ template <typename... Ts>
 
struct is_default_constructible<const std::tuple<Ts...>>
 
            : conjunction<is_default_constructible<Ts>...> {};
 

	
 

	
 
template <typename T, typename... Args>
 
struct is_constructible : std::is_constructible<T, Args...> {};
 

	
 
@@ -3629,7 +3703,6 @@ struct is_constructible<std::tuple<Ts...
 
template <typename... Ts>
 
struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};
 

	
 

	
 
template<typename T, typename = void>
 
struct is_iterator_traits : std::false_type {};
 

	
 
@@ -4039,7 +4112,6 @@ struct value_in_range_of_impl2<OfType, T
 
    }
 
};
 

	
 

	
 
template<typename OfType, typename T>
 
struct value_in_range_of_impl2<OfType, T, true, true>
 
{
 
@@ -4138,10 +4210,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/string_concat.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -4165,28 +4237,28 @@ inline std::size_t concat_length()
 
}
 

	
 
template<typename... Args>
 
inline std::size_t concat_length(const char* cstr, Args&& ... rest);
 
inline std::size_t concat_length(const char* cstr, const Args& ... rest);
 

	
 
template<typename StringType, typename... Args>
 
inline std::size_t concat_length(const StringType& str, Args&& ... rest);
 
inline std::size_t concat_length(const StringType& str, const Args& ... rest);
 

	
 
template<typename... Args>
 
inline std::size_t concat_length(const char /*c*/, Args&& ... rest)
 
{
 
    return 1 + concat_length(std::forward<Args>(rest)...);
 
inline std::size_t concat_length(const char /*c*/, const Args& ... rest)
 
{
 
    return 1 + concat_length(rest...);
 
}
 

	
 
template<typename... Args>
 
inline std::size_t concat_length(const char* cstr, Args&& ... rest)
 
inline std::size_t concat_length(const char* cstr, const Args& ... rest)
 
{
 
    // cppcheck-suppress ignoredReturnValue
 
    return ::strlen(cstr) + concat_length(std::forward<Args>(rest)...);
 
    return ::strlen(cstr) + concat_length(rest...);
 
}
 

	
 
template<typename StringType, typename... Args>
 
inline std::size_t concat_length(const StringType& str, Args&& ... rest)
 
{
 
    return str.size() + concat_length(std::forward<Args>(rest)...);
 
inline std::size_t concat_length(const StringType& str, const Args& ... rest)
 
{
 
    return str.size() + concat_length(rest...);
 
}
 

	
 
template<typename OutStringType>
 
@@ -4277,7 +4349,7 @@ template<typename OutStringType = std::s
 
inline OutStringType concat(Args && ... args)
 
{
 
    OutStringType str;
 
    str.reserve(concat_length(std::forward<Args>(args)...));
 
    str.reserve(concat_length(args...));
 
    concat_into(str, std::forward<Args>(args)...);
 
    return str;
 
}
 
@@ -4286,7 +4358,6 @@ inline OutStringType concat(Args && ... 
 
NLOHMANN_JSON_NAMESPACE_END
 

	
 

	
 

	
 
NLOHMANN_JSON_NAMESPACE_BEGIN
 
namespace detail
 
{
 
@@ -4334,9 +4405,9 @@ class exception : public std::exception
 
            {
 
                case value_t::array:
 
                {
 
                    for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i)
 
                    {
 
                        if (&current->m_parent->m_value.array->operator[](i) == current)
 
                    for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i)
 
                    {
 
                        if (&current->m_parent->m_data.m_value.array->operator[](i) == current)
 
                        {
 
                            tokens.emplace_back(std::to_string(i));
 
                            break;
 
@@ -4347,7 +4418,7 @@ class exception : public std::exception
 

	
 
                case value_t::object:
 
                {
 
                    for (const auto& element : *current->m_parent->m_value.object)
 
                    for (const auto& element : *current->m_parent->m_data.m_value.object)
 
                    {
 
                        if (&element.second == current)
 
                        {
 
@@ -4410,17 +4481,17 @@ class parse_error : public exception
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("parse_error", id_), "parse error",
 
                               position_string(pos), ": ", exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("parse_error", id_), "parse error",
 
                                     position_string(pos), ": ", exception::diagnostics(context), what_arg);
 
        return {id_, pos.chars_read_total, w.c_str()};
 
    }
 

	
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("parse_error", id_), "parse error",
 
                               (byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
 
                               ": ", exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("parse_error", id_), "parse error",
 
                                     (byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
 
                                     ": ", exception::diagnostics(context), what_arg);
 
        return {id_, byte_, w.c_str()};
 
    }
 

	
 
@@ -4454,7 +4525,7 @@ class invalid_iterator : public exceptio
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
 
        return {id_, w.c_str()};
 
    }
 

	
 
@@ -4472,7 +4543,7 @@ class type_error : public exception
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
 
        return {id_, w.c_str()};
 
    }
 

	
 
@@ -4489,7 +4560,7 @@ class out_of_range : public exception
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
 
        return {id_, w.c_str()};
 
    }
 

	
 
@@ -4506,7 +4577,7 @@ class other_error : public exception
 
    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
 
    static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
 
    {
 
        std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
 
        const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
 
        return {id_, w.c_str()};
 
    }
 

	
 
@@ -4525,10 +4596,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/identity_tag.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -4549,10 +4620,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/std_fs.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -5055,10 +5126,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/conversions/to_json.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -5075,10 +5146,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -5147,10 +5218,10 @@ template<typename IteratorType> class it
 
    // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions
 
    iteration_proxy_value(iteration_proxy_value&&)
 
    noexcept(std::is_nothrow_move_constructible<IteratorType>::value
 
             && std::is_nothrow_move_constructible<string_type>::value) = default;
 
             && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
 
    iteration_proxy_value& operator=(iteration_proxy_value&&)
 
    noexcept(std::is_nothrow_move_assignable<IteratorType>::value
 
             && std::is_nothrow_move_assignable<string_type>::value) = default;
 
             && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
 
    ~iteration_proxy_value() = default;
 

	
 
    /// dereference operator (needed for range-based for)
 
@@ -5297,11 +5368,11 @@ namespace std
 
    #pragma clang diagnostic ignored "-Wmismatched-tags"
 
#endif
 
template<typename IteratorType>
 
class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>>
 
class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>> // NOLINT(cert-dcl58-cpp)
 
            : public std::integral_constant<std::size_t, 2> {};
 

	
 
template<std::size_t N, typename IteratorType>
 
class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>
 
class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >> // NOLINT(cert-dcl58-cpp)
 
{
 
  public:
 
    using type = decltype(
 
@@ -5340,7 +5411,7 @@ namespace detail
 

	
 
/*
 
 * Note all external_constructor<>::construct functions need to call
 
 * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an
 
 * j.m_data.m_value.destroy(j.m_data.m_type) to avoid a memory leak in case j contains an
 
 * allocated value (e.g., a string). See bug issue
 
 * https://github.com/nlohmann/json/issues/2865 for more information.
 
 */
 
@@ -5353,9 +5424,9 @@ struct external_constructor<value_t::boo
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::boolean;
 
        j.m_value = b;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::boolean;
 
        j.m_data.m_value = b;
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5366,18 +5437,18 @@ struct external_constructor<value_t::str
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::string;
 
        j.m_value = s;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::string;
 
        j.m_data.m_value = s;
 
        j.assert_invariant();
 
    }
 

	
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::string;
 
        j.m_value = std::move(s);
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::string;
 
        j.m_data.m_value = std::move(s);
 
        j.assert_invariant();
 
    }
 

	
 
@@ -5386,9 +5457,9 @@ struct external_constructor<value_t::str
 
                             int > = 0 >
 
    static void construct(BasicJsonType& j, const CompatibleStringType& str)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::string;
 
        j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::string;
 
        j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5399,18 +5470,18 @@ struct external_constructor<value_t::bin
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::binary;
 
        j.m_value = typename BasicJsonType::binary_t(b);
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::binary;
 
        j.m_data.m_value = typename BasicJsonType::binary_t(b);
 
        j.assert_invariant();
 
    }
 

	
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::binary;
 
        j.m_value = typename BasicJsonType::binary_t(std::move(b));
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::binary;
 
        j.m_data.m_value = typename BasicJsonType::binary_t(std::move(b));
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5421,9 +5492,9 @@ struct external_constructor<value_t::num
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::number_float;
 
        j.m_value = val;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::number_float;
 
        j.m_data.m_value = val;
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5434,9 +5505,9 @@ struct external_constructor<value_t::num
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::number_unsigned;
 
        j.m_value = val;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::number_unsigned;
 
        j.m_data.m_value = val;
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5447,9 +5518,9 @@ struct external_constructor<value_t::num
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::number_integer;
 
        j.m_value = val;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::number_integer;
 
        j.m_data.m_value = val;
 
        j.assert_invariant();
 
    }
 
};
 
@@ -5460,9 +5531,9 @@ struct external_constructor<value_t::arr
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::array;
 
        j.m_value = arr;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::array;
 
        j.m_data.m_value = arr;
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5470,9 +5541,9 @@ struct external_constructor<value_t::arr
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::array;
 
        j.m_value = std::move(arr);
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::array;
 
        j.m_data.m_value = std::move(arr);
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5485,9 +5556,9 @@ struct external_constructor<value_t::arr
 
        using std::begin;
 
        using std::end;
 

	
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::array;
 
        j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::array;
 
        j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5495,14 +5566,14 @@ struct external_constructor<value_t::arr
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, const std::vector<bool>& arr)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::array;
 
        j.m_value = value_t::array;
 
        j.m_value.array->reserve(arr.size());
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::array;
 
        j.m_data.m_value = value_t::array;
 
        j.m_data.m_value.array->reserve(arr.size());
 
        for (const bool x : arr)
 
        {
 
            j.m_value.array->push_back(x);
 
            j.set_parent(j.m_value.array->back());
 
            j.m_data.m_value.array->push_back(x);
 
            j.set_parent(j.m_data.m_value.array->back());
 
        }
 
        j.assert_invariant();
 
    }
 
@@ -5511,13 +5582,13 @@ struct external_constructor<value_t::arr
 
             enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
 
    static void construct(BasicJsonType& j, const std::valarray<T>& arr)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::array;
 
        j.m_value = value_t::array;
 
        j.m_value.array->resize(arr.size());
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::array;
 
        j.m_data.m_value = value_t::array;
 
        j.m_data.m_value.array->resize(arr.size());
 
        if (arr.size() > 0)
 
        {
 
            std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
 
            std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());
 
        }
 
        j.set_parents();
 
        j.assert_invariant();
 
@@ -5530,9 +5601,9 @@ struct external_constructor<value_t::obj
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::object;
 
        j.m_value = obj;
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::object;
 
        j.m_data.m_value = obj;
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5540,9 +5611,9 @@ struct external_constructor<value_t::obj
 
    template<typename BasicJsonType>
 
    static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
 
    {
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::object;
 
        j.m_value = std::move(obj);
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::object;
 
        j.m_data.m_value = std::move(obj);
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5554,9 +5625,9 @@ struct external_constructor<value_t::obj
 
        using std::begin;
 
        using std::end;
 

	
 
        j.m_value.destroy(j.m_type);
 
        j.m_type = value_t::object;
 
        j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
 
        j.m_data.m_value.destroy(j.m_data.m_type);
 
        j.m_data.m_type = value_t::object;
 
        j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
 
        j.set_parents();
 
        j.assert_invariant();
 
    }
 
@@ -5796,10 +5867,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/byte_container_with_subtype.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -5908,10 +5979,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/hash.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -6041,10 +6112,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/binary_reader.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -6067,10 +6138,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/input_adapters.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -6094,6 +6165,8 @@ NLOHMANN_JSON_NAMESPACE_END
 

	
 
// #include <nlohmann/detail/macro_scope.hpp>
 

	
 
// #include <nlohmann/detail/meta/type_traits.hpp>
 

	
 

	
 
NLOHMANN_JSON_NAMESPACE_BEGIN
 
namespace detail
 
@@ -6140,7 +6213,6 @@ class file_input_adapter
 
    std::FILE* m_file;
 
};
 

	
 

	
 
/*!
 
Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at
 
beginning of input. Does not support changing the underlying std::streambuf
 
@@ -6214,16 +6286,16 @@ class iterator_input_adapter
 
        : current(std::move(first)), end(std::move(last))
 
    {}
 

	
 
    typename std::char_traits<char_type>::int_type get_character()
 
    typename char_traits<char_type>::int_type get_character()
 
    {
 
        if (JSON_HEDLEY_LIKELY(current != end))
 
        {
 
            auto result = std::char_traits<char_type>::to_int_type(*current);
 
            auto result = char_traits<char_type>::to_int_type(*current);
 
            std::advance(current, 1);
 
            return result;
 
        }
 

	
 
        return std::char_traits<char_type>::eof();
 
        return char_traits<char_type>::eof();
 
    }
 

	
 
  private:
 
@@ -6239,7 +6311,6 @@ class iterator_input_adapter
 
    }
 
};
 

	
 

	
 
template<typename BaseInputAdapter, size_t T>
 
struct wide_string_input_helper;
 

	
 
@@ -6363,7 +6434,7 @@ struct wide_string_input_helper<BaseInpu
 
    }
 
};
 

	
 
// Wraps another input apdater to convert wide character types into individual bytes.
 
// Wraps another input adapter to convert wide character types into individual bytes.
 
template<typename BaseInputAdapter, typename WideCharType>
 
class wide_string_input_adapter
 
{
 
@@ -6408,7 +6479,6 @@ class wide_string_input_adapter
 
    std::size_t utf8_bytes_filled = 0;
 
};
 

	
 

	
 
template<typename IteratorType, typename Enable = void>
 
struct iterator_input_adapter_factory
 
{
 
@@ -6565,10 +6635,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/json_sax.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -6710,7 +6780,6 @@ struct json_sax
 
    virtual ~json_sax() = default;
 
};
 

	
 

	
 
namespace detail
 
{
 
/*!
 
@@ -6812,7 +6881,7 @@ class json_sax_dom_parser
 
        JSON_ASSERT(ref_stack.back()->is_object());
 

	
 
        // add null at given key and store the reference for later
 
        object_element = &(ref_stack.back()->m_value.object->operator[](val));
 
        object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
 
        return true;
 
    }
 

	
 
@@ -6887,8 +6956,8 @@ class json_sax_dom_parser
 

	
 
        if (ref_stack.back()->is_array())
 
        {
 
            ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));
 
            return &(ref_stack.back()->m_value.array->back());
 
            ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
 
            return &(ref_stack.back()->m_data.m_value.array->back());
 
        }
 

	
 
        JSON_ASSERT(ref_stack.back()->is_object());
 
@@ -7007,7 +7076,7 @@ class json_sax_dom_callback_parser
 
        // add discarded value at given key and store the reference for later
 
        if (keep && ref_stack.back())
 
        {
 
            object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded);
 
            object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
 
        }
 

	
 
        return true;
 
@@ -7092,7 +7161,7 @@ class json_sax_dom_callback_parser
 
        // remove discarded value
 
        if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
 
        {
 
            ref_stack.back()->m_value.array->pop_back();
 
            ref_stack.back()->m_data.m_value.array->pop_back();
 
        }
 

	
 
        return true;
 
@@ -7159,7 +7228,7 @@ class json_sax_dom_callback_parser
 
        if (ref_stack.empty())
 
        {
 
            root = std::move(value);
 
            return {true, &root};
 
            return {true, & root};
 
        }
 

	
 
        // skip this value if we already decided to skip the parent
 
@@ -7175,8 +7244,8 @@ class json_sax_dom_callback_parser
 
        // array
 
        if (ref_stack.back()->is_array())
 
        {
 
            ref_stack.back()->m_value.array->emplace_back(std::move(value));
 
            return {true, &(ref_stack.back()->m_value.array->back())};
 
            ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
 
            return {true, & (ref_stack.back()->m_data.m_value.array->back())};
 
        }
 

	
 
        // object
 
@@ -7298,10 +7367,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/lexer.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -7322,6 +7391,8 @@ NLOHMANN_JSON_NAMESPACE_END
 

	
 
// #include <nlohmann/detail/macro_scope.hpp>
 

	
 
// #include <nlohmann/detail/meta/type_traits.hpp>
 

	
 

	
 
NLOHMANN_JSON_NAMESPACE_BEGIN
 
namespace detail
 
@@ -7416,7 +7487,7 @@ class lexer : public lexer_base<BasicJso
 
    using number_float_t = typename BasicJsonType::number_float_t;
 
    using string_t = typename BasicJsonType::string_t;
 
    using char_type = typename InputAdapterType::char_type;
 
    using char_int_type = typename std::char_traits<char_type>::int_type;
 
    using char_int_type = typename char_traits<char_type>::int_type;
 

	
 
  public:
 
    using token_type = typename lexer_base<BasicJsonType>::token_type;
 
@@ -7523,7 +7594,7 @@ class lexer : public lexer_base<BasicJso
 
        for (auto range = ranges.begin(); range != ranges.end(); ++range)
 
        {
 
            get();
 
            if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range)))
 
            if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) // NOLINT(bugprone-inc-dec-in-conditions)
 
            {
 
                add(current);
 
            }
 
@@ -7566,7 +7637,7 @@ class lexer : public lexer_base<BasicJso
 
            switch (get())
 
            {
 
                // end of file while parsing string
 
                case std::char_traits<char_type>::eof():
 
                case char_traits<char_type>::eof():
 
                {
 
                    error_message = "invalid string: missing closing quote";
 
                    return token_type::parse_error;
 
@@ -8155,7 +8226,7 @@ class lexer : public lexer_base<BasicJso
 
                    {
 
                        case '\n':
 
                        case '\r':
 
                        case std::char_traits<char_type>::eof():
 
                        case char_traits<char_type>::eof():
 
                        case '\0':
 
                            return true;
 

	
 
@@ -8172,7 +8243,7 @@ class lexer : public lexer_base<BasicJso
 
                {
 
                    switch (get())
 
                    {
 
                        case std::char_traits<char_type>::eof():
 
                        case char_traits<char_type>::eof():
 
                        case '\0':
 
                        {
 
                            error_message = "invalid comment; missing closing '*/'";
 
@@ -8601,10 +8672,10 @@ scan_number_done:
 
    token_type scan_literal(const char_type* literal_text, const std::size_t length,
 
                            token_type return_type)
 
    {
 
        JSON_ASSERT(std::char_traits<char_type>::to_char_type(current) == literal_text[0]);
 
        JSON_ASSERT(char_traits<char_type>::to_char_type(current) == literal_text[0]);
 
        for (std::size_t i = 1; i < length; ++i)
 
        {
 
            if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i]))
 
            if (JSON_HEDLEY_UNLIKELY(char_traits<char_type>::to_char_type(get()) != literal_text[i]))
 
            {
 
                error_message = "invalid literal";
 
                return token_type::parse_error;
 
@@ -8622,7 +8693,7 @@ scan_number_done:
 
    {
 
        token_buffer.clear();
 
        token_string.clear();
 
        token_string.push_back(std::char_traits<char_type>::to_char_type(current));
 
        token_string.push_back(char_traits<char_type>::to_char_type(current));
 
    }
 

	
 
    /*
 
@@ -8630,7 +8701,7 @@ scan_number_done:
 

	
 
    This function provides the interface to the used input adapter. It does
 
    not throw in case the input reached EOF, but returns a
 
    `std::char_traits<char>::eof()` in that case.  Stores the scanned characters
 
    `char_traits<char>::eof()` in that case.  Stores the scanned characters
 
    for use in error messages.
 

	
 
    @return character read from the input
 
@@ -8650,9 +8721,9 @@ scan_number_done:
 
            current = ia.get_character();
 
        }
 

	
 
        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
 
        {
 
            token_string.push_back(std::char_traits<char_type>::to_char_type(current));
 
        if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof()))
 
        {
 
            token_string.push_back(char_traits<char_type>::to_char_type(current));
 
        }
 

	
 
        if (current == '\n')
 
@@ -8691,7 +8762,7 @@ scan_number_done:
 
            --position.chars_read_current_line;
 
        }
 

	
 
        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
 
        if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof()))
 
        {
 
            JSON_ASSERT(!token_string.empty());
 
            token_string.pop_back();
 
@@ -8885,7 +8956,7 @@ scan_number_done:
 
            // end of input (the null byte is needed when parsing from
 
            // string literals)
 
            case '\0':
 
            case std::char_traits<char_type>::eof():
 
            case char_traits<char_type>::eof():
 
                return token_type::end_of_input;
 

	
 
            // error
 
@@ -8903,7 +8974,7 @@ scan_number_done:
 
    const bool ignore_comments = false;
 

	
 
    /// the current character
 
    char_int_type current = std::char_traits<char_type>::eof();
 
    char_int_type current = char_traits<char_type>::eof();
 

	
 
    /// whether the next get() call should just return current
 
    bool next_unget = false;
 
@@ -8937,10 +9008,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/meta/is_sax.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -9129,7 +9200,6 @@ static inline bool little_endianness(int
 
    return *reinterpret_cast<char*>(&num) == 1;
 
}
 

	
 

	
 
///////////////////
 
// binary reader //
 
///////////////////
 
@@ -9147,7 +9217,7 @@ class binary_reader
 
    using binary_t = typename BasicJsonType::binary_t;
 
    using json_sax_t = SAX;
 
    using char_type = typename InputAdapterType::char_type;
 
    using char_int_type = typename std::char_traits<char_type>::int_type;
 
    using char_int_type = typename char_traits<char_type>::int_type;
 

	
 
  public:
 
    /*!
 
@@ -9220,7 +9290,7 @@ class binary_reader
 
                get();
 
            }
 

	
 
            if (JSON_HEDLEY_UNLIKELY(current != std::char_traits<char_type>::eof()))
 
            if (JSON_HEDLEY_UNLIKELY(current != char_traits<char_type>::eof()))
 
            {
 
                return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read,
 
                                        exception_message(input_format, concat("expected end of input; last byte: 0x", get_token_string()), "value"), nullptr));
 
@@ -9303,7 +9373,7 @@ class binary_reader
 
                                    exception_message(input_format_t::bson, concat("string length must be at least 1, is ", std::to_string(len)), "string"), nullptr));
 
        }
 

	
 
        return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != std::char_traits<char_type>::eof();
 
        return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != char_traits<char_type>::eof();
 
    }
 

	
 
    /*!
 
@@ -9404,7 +9474,7 @@ class binary_reader
 
            {
 
                std::array<char, 3> cr{{}};
 
                static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
 
                std::string cr_str{cr.data()};
 
                const std::string cr_str{cr.data()};
 
                return sax->parse_error(element_type_parse_position, cr_str,
 
                                        parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
 
            }
 
@@ -9497,7 +9567,7 @@ class binary_reader
 
        switch (get_char ? get() : current)
 
        {
 
            // EOF
 
            case std::char_traits<char_type>::eof():
 
            case char_traits<char_type>::eof():
 
                return unexpect_eof(input_format_t::cbor, "value");
 

	
 
            // Integer 0x00..0x17 (0..23)
 
@@ -10272,7 +10342,7 @@ class binary_reader
 
        switch (get())
 
        {
 
            // EOF
 
            case std::char_traits<char_type>::eof():
 
            case char_traits<char_type>::eof():
 
                return unexpect_eof(input_format_t::msgpack, "value");
 

	
 
            // positive fixint
 
@@ -11227,7 +11297,7 @@ class binary_reader
 
                }
 
                if (is_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array
 
                {
 
                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimentional vector is not allowed", "size"), nullptr));
 
                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimensional vector is not allowed", "size"), nullptr));
 
                }
 
                std::vector<size_t> dim;
 
                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim)))
 
@@ -11339,7 +11409,7 @@ class binary_reader
 
                                        exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
 
            }
 

	
 
            bool is_error = get_ubjson_size_value(result.first, is_ndarray);
 
            const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
 
            if (input_format == input_format_t::bjdata && is_ndarray)
 
            {
 
                if (inside_ndarray)
 
@@ -11354,7 +11424,7 @@ class binary_reader
 

	
 
        if (current == '#')
 
        {
 
            bool is_error = get_ubjson_size_value(result.first, is_ndarray);
 
            const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
 
            if (input_format == input_format_t::bjdata && is_ndarray)
 
            {
 
                return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
 
@@ -11374,7 +11444,7 @@ class binary_reader
 
    {
 
        switch (prefix)
 
        {
 
            case std::char_traits<char_type>::eof():  // EOF
 
            case char_traits<char_type>::eof():  // EOF
 
                return unexpect_eof(input_format, "value");
 

	
 
            case 'T':  // true
 
@@ -11819,7 +11889,7 @@ class binary_reader
 

	
 
    This function provides the interface to the used input adapter. It does
 
    not throw in case the input reached EOF, but returns a -'ve valued
 
    `std::char_traits<char_type>::eof()` in that case.
 
    `char_traits<char_type>::eof()` in that case.
 

	
 
    @return character read from the input
 
    */
 
@@ -11961,7 +12031,7 @@ class binary_reader
 
    JSON_HEDLEY_NON_NULL(3)
 
    bool unexpect_eof(const input_format_t format, const char* context) const
 
    {
 
        if (JSON_HEDLEY_UNLIKELY(current == std::char_traits<char_type>::eof()))
 
        if (JSON_HEDLEY_UNLIKELY(current == char_traits<char_type>::eof()))
 
        {
 
            return sax->parse_error(chars_read, "<end of file>",
 
                                    parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), nullptr));
 
@@ -12028,7 +12098,7 @@ class binary_reader
 
    InputAdapterType ia;
 

	
 
    /// the current character
 
    char_int_type current = std::char_traits<char_type>::eof();
 
    char_int_type current = char_traits<char_type>::eof();
 

	
 
    /// the number of characters read
 
    std::size_t chars_read = 0;
 
@@ -12090,10 +12160,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/input/parser.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -12439,13 +12509,25 @@ class parser
 
                                                m_lexer.get_token_string(),
 
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), nullptr));
 
                    }
 

	
 
                    case token_type::end_of_input:
 
                    {
 
                        if (JSON_HEDLEY_UNLIKELY(m_lexer.get_position().chars_read_total == 1))
 
                        {
 
                            return sax->parse_error(m_lexer.get_position(),
 
                                                    m_lexer.get_token_string(),
 
                                                    parse_error::create(101, m_lexer.get_position(),
 
                                                            "attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr));
 
                        }
 

	
 
                        return sax->parse_error(m_lexer.get_position(),
 
                                                m_lexer.get_token_string(),
 
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr));
 
                    }
 
                    case token_type::uninitialized:
 
                    case token_type::end_array:
 
                    case token_type::end_object:
 
                    case token_type::name_separator:
 
                    case token_type::value_separator:
 
                    case token_type::end_of_input:
 
                    case token_type::literal_or_value:
 
                    default: // the last token was unexpected
 
                    {
 
@@ -12607,10 +12689,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/iterators/internal_iterator.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -12620,10 +12702,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -12779,10 +12861,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/iterators/iter_impl.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -12887,7 +12969,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
@@ -12984,17 +13066,17 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                m_it.object_iterator = m_object->m_value.object->begin();
 
                m_it.object_iterator = m_object->m_data.m_value.object->begin();
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                m_it.array_iterator = m_object->m_value.array->begin();
 
                m_it.array_iterator = m_object->m_data.m_value.array->begin();
 
                break;
 
            }
 

	
 
@@ -13028,17 +13110,17 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                m_it.object_iterator = m_object->m_value.object->end();
 
                m_it.object_iterator = m_object->m_data.m_value.object->end();
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                m_it.array_iterator = m_object->m_value.array->end();
 
                m_it.array_iterator = m_object->m_data.m_value.array->end();
 
                break;
 
            }
 

	
 
@@ -13067,17 +13149,17 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());
 
                JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
 
                return m_it.object_iterator->second;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());
 
                JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
 
                return *m_it.array_iterator;
 
            }
 

	
 
@@ -13111,17 +13193,17 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());
 
                JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
 
                return &(m_it.object_iterator->second);
 
            }
 

	
 
            case value_t::array:
 
            {
 
                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());
 
                JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
 
                return &*m_it.array_iterator;
 
            }
 

	
 
@@ -13164,7 +13246,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
@@ -13215,7 +13297,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
@@ -13262,7 +13344,7 @@ class iter_impl // NOLINT(cppcoreguideli
 

	
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
                return (m_it.object_iterator == other.m_it.object_iterator);
 
@@ -13307,7 +13389,7 @@ class iter_impl // NOLINT(cppcoreguideli
 

	
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
                JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object));
 
@@ -13363,7 +13445,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
                JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
 
@@ -13442,7 +13524,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
                JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
 
@@ -13471,7 +13553,7 @@ class iter_impl // NOLINT(cppcoreguideli
 
    {
 
        JSON_ASSERT(m_object != nullptr);
 

	
 
        switch (m_object->m_type)
 
        switch (m_object->m_data.m_type)
 
        {
 
            case value_t::object:
 
                JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object));
 
@@ -13541,10 +13623,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -13673,13 +13755,55 @@ NLOHMANN_JSON_NAMESPACE_END
 

	
 
// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
 

	
 
// #include <nlohmann/detail/json_custom_base_class.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 

	
 
#include <type_traits> // conditional, is_same
 

	
 
// #include <nlohmann/detail/abi_macros.hpp>
 

	
 

	
 
NLOHMANN_JSON_NAMESPACE_BEGIN
 
namespace detail
 
{
 

	
 
/*!
 
@brief Default base class of the @ref basic_json class.
 

	
 
So that the correct implementations of the copy / move ctors / assign operators
 
of @ref basic_json do not require complex case distinctions
 
(no base class / custom base class used as customization point),
 
@ref basic_json always has a base class.
 
By default, this class is used because it is empty and thus has no effect
 
on the behavior of @ref basic_json.
 
*/
 
struct json_default_base {};
 

	
 
template<class T>
 
using json_base_class = typename std::conditional <
 
                        std::is_same<T, void>::value,
 
                        json_default_base,
 
                        T
 
                        >::type;
 

	
 
}  // namespace detail
 
NLOHMANN_JSON_NAMESPACE_END
 

	
 
// #include <nlohmann/detail/json_pointer.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -13911,7 +14035,7 @@ class json_pointer
 
        const char* p = s.c_str();
 
        char* p_end = nullptr;
 
        errno = 0; // strtoull doesn't reset errno
 
        unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
 
        const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
 
        if (p == p_end // invalid input or empty string
 
                || errno == ERANGE // out of range
 
                || JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
 
@@ -14067,7 +14191,7 @@ class json_pointer
 
                    if (reference_token == "-")
 
                    {
 
                        // explicitly treat "-" as index beyond the end
 
                        ptr = &ptr->operator[](ptr->m_value.array->size());
 
                        ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
 
                    }
 
                    else
 
                    {
 
@@ -14119,7 +14243,7 @@ class json_pointer
 
                    {
 
                        // "-" always fails the range check
 
                        JSON_THROW(detail::out_of_range::create(402, detail::concat(
 
                                "array index '-' (", std::to_string(ptr->m_value.array->size()),
 
                                "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
 
                                ") is out of range"), ptr));
 
                    }
 

	
 
@@ -14176,7 +14300,7 @@ class json_pointer
 
                    if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
 
                    {
 
                        // "-" cannot be used for const access
 
                        JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_value.array->size()), ") is out of range"), ptr));
 
                        JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), ") is out of range"), ptr));
 
                    }
 

	
 
                    // use unchecked array access
 
@@ -14226,7 +14350,7 @@ class json_pointer
 
                    {
 
                        // "-" always fails the range check
 
                        JSON_THROW(detail::out_of_range::create(402, detail::concat(
 
                                "array index '-' (", std::to_string(ptr->m_value.array->size()),
 
                                "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
 
                                ") is out of range"), ptr));
 
                    }
 

	
 
@@ -14421,7 +14545,7 @@ class json_pointer
 
        {
 
            case detail::value_t::array:
 
            {
 
                if (value.m_value.array->empty())
 
                if (value.m_data.m_value.array->empty())
 
                {
 
                    // flatten empty array as null
 
                    result[reference_string] = nullptr;
 
@@ -14429,10 +14553,10 @@ class json_pointer
 
                else
 
                {
 
                    // iterate array and use index as reference string
 
                    for (std::size_t i = 0; i < value.m_value.array->size(); ++i)
 
                    for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i)
 
                    {
 
                        flatten(detail::concat(reference_string, '/', std::to_string(i)),
 
                                value.m_value.array->operator[](i), result);
 
                                value.m_data.m_value.array->operator[](i), result);
 
                    }
 
                }
 
                break;
 
@@ -14440,7 +14564,7 @@ class json_pointer
 

	
 
            case detail::value_t::object:
 
            {
 
                if (value.m_value.object->empty())
 
                if (value.m_data.m_value.object->empty())
 
                {
 
                    // flatten empty object as null
 
                    result[reference_string] = nullptr;
 
@@ -14448,7 +14572,7 @@ class json_pointer
 
                else
 
                {
 
                    // iterate object and use keys as reference string
 
                    for (const auto& element : *value.m_value.object)
 
                    for (const auto& element : *value.m_data.m_value.object)
 
                    {
 
                        flatten(detail::concat(reference_string, '/', detail::escape(element.first)), element.second, result);
 
                    }
 
@@ -14495,7 +14619,7 @@ class json_pointer
 
        BasicJsonType result;
 

	
 
        // iterate the JSON object values
 
        for (const auto& element : *value.m_value.object)
 
        for (const auto& element : *value.m_data.m_value.object)
 
        {
 
            if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))
 
            {
 
@@ -14671,10 +14795,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/json_ref.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -14763,10 +14887,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/output/binary_writer.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -14789,10 +14913,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/output/output_adapters.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -14978,7 +15102,7 @@ class binary_writer
 
        {
 
            case value_t::object:
 
            {
 
                write_bson_object(*j.m_value.object);
 
                write_bson_object(*j.m_data.m_value.object);
 
                break;
 
            }
 

	
 
@@ -15013,7 +15137,7 @@ class binary_writer
 

	
 
            case value_t::boolean:
 
            {
 
                oa->write_character(j.m_value.boolean
 
                oa->write_character(j.m_data.m_value.boolean
 
                                    ? to_char_type(0xF5)
 
                                    : to_char_type(0xF4));
 
                break;
 
@@ -15021,42 +15145,42 @@ class binary_writer
 

	
 
            case value_t::number_integer:
 
            {
 
                if (j.m_value.number_integer >= 0)
 
                if (j.m_data.m_value.number_integer >= 0)
 
                {
 
                    // CBOR does not differentiate between positive signed
 
                    // integers and unsigned integers. Therefore, we used the
 
                    // code from the value_t::number_unsigned case here.
 
                    if (j.m_value.number_integer <= 0x17)
 
                    {
 
                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
 
                    if (j.m_data.m_value.number_integer <= 0x17)
 
                    {
 
                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
 
                    {
 
                        oa->write_character(to_char_type(0x18));
 
                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())
 
                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())
 
                    {
 
                        oa->write_character(to_char_type(0x19));
 
                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())
 
                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())
 
                    {
 
                        oa->write_character(to_char_type(0x1A));
 
                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
 
                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else
 
                    {
 
                        oa->write_character(to_char_type(0x1B));
 
                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
 
                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
 
                    }
 
                }
 
                else
 
                {
 
                    // The conversions below encode the sign in the first
 
                    // byte, and the value is converted to a positive number.
 
                    const auto positive_number = -1 - j.m_value.number_integer;
 
                    if (j.m_value.number_integer >= -24)
 
                    const auto positive_number = -1 - j.m_data.m_value.number_integer;
 
                    if (j.m_data.m_value.number_integer >= -24)
 
                    {
 
                        write_number(static_cast<std::uint8_t>(0x20 + positive_number));
 
                    }
 
@@ -15086,52 +15210,52 @@ class binary_writer
 

	
 
            case value_t::number_unsigned:
 
            {
 
                if (j.m_value.number_unsigned <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                if (j.m_data.m_value.number_unsigned <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                {
 
                    oa->write_character(to_char_type(0x18));
 
                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                {
 
                    oa->write_character(to_char_type(0x19));
 
                    write_number(static_cast<std::uint16_t>(j.m_value.number_unsigned));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                    write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_unsigned));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                {
 
                    oa->write_character(to_char_type(0x1A));
 
                    write_number(static_cast<std::uint32_t>(j.m_value.number_unsigned));
 
                    write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_unsigned));
 
                }
 
                else
 
                {
 
                    oa->write_character(to_char_type(0x1B));
 
                    write_number(static_cast<std::uint64_t>(j.m_value.number_unsigned));
 
                    write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_unsigned));
 
                }
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                if (std::isnan(j.m_value.number_float))
 
                if (std::isnan(j.m_data.m_value.number_float))
 
                {
 
                    // NaN is 0xf97e00 in CBOR
 
                    oa->write_character(to_char_type(0xF9));
 
                    oa->write_character(to_char_type(0x7E));
 
                    oa->write_character(to_char_type(0x00));
 
                }
 
                else if (std::isinf(j.m_value.number_float))
 
                else if (std::isinf(j.m_data.m_value.number_float))
 
                {
 
                    // Infinity is 0xf97c00, -Infinity is 0xf9fc00
 
                    oa->write_character(to_char_type(0xf9));
 
                    oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
 
                    oa->write_character(j.m_data.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
 
                    oa->write_character(to_char_type(0x00));
 
                }
 
                else
 
                {
 
                    write_compact_float(j.m_value.number_float, detail::input_format_t::cbor);
 
                    write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::cbor);
 
                }
 
                break;
 
            }
 
@@ -15139,7 +15263,7 @@ class binary_writer
 
            case value_t::string:
 
            {
 
                // step 1: write control byte and the string length
 
                const auto N = j.m_value.string->size();
 
                const auto N = j.m_data.m_value.string->size();
 
                if (N <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(0x60 + N));
 
@@ -15169,15 +15293,15 @@ class binary_writer
 

	
 
                // step 2: write the string
 
                oa->write_characters(
 
                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
 
                    j.m_value.string->size());
 
                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
 
                    j.m_data.m_value.string->size());
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                // step 1: write control byte and the array size
 
                const auto N = j.m_value.array->size();
 
                const auto N = j.m_data.m_value.array->size();
 
                if (N <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(0x80 + N));
 
@@ -15206,7 +15330,7 @@ class binary_writer
 
                // LCOV_EXCL_STOP
 

	
 
                // step 2: write each element
 
                for (const auto& el : *j.m_value.array)
 
                for (const auto& el : *j.m_data.m_value.array)
 
                {
 
                    write_cbor(el);
 
                }
 
@@ -15215,32 +15339,32 @@ class binary_writer
 

	
 
            case value_t::binary:
 
            {
 
                if (j.m_value.binary->has_subtype())
 
                {
 
                    if (j.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)())
 
                if (j.m_data.m_value.binary->has_subtype())
 
                {
 
                    if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)())
 
                    {
 
                        write_number(static_cast<std::uint8_t>(0xd8));
 
                        write_number(static_cast<std::uint8_t>(j.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)())
 
                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)())
 
                    {
 
                        write_number(static_cast<std::uint8_t>(0xd9));
 
                        write_number(static_cast<std::uint16_t>(j.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)())
 
                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)())
 
                    {
 
                        write_number(static_cast<std::uint8_t>(0xda));
 
                        write_number(static_cast<std::uint32_t>(j.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)())
 
                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.binary->subtype()));
 
                    }
 
                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)())
 
                    {
 
                        write_number(static_cast<std::uint8_t>(0xdb));
 
                        write_number(static_cast<std::uint64_t>(j.m_value.binary->subtype()));
 
                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.binary->subtype()));
 
                    }
 
                }
 

	
 
                // step 1: write control byte and the binary array size
 
                const auto N = j.m_value.binary->size();
 
                const auto N = j.m_data.m_value.binary->size();
 
                if (N <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(0x40 + N));
 
@@ -15270,7 +15394,7 @@ class binary_writer
 

	
 
                // step 2: write each element
 
                oa->write_characters(
 
                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),
 
                    reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
 
                    N);
 

	
 
                break;
 
@@ -15279,7 +15403,7 @@ class binary_writer
 
            case value_t::object:
 
            {
 
                // step 1: write control byte and the object size
 
                const auto N = j.m_value.object->size();
 
                const auto N = j.m_data.m_value.object->size();
 
                if (N <= 0x17)
 
                {
 
                    write_number(static_cast<std::uint8_t>(0xA0 + N));
 
@@ -15308,7 +15432,7 @@ class binary_writer
 
                // LCOV_EXCL_STOP
 

	
 
                // step 2: write each element
 
                for (const auto& el : *j.m_value.object)
 
                for (const auto& el : *j.m_data.m_value.object)
 
                {
 
                    write_cbor(el.first);
 
                    write_cbor(el.second);
 
@@ -15337,7 +15461,7 @@ class binary_writer
 

	
 
            case value_t::boolean: // true and false
 
            {
 
                oa->write_character(j.m_value.boolean
 
                oa->write_character(j.m_data.m_value.boolean
 
                                    ? to_char_type(0xC3)
 
                                    : to_char_type(0xC2));
 
                break;
 
@@ -15345,75 +15469,75 @@ class binary_writer
 

	
 
            case value_t::number_integer:
 
            {
 
                if (j.m_value.number_integer >= 0)
 
                if (j.m_data.m_value.number_integer >= 0)
 
                {
 
                    // MessagePack does not differentiate between positive
 
                    // signed integers and unsigned integers. Therefore, we used
 
                    // the code from the value_t::number_unsigned case here.
 
                    if (j.m_value.number_unsigned < 128)
 
                    if (j.m_data.m_value.number_unsigned < 128)
 
                    {
 
                        // positive fixnum
 
                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                    {
 
                        // uint 8
 
                        oa->write_character(to_char_type(0xCC));
 
                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                    {
 
                        // uint 16
 
                        oa->write_character(to_char_type(0xCD));
 
                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                    {
 
                        // uint 32
 
                        oa->write_character(to_char_type(0xCE));
 
                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                    {
 
                        // uint 64
 
                        oa->write_character(to_char_type(0xCF));
 
                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
 
                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
 
                    }
 
                }
 
                else
 
                {
 
                    if (j.m_value.number_integer >= -32)
 
                    if (j.m_data.m_value.number_integer >= -32)
 
                    {
 
                        // negative fixnum
 
                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
 
                             j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
 
                        write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
 
                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
 
                    {
 
                        // int 8
 
                        oa->write_character(to_char_type(0xD0));
 
                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
 
                             j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
 
                        write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
 
                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
 
                    {
 
                        // int 16
 
                        oa->write_character(to_char_type(0xD1));
 
                        write_number(static_cast<std::int16_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
 
                             j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
 
                        write_number(static_cast<std::int16_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
 
                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
 
                    {
 
                        // int 32
 
                        oa->write_character(to_char_type(0xD2));
 
                        write_number(static_cast<std::int32_t>(j.m_value.number_integer));
 
                    }
 
                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
 
                             j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
 
                        write_number(static_cast<std::int32_t>(j.m_data.m_value.number_integer));
 
                    }
 
                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
 
                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
 
                    {
 
                        // int 64
 
                        oa->write_character(to_char_type(0xD3));
 
                        write_number(static_cast<std::int64_t>(j.m_value.number_integer));
 
                        write_number(static_cast<std::int64_t>(j.m_data.m_value.number_integer));
 
                    }
 
                }
 
                break;
 
@@ -15421,48 +15545,48 @@ class binary_writer
 

	
 
            case value_t::number_unsigned:
 
            {
 
                if (j.m_value.number_unsigned < 128)
 
                if (j.m_data.m_value.number_unsigned < 128)
 
                {
 
                    // positive fixnum
 
                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
 
                {
 
                    // uint 8
 
                    oa->write_character(to_char_type(0xCC));
 
                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
 
                {
 
                    // uint 16
 
                    oa->write_character(to_char_type(0xCD));
 
                    write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                    write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
 
                {
 
                    // uint 32
 
                    oa->write_character(to_char_type(0xCE));
 
                    write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
 
                }
 
                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                    write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
 
                }
 
                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                {
 
                    // uint 64
 
                    oa->write_character(to_char_type(0xCF));
 
                    write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
 
                    write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
 
                }
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack);
 
                write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::msgpack);
 
                break;
 
            }
 

	
 
            case value_t::string:
 
            {
 
                // step 1: write control byte and the string length
 
                const auto N = j.m_value.string->size();
 
                const auto N = j.m_data.m_value.string->size();
 
                if (N <= 31)
 
                {
 
                    // fixstr
 
@@ -15489,15 +15613,15 @@ class binary_writer
 

	
 
                // step 2: write the string
 
                oa->write_characters(
 
                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
 
                    j.m_value.string->size());
 
                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
 
                    j.m_data.m_value.string->size());
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                // step 1: write control byte and the array size
 
                const auto N = j.m_value.array->size();
 
                const auto N = j.m_data.m_value.array->size();
 
                if (N <= 15)
 
                {
 
                    // fixarray
 
@@ -15517,7 +15641,7 @@ class binary_writer
 
                }
 

	
 
                // step 2: write each element
 
                for (const auto& el : *j.m_value.array)
 
                for (const auto& el : *j.m_data.m_value.array)
 
                {
 
                    write_msgpack(el);
 
                }
 
@@ -15528,10 +15652,10 @@ class binary_writer
 
            {
 
                // step 0: determine if the binary type has a set subtype to
 
                // determine whether or not to use the ext or fixext types
 
                const bool use_ext = j.m_value.binary->has_subtype();
 
                const bool use_ext = j.m_data.m_value.binary->has_subtype();
 

	
 
                // step 1: write control byte and the byte string length
 
                const auto N = j.m_value.binary->size();
 
                const auto N = j.m_data.m_value.binary->size();
 
                if (N <= (std::numeric_limits<std::uint8_t>::max)())
 
                {
 
                    std::uint8_t output_type{};
 
@@ -15576,18 +15700,18 @@ class binary_writer
 
                }
 
                else if (N <= (std::numeric_limits<std::uint16_t>::max)())
 
                {
 
                    std::uint8_t output_type = use_ext
 
                                               ? 0xC8 // ext 16
 
                                               : 0xC5; // bin 16
 
                    const std::uint8_t output_type = use_ext
 
                                                     ? 0xC8 // ext 16
 
                                                     : 0xC5; // bin 16
 

	
 
                    oa->write_character(to_char_type(output_type));
 
                    write_number(static_cast<std::uint16_t>(N));
 
                }
 
                else if (N <= (std::numeric_limits<std::uint32_t>::max)())
 
                {
 
                    std::uint8_t output_type = use_ext
 
                                               ? 0xC9 // ext 32
 
                                               : 0xC6; // bin 32
 
                    const std::uint8_t output_type = use_ext
 
                                                     ? 0xC9 // ext 32
 
                                                     : 0xC6; // bin 32
 

	
 
                    oa->write_character(to_char_type(output_type));
 
                    write_number(static_cast<std::uint32_t>(N));
 
@@ -15596,12 +15720,12 @@ class binary_writer
 
                // step 1.5: if this is an ext type, write the subtype
 
                if (use_ext)
 
                {
 
                    write_number(static_cast<std::int8_t>(j.m_value.binary->subtype()));
 
                    write_number(static_cast<std::int8_t>(j.m_data.m_value.binary->subtype()));
 
                }
 

	
 
                // step 2: write the byte string
 
                oa->write_characters(
 
                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),
 
                    reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
 
                    N);
 

	
 
                break;
 
@@ -15610,7 +15734,7 @@ class binary_writer
 
            case value_t::object:
 
            {
 
                // step 1: write control byte and the object size
 
                const auto N = j.m_value.object->size();
 
                const auto N = j.m_data.m_value.object->size();
 
                if (N <= 15)
 
                {
 
                    // fixmap
 
@@ -15630,7 +15754,7 @@ class binary_writer
 
                }
 

	
 
                // step 2: write each element
 
                for (const auto& el : *j.m_value.object)
 
                for (const auto& el : *j.m_data.m_value.object)
 
                {
 
                    write_msgpack(el.first);
 
                    write_msgpack(el.second);
 
@@ -15670,7 +15794,7 @@ class binary_writer
 
            {
 
                if (add_prefix)
 
                {
 
                    oa->write_character(j.m_value.boolean
 
                    oa->write_character(j.m_data.m_value.boolean
 
                                        ? to_char_type('T')
 
                                        : to_char_type('F'));
 
                }
 
@@ -15679,19 +15803,19 @@ class binary_writer
 

	
 
            case value_t::number_integer:
 
            {
 
                write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix, use_bjdata);
 
                write_number_with_ubjson_prefix(j.m_data.m_value.number_integer, add_prefix, use_bjdata);
 
                break;
 
            }
 

	
 
            case value_t::number_unsigned:
 
            {
 
                write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix, use_bjdata);
 
                write_number_with_ubjson_prefix(j.m_data.m_value.number_unsigned, add_prefix, use_bjdata);
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix, use_bjdata);
 
                write_number_with_ubjson_prefix(j.m_data.m_value.number_float, add_prefix, use_bjdata);
 
                break;
 
            }
 

	
 
@@ -15701,10 +15825,10 @@ class binary_writer
 
                {
 
                    oa->write_character(to_char_type('S'));
 
                }
 
                write_number_with_ubjson_prefix(j.m_value.string->size(), true, use_bjdata);
 
                write_number_with_ubjson_prefix(j.m_data.m_value.string->size(), true, use_bjdata);
 
                oa->write_characters(
 
                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
 
                    j.m_value.string->size());
 
                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
 
                    j.m_data.m_value.string->size());
 
                break;
 
            }
 

	
 
@@ -15716,7 +15840,7 @@ class binary_writer
 
                }
 

	
 
                bool prefix_required = true;
 
                if (use_type && !j.m_value.array->empty())
 
                if (use_type && !j.m_data.m_value.array->empty())
 
                {
 
                    JSON_ASSERT(use_count);
 
                    const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
 
@@ -15739,10 +15863,10 @@ class binary_writer
 
                if (use_count)
 
                {
 
                    oa->write_character(to_char_type('#'));
 
                    write_number_with_ubjson_prefix(j.m_value.array->size(), true, use_bjdata);
 
                }
 

	
 
                for (const auto& el : *j.m_value.array)
 
                    write_number_with_ubjson_prefix(j.m_data.m_value.array->size(), true, use_bjdata);
 
                }
 

	
 
                for (const auto& el : *j.m_data.m_value.array)
 
                {
 
                    write_ubjson(el, use_count, use_type, prefix_required, use_bjdata);
 
                }
 
@@ -15762,7 +15886,7 @@ class binary_writer
 
                    oa->write_character(to_char_type('['));
 
                }
 

	
 
                if (use_type && !j.m_value.binary->empty())
 
                if (use_type && !j.m_data.m_value.binary->empty())
 
                {
 
                    JSON_ASSERT(use_count);
 
                    oa->write_character(to_char_type('$'));
 
@@ -15772,21 +15896,21 @@ class binary_writer
 
                if (use_count)
 
                {
 
                    oa->write_character(to_char_type('#'));
 
                    write_number_with_ubjson_prefix(j.m_value.binary->size(), true, use_bjdata);
 
                    write_number_with_ubjson_prefix(j.m_data.m_value.binary->size(), true, use_bjdata);
 
                }
 

	
 
                if (use_type)
 
                {
 
                    oa->write_characters(
 
                        reinterpret_cast<const CharType*>(j.m_value.binary->data()),
 
                        j.m_value.binary->size());
 
                        reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
 
                        j.m_data.m_value.binary->size());
 
                }
 
                else
 
                {
 
                    for (size_t i = 0; i < j.m_value.binary->size(); ++i)
 
                    for (size_t i = 0; i < j.m_data.m_value.binary->size(); ++i)
 
                    {
 
                        oa->write_character(to_char_type('U'));
 
                        oa->write_character(j.m_value.binary->data()[i]);
 
                        oa->write_character(j.m_data.m_value.binary->data()[i]);
 
                    }
 
                }
 

	
 
@@ -15800,9 +15924,9 @@ class binary_writer
 

	
 
            case value_t::object:
 
            {
 
                if (use_bjdata && j.m_value.object->size() == 3 && j.m_value.object->find("_ArrayType_") != j.m_value.object->end() && j.m_value.object->find("_ArraySize_") != j.m_value.object->end() && j.m_value.object->find("_ArrayData_") != j.m_value.object->end())
 
                {
 
                    if (!write_bjdata_ndarray(*j.m_value.object, use_count, use_type))  // decode bjdata ndarray in the JData format (https://github.com/NeuroJSON/jdata)
 
                if (use_bjdata && j.m_data.m_value.object->size() == 3 && j.m_data.m_value.object->find("_ArrayType_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArraySize_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArrayData_") != j.m_data.m_value.object->end())
 
                {
 
                    if (!write_bjdata_ndarray(*j.m_data.m_value.object, use_count, use_type))  // decode bjdata ndarray in the JData format (https://github.com/NeuroJSON/jdata)
 
                    {
 
                        break;
 
                    }
 
@@ -15814,7 +15938,7 @@ class binary_writer
 
                }
 

	
 
                bool prefix_required = true;
 
                if (use_type && !j.m_value.object->empty())
 
                if (use_type && !j.m_data.m_value.object->empty())
 
                {
 
                    JSON_ASSERT(use_count);
 
                    const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
 
@@ -15837,10 +15961,10 @@ class binary_writer
 
                if (use_count)
 
                {
 
                    oa->write_character(to_char_type('#'));
 
                    write_number_with_ubjson_prefix(j.m_value.object->size(), true, use_bjdata);
 
                }
 

	
 
                for (const auto& el : *j.m_value.object)
 
                    write_number_with_ubjson_prefix(j.m_data.m_value.object->size(), true, use_bjdata);
 
                }
 

	
 
                for (const auto& el : *j.m_data.m_value.object)
 
                {
 
                    write_number_with_ubjson_prefix(el.first.size(), true, use_bjdata);
 
                    oa->write_characters(
 
@@ -15990,19 +16114,19 @@ class binary_writer
 
    void write_bson_unsigned(const string_t& name,
 
                             const BasicJsonType& j)
 
    {
 
        if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
 
        if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
 
        {
 
            write_bson_entry_header(name, 0x10 /* int32 */);
 
            write_number<std::int32_t>(static_cast<std::int32_t>(j.m_value.number_unsigned), true);
 
        }
 
        else if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
 
            write_number<std::int32_t>(static_cast<std::int32_t>(j.m_data.m_value.number_unsigned), true);
 
        }
 
        else if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
 
        {
 
            write_bson_entry_header(name, 0x12 /* int64 */);
 
            write_number<std::int64_t>(static_cast<std::int64_t>(j.m_value.number_unsigned), true);
 
            write_number<std::int64_t>(static_cast<std::int64_t>(j.m_data.m_value.number_unsigned), true);
 
        }
 
        else
 
        {
 
            JSON_THROW(out_of_range::create(407, concat("integer number ", std::to_string(j.m_value.number_unsigned), " cannot be represented by BSON as it does not fit int64"), &j));
 
            JSON_THROW(out_of_range::create(407, concat("integer number ", std::to_string(j.m_data.m_value.number_unsigned), " cannot be represented by BSON as it does not fit int64"), &j));
 
        }
 
    }
 

	
 
@@ -16083,13 +16207,13 @@ class binary_writer
 
        switch (j.type())
 
        {
 
            case value_t::object:
 
                return header_size + calc_bson_object_size(*j.m_value.object);
 
                return header_size + calc_bson_object_size(*j.m_data.m_value.object);
 

	
 
            case value_t::array:
 
                return header_size + calc_bson_array_size(*j.m_value.array);
 
                return header_size + calc_bson_array_size(*j.m_data.m_value.array);
 

	
 
            case value_t::binary:
 
                return header_size + calc_bson_binary_size(*j.m_value.binary);
 
                return header_size + calc_bson_binary_size(*j.m_data.m_value.binary);
 

	
 
            case value_t::boolean:
 
                return header_size + 1ul;
 
@@ -16098,13 +16222,13 @@ class binary_writer
 
                return header_size + 8ul;
 

	
 
            case value_t::number_integer:
 
                return header_size + calc_bson_integer_size(j.m_value.number_integer);
 
                return header_size + calc_bson_integer_size(j.m_data.m_value.number_integer);
 

	
 
            case value_t::number_unsigned:
 
                return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned);
 
                return header_size + calc_bson_unsigned_size(j.m_data.m_value.number_unsigned);
 

	
 
            case value_t::string:
 
                return header_size + calc_bson_string_size(*j.m_value.string);
 
                return header_size + calc_bson_string_size(*j.m_data.m_value.string);
 

	
 
            case value_t::null:
 
                return header_size + 0ul;
 
@@ -16130,28 +16254,28 @@ class binary_writer
 
        switch (j.type())
 
        {
 
            case value_t::object:
 
                return write_bson_object_entry(name, *j.m_value.object);
 
                return write_bson_object_entry(name, *j.m_data.m_value.object);
 

	
 
            case value_t::array:
 
                return write_bson_array(name, *j.m_value.array);
 
                return write_bson_array(name, *j.m_data.m_value.array);
 

	
 
            case value_t::binary:
 
                return write_bson_binary(name, *j.m_value.binary);
 
                return write_bson_binary(name, *j.m_data.m_value.binary);
 

	
 
            case value_t::boolean:
 
                return write_bson_boolean(name, j.m_value.boolean);
 
                return write_bson_boolean(name, j.m_data.m_value.boolean);
 

	
 
            case value_t::number_float:
 
                return write_bson_double(name, j.m_value.number_float);
 
                return write_bson_double(name, j.m_data.m_value.number_float);
 

	
 
            case value_t::number_integer:
 
                return write_bson_integer(name, j.m_value.number_integer);
 
                return write_bson_integer(name, j.m_data.m_value.number_integer);
 

	
 
            case value_t::number_unsigned:
 
                return write_bson_unsigned(name, j);
 

	
 
            case value_t::string:
 
                return write_bson_string(name, *j.m_value.string);
 
                return write_bson_string(name, *j.m_data.m_value.string);
 

	
 
            case value_t::null:
 
                return write_bson_null(name);
 
@@ -16173,8 +16297,8 @@ class binary_writer
 
    */
 
    static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
 
    {
 
        std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
 
                                    [](size_t result, const typename BasicJsonType::object_t::value_type & el)
 
        const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
 
                                          [](size_t result, const typename BasicJsonType::object_t::value_type & el)
 
        {
 
            return result += calc_bson_element_size(el.first, el.second);
 
        });
 
@@ -16424,35 +16548,35 @@ class binary_writer
 
                return 'Z';
 

	
 
            case value_t::boolean:
 
                return j.m_value.boolean ? 'T' : 'F';
 
                return j.m_data.m_value.boolean ? 'T' : 'F';
 

	
 
            case value_t::number_integer:
 
            {
 
                if ((std::numeric_limits<std::int8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
 
                if ((std::numeric_limits<std::int8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
 
                {
 
                    return 'i';
 
                }
 
                if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
 
                if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
 
                {
 
                    return 'U';
 
                }
 
                if ((std::numeric_limits<std::int16_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
 
                if ((std::numeric_limits<std::int16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
 
                {
 
                    return 'I';
 
                }
 
                if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()))
 
                if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()))
 
                {
 
                    return 'u';
 
                }
 
                if ((std::numeric_limits<std::int32_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
 
                if ((std::numeric_limits<std::int32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
 
                {
 
                    return 'l';
 
                }
 
                if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()))
 
                if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()))
 
                {
 
                    return 'm';
 
                }
 
                if ((std::numeric_limits<std::int64_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
 
                if ((std::numeric_limits<std::int64_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
 
                {
 
                    return 'L';
 
                }
 
@@ -16462,35 +16586,35 @@ class binary_writer
 

	
 
            case value_t::number_unsigned:
 
            {
 
                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))
 
                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))
 
                {
 
                    return 'i';
 
                }
 
                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))
 
                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))
 
                {
 
                    return 'U';
 
                }
 
                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))
 
                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))
 
                {
 
                    return 'I';
 
                }
 
                if (use_bjdata && j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint16_t>::max)()))
 
                if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint16_t>::max)()))
 
                {
 
                    return 'u';
 
                }
 
                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
 
                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
 
                {
 
                    return 'l';
 
                }
 
                if (use_bjdata && j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint32_t>::max)()))
 
                if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint32_t>::max)()))
 
                {
 
                    return 'm';
 
                }
 
                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
 
                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
 
                {
 
                    return 'L';
 
                }
 
                if (use_bjdata && j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
 
                {
 
                    return 'M';
 
                }
 
@@ -16499,7 +16623,7 @@ class binary_writer
 
            }
 

	
 
            case value_t::number_float:
 
                return get_ubjson_float_prefix(j.m_value.number_float);
 
                return get_ubjson_float_prefix(j.m_data.m_value.number_float);
 

	
 
            case value_t::string:
 
                return 'S';
 
@@ -16548,7 +16672,7 @@ class binary_writer
 
        std::size_t len = (value.at(key).empty() ? 0 : 1);
 
        for (const auto& el : value.at(key))
 
        {
 
            len *= static_cast<std::size_t>(el.m_value.number_unsigned);
 
            len *= static_cast<std::size_t>(el.m_data.m_value.number_unsigned);
 
        }
 

	
 
        key = "_ArrayData_";
 
@@ -16570,70 +16694,70 @@ class binary_writer
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::uint8_t>(el.m_value.number_unsigned), true);
 
                write_number(static_cast<std::uint8_t>(el.m_data.m_value.number_unsigned), true);
 
            }
 
        }
 
        else if (dtype == 'i')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::int8_t>(el.m_value.number_integer), true);
 
                write_number(static_cast<std::int8_t>(el.m_data.m_value.number_integer), true);
 
            }
 
        }
 
        else if (dtype == 'u')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::uint16_t>(el.m_value.number_unsigned), true);
 
                write_number(static_cast<std::uint16_t>(el.m_data.m_value.number_unsigned), true);
 
            }
 
        }
 
        else if (dtype == 'I')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::int16_t>(el.m_value.number_integer), true);
 
                write_number(static_cast<std::int16_t>(el.m_data.m_value.number_integer), true);
 
            }
 
        }
 
        else if (dtype == 'm')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::uint32_t>(el.m_value.number_unsigned), true);
 
                write_number(static_cast<std::uint32_t>(el.m_data.m_value.number_unsigned), true);
 
            }
 
        }
 
        else if (dtype == 'l')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::int32_t>(el.m_value.number_integer), true);
 
                write_number(static_cast<std::int32_t>(el.m_data.m_value.number_integer), true);
 
            }
 
        }
 
        else if (dtype == 'M')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::uint64_t>(el.m_value.number_unsigned), true);
 
                write_number(static_cast<std::uint64_t>(el.m_data.m_value.number_unsigned), true);
 
            }
 
        }
 
        else if (dtype == 'L')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<std::int64_t>(el.m_value.number_integer), true);
 
                write_number(static_cast<std::int64_t>(el.m_data.m_value.number_integer), true);
 
            }
 
        }
 
        else if (dtype == 'd')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<float>(el.m_value.number_float), true);
 
                write_number(static_cast<float>(el.m_data.m_value.number_float), true);
 
            }
 
        }
 
        else if (dtype == 'D')
 
        {
 
            for (const auto& el : value.at(key))
 
            {
 
                write_number(static_cast<double>(el.m_value.number_float), true);
 
                write_number(static_cast<double>(el.m_data.m_value.number_float), true);
 
            }
 
        }
 
        return false;
 
@@ -16757,11 +16881,11 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/output/serializer.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2008-2009 Björn Hoehrmann <bjoern@hoehrmann.de>
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -16782,11 +16906,11 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/detail/conversions/to_chars.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2009 Florian Loitsch <https://florian.loitsch.com/>
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -17692,7 +17816,7 @@ void grisu2(char* buf, int& len, int& de
 
    // NB: If the neighbors are computed for single-precision numbers, there is a single float
 
    //     (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision
 
    //     value is off by 1 ulp.
 
#if 0
 
#if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)
 
    const boundaries w = compute_boundaries(static_cast<double>(value));
 
#else
 
    const boundaries w = compute_boundaries(value);
 
@@ -17994,11 +18118,11 @@ class serializer
 
              const unsigned int indent_step,
 
              const unsigned int current_indent = 0)
 
    {
 
        switch (val.m_type)
 
        switch (val.m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                if (val.m_value.object->empty())
 
                if (val.m_data.m_value.object->empty())
 
                {
 
                    o->write_characters("{}", 2);
 
                    return;
 
@@ -18016,8 +18140,8 @@ class serializer
 
                    }
 

	
 
                    // first n-1 elements
 
                    auto i = val.m_value.object->cbegin();
 
                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
 
                    auto i = val.m_data.m_value.object->cbegin();
 
                    for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
 
                    {
 
                        o->write_characters(indent_string.c_str(), new_indent);
 
                        o->write_character('\"');
 
@@ -18028,8 +18152,8 @@ class serializer
 
                    }
 

	
 
                    // last element
 
                    JSON_ASSERT(i != val.m_value.object->cend());
 
                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());
 
                    JSON_ASSERT(i != val.m_data.m_value.object->cend());
 
                    JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
 
                    o->write_characters(indent_string.c_str(), new_indent);
 
                    o->write_character('\"');
 
                    dump_escaped(i->first, ensure_ascii);
 
@@ -18045,8 +18169,8 @@ class serializer
 
                    o->write_character('{');
 

	
 
                    // first n-1 elements
 
                    auto i = val.m_value.object->cbegin();
 
                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
 
                    auto i = val.m_data.m_value.object->cbegin();
 
                    for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
 
                    {
 
                        o->write_character('\"');
 
                        dump_escaped(i->first, ensure_ascii);
 
@@ -18056,8 +18180,8 @@ class serializer
 
                    }
 

	
 
                    // last element
 
                    JSON_ASSERT(i != val.m_value.object->cend());
 
                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());
 
                    JSON_ASSERT(i != val.m_data.m_value.object->cend());
 
                    JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
 
                    o->write_character('\"');
 
                    dump_escaped(i->first, ensure_ascii);
 
                    o->write_characters("\":", 2);
 
@@ -18071,7 +18195,7 @@ class serializer
 

	
 
            case value_t::array:
 
            {
 
                if (val.m_value.array->empty())
 
                if (val.m_data.m_value.array->empty())
 
                {
 
                    o->write_characters("[]", 2);
 
                    return;
 
@@ -18089,8 +18213,8 @@ class serializer
 
                    }
 

	
 
                    // first n-1 elements
 
                    for (auto i = val.m_value.array->cbegin();
 
                            i != val.m_value.array->cend() - 1; ++i)
 
                    for (auto i = val.m_data.m_value.array->cbegin();
 
                            i != val.m_data.m_value.array->cend() - 1; ++i)
 
                    {
 
                        o->write_characters(indent_string.c_str(), new_indent);
 
                        dump(*i, true, ensure_ascii, indent_step, new_indent);
 
@@ -18098,9 +18222,9 @@ class serializer
 
                    }
 

	
 
                    // last element
 
                    JSON_ASSERT(!val.m_value.array->empty());
 
                    JSON_ASSERT(!val.m_data.m_value.array->empty());
 
                    o->write_characters(indent_string.c_str(), new_indent);
 
                    dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
 
                    dump(val.m_data.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
 

	
 
                    o->write_character('\n');
 
                    o->write_characters(indent_string.c_str(), current_indent);
 
@@ -18111,16 +18235,16 @@ class serializer
 
                    o->write_character('[');
 

	
 
                    // first n-1 elements
 
                    for (auto i = val.m_value.array->cbegin();
 
                            i != val.m_value.array->cend() - 1; ++i)
 
                    for (auto i = val.m_data.m_value.array->cbegin();
 
                            i != val.m_data.m_value.array->cend() - 1; ++i)
 
                    {
 
                        dump(*i, false, ensure_ascii, indent_step, current_indent);
 
                        o->write_character(',');
 
                    }
 

	
 
                    // last element
 
                    JSON_ASSERT(!val.m_value.array->empty());
 
                    dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
 
                    JSON_ASSERT(!val.m_data.m_value.array->empty());
 
                    dump(val.m_data.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
 

	
 
                    o->write_character(']');
 
                }
 
@@ -18131,7 +18255,7 @@ class serializer
 
            case value_t::string:
 
            {
 
                o->write_character('\"');
 
                dump_escaped(*val.m_value.string, ensure_ascii);
 
                dump_escaped(*val.m_data.m_value.string, ensure_ascii);
 
                o->write_character('\"');
 
                return;
 
            }
 
@@ -18153,24 +18277,24 @@ class serializer
 

	
 
                    o->write_characters("\"bytes\": [", 10);
 

	
 
                    if (!val.m_value.binary->empty())
 
                    {
 
                        for (auto i = val.m_value.binary->cbegin();
 
                                i != val.m_value.binary->cend() - 1; ++i)
 
                    if (!val.m_data.m_value.binary->empty())
 
                    {
 
                        for (auto i = val.m_data.m_value.binary->cbegin();
 
                                i != val.m_data.m_value.binary->cend() - 1; ++i)
 
                        {
 
                            dump_integer(*i);
 
                            o->write_characters(", ", 2);
 
                        }
 
                        dump_integer(val.m_value.binary->back());
 
                        dump_integer(val.m_data.m_value.binary->back());
 
                    }
 

	
 
                    o->write_characters("],\n", 3);
 
                    o->write_characters(indent_string.c_str(), new_indent);
 

	
 
                    o->write_characters("\"subtype\": ", 11);
 
                    if (val.m_value.binary->has_subtype())
 
                    {
 
                        dump_integer(val.m_value.binary->subtype());
 
                    if (val.m_data.m_value.binary->has_subtype())
 
                    {
 
                        dump_integer(val.m_data.m_value.binary->subtype());
 
                    }
 
                    else
 
                    {
 
@@ -18184,21 +18308,21 @@ class serializer
 
                {
 
                    o->write_characters("{\"bytes\":[", 10);
 

	
 
                    if (!val.m_value.binary->empty())
 
                    {
 
                        for (auto i = val.m_value.binary->cbegin();
 
                                i != val.m_value.binary->cend() - 1; ++i)
 
                    if (!val.m_data.m_value.binary->empty())
 
                    {
 
                        for (auto i = val.m_data.m_value.binary->cbegin();
 
                                i != val.m_data.m_value.binary->cend() - 1; ++i)
 
                        {
 
                            dump_integer(*i);
 
                            o->write_character(',');
 
                        }
 
                        dump_integer(val.m_value.binary->back());
 
                        dump_integer(val.m_data.m_value.binary->back());
 
                    }
 

	
 
                    o->write_characters("],\"subtype\":", 12);
 
                    if (val.m_value.binary->has_subtype())
 
                    {
 
                        dump_integer(val.m_value.binary->subtype());
 
                    if (val.m_data.m_value.binary->has_subtype())
 
                    {
 
                        dump_integer(val.m_data.m_value.binary->subtype());
 
                        o->write_character('}');
 
                    }
 
                    else
 
@@ -18211,7 +18335,7 @@ class serializer
 

	
 
            case value_t::boolean:
 
            {
 
                if (val.m_value.boolean)
 
                if (val.m_data.m_value.boolean)
 
                {
 
                    o->write_characters("true", 4);
 
                }
 
@@ -18224,19 +18348,19 @@ class serializer
 

	
 
            case value_t::number_integer:
 
            {
 
                dump_integer(val.m_value.number_integer);
 
                dump_integer(val.m_data.m_value.number_integer);
 
                return;
 
            }
 

	
 
            case value_t::number_unsigned:
 
            {
 
                dump_integer(val.m_value.number_unsigned);
 
                dump_integer(val.m_data.m_value.number_unsigned);
 
                return;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                dump_float(val.m_value.number_float);
 
                dump_float(val.m_data.m_value.number_float);
 
                return;
 
            }
 

	
 
@@ -18810,8 +18934,8 @@ class serializer
 
                ? (byte & 0x3fu) | (codep << 6u)
 
                : (0xFFu >> type) & (byte);
 

	
 
        std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
 
        JSON_ASSERT(index < 400);
 
        const std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
 
        JSON_ASSERT(index < utf8d.size());
 
        state = utf8d[index];
 
        return state;
 
    }
 
@@ -18878,10 +19002,10 @@ NLOHMANN_JSON_NAMESPACE_END
 
// #include <nlohmann/ordered_map.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -18998,7 +19122,7 @@ template <class Key, class T, class Igno
 

	
 
    template<class KeyType, detail::enable_if_t<
 
                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
 
    T & at(KeyType && key)
 
    T & at(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
 
    {
 
        for (auto it = this->begin(); it != this->end(); ++it)
 
        {
 
@@ -19026,7 +19150,7 @@ template <class Key, class T, class Igno
 

	
 
    template<class KeyType, detail::enable_if_t<
 
                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
 
    const T & at(KeyType && key) const
 
    const T & at(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
 
    {
 
        for (auto it = this->begin(); it != this->end(); ++it)
 
        {
 
@@ -19060,7 +19184,7 @@ template <class Key, class T, class Igno
 

	
 
    template<class KeyType, detail::enable_if_t<
 
                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
 
    size_type erase(KeyType && key)
 
    size_type erase(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
 
    {
 
        for (auto it = this->begin(); it != this->end(); ++it)
 
        {
 
@@ -19151,7 +19275,7 @@ template <class Key, class T, class Igno
 

	
 
    template<class KeyType, detail::enable_if_t<
 
                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
 
    size_type count(KeyType && key) const
 
    size_type count(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)
 
    {
 
        for (auto it = this->begin(); it != this->end(); ++it)
 
        {
 
@@ -19177,7 +19301,7 @@ template <class Key, class T, class Igno
 

	
 
    template<class KeyType, detail::enable_if_t<
 
                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
 
    iterator find(KeyType && key)
 
    iterator find(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)
 
    {
 
        for (auto it = this->begin(); it != this->end(); ++it)
 
        {
 
@@ -19240,7 +19364,9 @@ NLOHMANN_JSON_NAMESPACE_END
 

	
 

	
 
#if defined(JSON_HAS_CPP_17)
 
    #include <any>
 
    #if JSON_HAS_STATIC_RTTI
 
        #include <any>
 
    #endif
 
    #include <string_view>
 
#endif
 

	
 
@@ -19271,6 +19397,7 @@ The invariants are checked by member fun
 
*/
 
NLOHMANN_BASIC_JSON_TPL_DECLARATION
 
class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)
 
    : public ::nlohmann::detail::json_base_class<CustomBaseClass>
 
{
 
  private:
 
    template<detail::value_t> friend struct detail::external_constructor;
 
@@ -19297,6 +19424,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// workaround type for MSVC
 
    using basic_json_t = NLOHMANN_BASIC_JSON_TPL;
 
    using json_base_class_t = ::nlohmann::detail::json_base_class<CustomBaseClass>;
 

	
 
  JSON_PRIVATE_UNLESS_TESTED:
 
    // convenience aliases for types residing in namespace detail;
 
@@ -19368,7 +19496,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    /////////////////////
 
    // container types //
 
    /////////////////////
 
@@ -19410,7 +19537,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    /// @brief returns the allocator associated with the container
 
    /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/
 
    static allocator_type get_allocator()
 
@@ -19425,7 +19551,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    {
 
        basic_json result;
 

	
 
        result["copyright"] = "(C) 2013-2022 Niels Lohmann";
 
        result["copyright"] = "(C) 2013-2023 Niels Lohmann";
 
        result["name"] = "JSON for Modern C++";
 
        result["url"] = "https://github.com/nlohmann/json";
 
        result["version"]["string"] =
 
@@ -19473,7 +19599,6 @@ class basic_json // NOLINT(cppcoreguidel
 
        result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}};
 
#endif
 

	
 

	
 
#if defined(_MSVC_LANG)
 
        result["compiler"]["c++"] = std::to_string(_MSVC_LANG);
 
#elif defined(__cplusplus)
 
@@ -19484,7 +19609,6 @@ class basic_json // NOLINT(cppcoreguidel
 
        return result;
 
    }
 

	
 

	
 
    ///////////////////////////
 
    // JSON value data types //
 
    ///////////////////////////
 
@@ -19692,7 +19816,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                    object = nullptr;  // silence warning, see #821
 
                    if (JSON_HEDLEY_UNLIKELY(t == value_t::null))
 
                    {
 
                        JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.11.2", nullptr)); // LCOV_EXCL_LINE
 
                        JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.11.3", nullptr)); // LCOV_EXCL_LINE
 
                    }
 
                    break;
 
                }
 
@@ -19731,6 +19855,16 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        void destroy(value_t t)
 
        {
 
            if (
 
                (t == value_t::object && object == nullptr) ||
 
                (t == value_t::array && array == nullptr) ||
 
                (t == value_t::string && string == nullptr) ||
 
                (t == value_t::binary && binary == nullptr)
 
            )
 
            {
 
                //not initialized (e.g. due to exception in the ctor)
 
                return;
 
            }
 
            if (t == value_t::array || t == value_t::object)
 
            {
 
                // flatten the current json_value to a heap-allocated stack
 
@@ -19761,18 +19895,18 @@ class basic_json // NOLINT(cppcoreguidel
 
                    // its children to the stack to be processed later
 
                    if (current_item.is_array())
 
                    {
 
                        std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack));
 

	
 
                        current_item.m_value.array->clear();
 
                        std::move(current_item.m_data.m_value.array->begin(), current_item.m_data.m_value.array->end(), std::back_inserter(stack));
 

	
 
                        current_item.m_data.m_value.array->clear();
 
                    }
 
                    else if (current_item.is_object())
 
                    {
 
                        for (auto&& it : *current_item.m_value.object)
 
                        for (auto&& it : *current_item.m_data.m_value.object)
 
                        {
 
                            stack.push_back(std::move(it.second));
 
                        }
 

	
 
                        current_item.m_value.object->clear();
 
                        current_item.m_data.m_value.object->clear();
 
                    }
 

	
 
                    // it's now safe that current_item get destructed
 
@@ -19849,10 +19983,10 @@ class basic_json // NOLINT(cppcoreguidel
 
    */
 
    void assert_invariant(bool check_parents = true) const noexcept
 
    {
 
        JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr);
 
        JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr);
 
        JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr);
 
        JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr);
 
        JSON_ASSERT(m_data.m_type != value_t::object || m_data.m_value.object != nullptr);
 
        JSON_ASSERT(m_data.m_type != value_t::array || m_data.m_value.array != nullptr);
 
        JSON_ASSERT(m_data.m_type != value_t::string || m_data.m_value.string != nullptr);
 
        JSON_ASSERT(m_data.m_type != value_t::binary || m_data.m_value.binary != nullptr);
 

	
 
#if JSON_DIAGNOSTICS
 
        JSON_TRY
 
@@ -19871,11 +20005,11 @@ class basic_json // NOLINT(cppcoreguidel
 
    void set_parents()
 
    {
 
#if JSON_DIAGNOSTICS
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::array:
 
            {
 
                for (auto& element : *m_value.array)
 
                for (auto& element : *m_data.m_value.array)
 
                {
 
                    element.m_parent = this;
 
                }
 
@@ -19884,7 +20018,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
            case value_t::object:
 
            {
 
                for (auto& element : *m_value.object)
 
                for (auto& element : *m_data.m_value.object)
 
                {
 
                    element.second.m_parent = this;
 
                }
 
@@ -19925,7 +20059,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        {
 
            // see https://github.com/nlohmann/json/issues/2838
 
            JSON_ASSERT(type() == value_t::array);
 
            if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity))
 
            if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity))
 
            {
 
                // capacity has changed: update all parents
 
                set_parents();
 
@@ -19981,7 +20115,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @brief create an empty value with a given type
 
    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
 
    basic_json(const value_t v)
 
        : m_type(v), m_value(v)
 
        : m_data(v)
 
    {
 
        assert_invariant();
 
    }
 
@@ -20055,12 +20189,12 @@ class basic_json // NOLINT(cppcoreguidel
 
                *this = nullptr;
 
                break;
 
            case value_t::discarded:
 
                m_type = value_t::discarded;
 
                m_data.m_type = value_t::discarded;
 
                break;
 
            default:            // LCOV_EXCL_LINE
 
                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
 
        }
 
        JSON_ASSERT(m_type == val.type());
 
        JSON_ASSERT(m_data.m_type == val.type());
 
        set_parents();
 
        assert_invariant();
 
    }
 
@@ -20076,7 +20210,10 @@ class basic_json // NOLINT(cppcoreguidel
 
        bool is_an_object = std::all_of(init.begin(), init.end(),
 
                                        [](const detail::json_ref<basic_json>& element_ref)
 
        {
 
            return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string();
 
            // The cast is to ensure op[size_type] is called, bearing in mind size_type may not be int;
 
            // (many string types can be constructed from 0 via its null-pointer guise, so we get a
 
            // broken call to op[key_type], the wrong semantics and a 4804 warning on Windows)
 
            return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string();
 
        });
 

	
 
        // adjust type if type deduction is not wanted
 
@@ -20098,22 +20235,22 @@ class basic_json // NOLINT(cppcoreguidel
 
        if (is_an_object)
 
        {
 
            // the initializer list is a list of pairs -> create object
 
            m_type = value_t::object;
 
            m_value = value_t::object;
 
            m_data.m_type = value_t::object;
 
            m_data.m_value = value_t::object;
 

	
 
            for (auto& element_ref : init)
 
            {
 
                auto element = element_ref.moved_or_copied();
 
                m_value.object->emplace(
 
                    std::move(*((*element.m_value.array)[0].m_value.string)),
 
                    std::move((*element.m_value.array)[1]));
 
                m_data.m_value.object->emplace(
 
                    std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)),
 
                    std::move((*element.m_data.m_value.array)[1]));
 
            }
 
        }
 
        else
 
        {
 
            // the initializer list describes an array -> create array
 
            m_type = value_t::array;
 
            m_value.array = create<array_t>(init.begin(), init.end());
 
            m_data.m_type = value_t::array;
 
            m_data.m_value.array = create<array_t>(init.begin(), init.end());
 
        }
 

	
 
        set_parents();
 
@@ -20126,8 +20263,8 @@ class basic_json // NOLINT(cppcoreguidel
 
    static basic_json binary(const typename binary_t::container_type& init)
 
    {
 
        auto res = basic_json();
 
        res.m_type = value_t::binary;
 
        res.m_value = init;
 
        res.m_data.m_type = value_t::binary;
 
        res.m_data.m_value = init;
 
        return res;
 
    }
 

	
 
@@ -20137,8 +20274,8 @@ class basic_json // NOLINT(cppcoreguidel
 
    static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype)
 
    {
 
        auto res = basic_json();
 
        res.m_type = value_t::binary;
 
        res.m_value = binary_t(init, subtype);
 
        res.m_data.m_type = value_t::binary;
 
        res.m_data.m_value = binary_t(init, subtype);
 
        return res;
 
    }
 

	
 
@@ -20148,8 +20285,8 @@ class basic_json // NOLINT(cppcoreguidel
 
    static basic_json binary(typename binary_t::container_type&& init)
 
    {
 
        auto res = basic_json();
 
        res.m_type = value_t::binary;
 
        res.m_value = std::move(init);
 
        res.m_data.m_type = value_t::binary;
 
        res.m_data.m_value = std::move(init);
 
        return res;
 
    }
 

	
 
@@ -20159,8 +20296,8 @@ class basic_json // NOLINT(cppcoreguidel
 
    static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype)
 
    {
 
        auto res = basic_json();
 
        res.m_type = value_t::binary;
 
        res.m_value = binary_t(std::move(init), subtype);
 
        res.m_data.m_type = value_t::binary;
 
        res.m_data.m_value = binary_t(std::move(init), subtype);
 
        return res;
 
    }
 

	
 
@@ -20182,10 +20319,9 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @brief construct an array with count copies of given value
 
    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
 
    basic_json(size_type cnt, const basic_json& val)
 
        : m_type(value_t::array)
 
    {
 
        m_value.array = create<array_t>(cnt, val);
 
    basic_json(size_type cnt, const basic_json& val):
 
        m_data{cnt, val}
 
    {
 
        set_parents();
 
        assert_invariant();
 
    }
 
@@ -20207,10 +20343,10 @@ class basic_json // NOLINT(cppcoreguidel
 
        }
 

	
 
        // copy type from first iterator
 
        m_type = first.m_object->m_type;
 
        m_data.m_type = first.m_object->m_data.m_type;
 

	
 
        // check if iterator range is complete for primitive values
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::boolean:
 
            case value_t::number_float:
 
@@ -20235,55 +20371,55 @@ class basic_json // NOLINT(cppcoreguidel
 
                break;
 
        }
 

	
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::number_integer:
 
            {
 
                m_value.number_integer = first.m_object->m_value.number_integer;
 
                m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer;
 
                break;
 
            }
 

	
 
            case value_t::number_unsigned:
 
            {
 
                m_value.number_unsigned = first.m_object->m_value.number_unsigned;
 
                m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned;
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                m_value.number_float = first.m_object->m_value.number_float;
 
                m_data.m_value.number_float = first.m_object->m_data.m_value.number_float;
 
                break;
 
            }
 

	
 
            case value_t::boolean:
 
            {
 
                m_value.boolean = first.m_object->m_value.boolean;
 
                m_data.m_value.boolean = first.m_object->m_data.m_value.boolean;
 
                break;
 
            }
 

	
 
            case value_t::string:
 
            {
 
                m_value = *first.m_object->m_value.string;
 
                m_data.m_value = *first.m_object->m_data.m_value.string;
 
                break;
 
            }
 

	
 
            case value_t::object:
 
            {
 
                m_value.object = create<object_t>(first.m_it.object_iterator,
 
                                                  last.m_it.object_iterator);
 
                m_data.m_value.object = create<object_t>(first.m_it.object_iterator,
 
                                        last.m_it.object_iterator);
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                m_value.array = create<array_t>(first.m_it.array_iterator,
 
                                                last.m_it.array_iterator);
 
                m_data.m_value.array = create<array_t>(first.m_it.array_iterator,
 
                                                       last.m_it.array_iterator);
 
                break;
 
            }
 

	
 
            case value_t::binary:
 
            {
 
                m_value = *first.m_object->m_value.binary;
 
                m_data.m_value = *first.m_object->m_data.m_value.binary;
 
                break;
 
            }
 

	
 
@@ -20297,7 +20433,6 @@ class basic_json // NOLINT(cppcoreguidel
 
        assert_invariant();
 
    }
 

	
 

	
 
    ///////////////////////////////////////
 
    // other constructors and destructor //
 
    ///////////////////////////////////////
 
@@ -20310,58 +20445,59 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @brief copy constructor
 
    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
 
    basic_json(const basic_json& other)
 
        : m_type(other.m_type)
 
    {
 
        : json_base_class_t(other)
 
    {
 
        m_data.m_type = other.m_data.m_type;
 
        // check of passed value is valid
 
        other.assert_invariant();
 

	
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::object:
 
            {
 
                m_value = *other.m_value.object;
 
                m_data.m_value = *other.m_data.m_value.object;
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                m_value = *other.m_value.array;
 
                m_data.m_value = *other.m_data.m_value.array;
 
                break;
 
            }
 

	
 
            case value_t::string:
 
            {
 
                m_value = *other.m_value.string;
 
                m_data.m_value = *other.m_data.m_value.string;
 
                break;
 
            }
 

	
 
            case value_t::boolean:
 
            {
 
                m_value = other.m_value.boolean;
 
                m_data.m_value = other.m_data.m_value.boolean;
 
                break;
 
            }
 

	
 
            case value_t::number_integer:
 
            {
 
                m_value = other.m_value.number_integer;
 
                m_data.m_value = other.m_data.m_value.number_integer;
 
                break;
 
            }
 

	
 
            case value_t::number_unsigned:
 
            {
 
                m_value = other.m_value.number_unsigned;
 
                m_data.m_value = other.m_data.m_value.number_unsigned;
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                m_value = other.m_value.number_float;
 
                m_data.m_value = other.m_data.m_value.number_float;
 
                break;
 
            }
 

	
 
            case value_t::binary:
 
            {
 
                m_value = *other.m_value.binary;
 
                m_data.m_value = *other.m_data.m_value.binary;
 
                break;
 
            }
 

	
 
@@ -20378,15 +20514,15 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @brief move constructor
 
    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/
 
    basic_json(basic_json&& other) noexcept
 
        : m_type(std::move(other.m_type)),
 
          m_value(std::move(other.m_value))
 
        : json_base_class_t(std::forward<json_base_class_t>(other)),
 
          m_data(std::move(other.m_data))
 
    {
 
        // check that passed value is valid
 
        other.assert_invariant(false);
 

	
 
        // invalidate payload
 
        other.m_type = value_t::null;
 
        other.m_value = {};
 
        other.m_data.m_type = value_t::null;
 
        other.m_data.m_value = {};
 

	
 
        set_parents();
 
        assert_invariant();
 
@@ -20398,15 +20534,17 @@ class basic_json // NOLINT(cppcoreguidel
 
        std::is_nothrow_move_constructible<value_t>::value&&
 
        std::is_nothrow_move_assignable<value_t>::value&&
 
        std::is_nothrow_move_constructible<json_value>::value&&
 
        std::is_nothrow_move_assignable<json_value>::value
 
        std::is_nothrow_move_assignable<json_value>::value&&
 
        std::is_nothrow_move_assignable<json_base_class_t>::value
 
    )
 
    {
 
        // check that passed value is valid
 
        other.assert_invariant();
 

	
 
        using std::swap;
 
        swap(m_type, other.m_type);
 
        swap(m_value, other.m_value);
 
        swap(m_data.m_type, other.m_data.m_type);
 
        swap(m_data.m_value, other.m_data.m_value);
 
        json_base_class_t::operator=(std::move(other));
 

	
 
        set_parents();
 
        assert_invariant();
 
@@ -20418,7 +20556,6 @@ class basic_json // NOLINT(cppcoreguidel
 
    ~basic_json() noexcept
 
    {
 
        assert_invariant(false);
 
        m_value.destroy(m_type);
 
    }
 

	
 
    /// @}
 
@@ -20458,7 +20595,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/type/
 
    constexpr value_t type() const noexcept
 
    {
 
        return m_type;
 
        return m_data.m_type;
 
    }
 

	
 
    /// @brief return whether type is primitive
 
@@ -20479,14 +20616,14 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_null/
 
    constexpr bool is_null() const noexcept
 
    {
 
        return m_type == value_t::null;
 
        return m_data.m_type == value_t::null;
 
    }
 

	
 
    /// @brief return whether value is a boolean
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/
 
    constexpr bool is_boolean() const noexcept
 
    {
 
        return m_type == value_t::boolean;
 
        return m_data.m_type == value_t::boolean;
 
    }
 

	
 
    /// @brief return whether value is a number
 
@@ -20500,63 +20637,63 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/
 
    constexpr bool is_number_integer() const noexcept
 
    {
 
        return m_type == value_t::number_integer || m_type == value_t::number_unsigned;
 
        return m_data.m_type == value_t::number_integer || m_data.m_type == value_t::number_unsigned;
 
    }
 

	
 
    /// @brief return whether value is an unsigned integer number
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/
 
    constexpr bool is_number_unsigned() const noexcept
 
    {
 
        return m_type == value_t::number_unsigned;
 
        return m_data.m_type == value_t::number_unsigned;
 
    }
 

	
 
    /// @brief return whether value is a floating-point number
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/
 
    constexpr bool is_number_float() const noexcept
 
    {
 
        return m_type == value_t::number_float;
 
        return m_data.m_type == value_t::number_float;
 
    }
 

	
 
    /// @brief return whether value is an object
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_object/
 
    constexpr bool is_object() const noexcept
 
    {
 
        return m_type == value_t::object;
 
        return m_data.m_type == value_t::object;
 
    }
 

	
 
    /// @brief return whether value is an array
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_array/
 
    constexpr bool is_array() const noexcept
 
    {
 
        return m_type == value_t::array;
 
        return m_data.m_type == value_t::array;
 
    }
 

	
 
    /// @brief return whether value is a string
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_string/
 
    constexpr bool is_string() const noexcept
 
    {
 
        return m_type == value_t::string;
 
        return m_data.m_type == value_t::string;
 
    }
 

	
 
    /// @brief return whether value is a binary array
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_binary/
 
    constexpr bool is_binary() const noexcept
 
    {
 
        return m_type == value_t::binary;
 
        return m_data.m_type == value_t::binary;
 
    }
 

	
 
    /// @brief return whether value is discarded
 
    /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/
 
    constexpr bool is_discarded() const noexcept
 
    {
 
        return m_type == value_t::discarded;
 
        return m_data.m_type == value_t::discarded;
 
    }
 

	
 
    /// @brief return the type of the JSON value (implicit)
 
    /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/
 
    constexpr operator value_t() const noexcept
 
    {
 
        return m_type;
 
        return m_data.m_type;
 
    }
 

	
 
    /// @}
 
@@ -20571,7 +20708,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    {
 
        if (JSON_HEDLEY_LIKELY(is_boolean()))
 
        {
 
            return m_value.boolean;
 
            return m_data.m_value.boolean;
 
        }
 

	
 
        JSON_THROW(type_error::create(302, detail::concat("type must be boolean, but is ", type_name()), this));
 
@@ -20580,97 +20717,97 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// get a pointer to the value (object)
 
    object_t* get_impl_ptr(object_t* /*unused*/) noexcept
 
    {
 
        return is_object() ? m_value.object : nullptr;
 
        return is_object() ? m_data.m_value.object : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (object)
 
    constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept
 
    {
 
        return is_object() ? m_value.object : nullptr;
 
        return is_object() ? m_data.m_value.object : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (array)
 
    array_t* get_impl_ptr(array_t* /*unused*/) noexcept
 
    {
 
        return is_array() ? m_value.array : nullptr;
 
        return is_array() ? m_data.m_value.array : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (array)
 
    constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept
 
    {
 
        return is_array() ? m_value.array : nullptr;
 
        return is_array() ? m_data.m_value.array : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (string)
 
    string_t* get_impl_ptr(string_t* /*unused*/) noexcept
 
    {
 
        return is_string() ? m_value.string : nullptr;
 
        return is_string() ? m_data.m_value.string : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (string)
 
    constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept
 
    {
 
        return is_string() ? m_value.string : nullptr;
 
        return is_string() ? m_data.m_value.string : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (boolean)
 
    boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept
 
    {
 
        return is_boolean() ? &m_value.boolean : nullptr;
 
        return is_boolean() ? &m_data.m_value.boolean : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (boolean)
 
    constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept
 
    {
 
        return is_boolean() ? &m_value.boolean : nullptr;
 
        return is_boolean() ? &m_data.m_value.boolean : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (integer number)
 
    number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept
 
    {
 
        return is_number_integer() ? &m_value.number_integer : nullptr;
 
        return is_number_integer() ? &m_data.m_value.number_integer : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (integer number)
 
    constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept
 
    {
 
        return is_number_integer() ? &m_value.number_integer : nullptr;
 
        return is_number_integer() ? &m_data.m_value.number_integer : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (unsigned number)
 
    number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept
 
    {
 
        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
 
        return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (unsigned number)
 
    constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept
 
    {
 
        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
 
        return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (floating-point number)
 
    number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept
 
    {
 
        return is_number_float() ? &m_value.number_float : nullptr;
 
        return is_number_float() ? &m_data.m_value.number_float : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (floating-point number)
 
    constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept
 
    {
 
        return is_number_float() ? &m_value.number_float : nullptr;
 
        return is_number_float() ? &m_data.m_value.number_float : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (binary)
 
    binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept
 
    {
 
        return is_binary() ? m_value.binary : nullptr;
 
        return is_binary() ? m_data.m_value.binary : nullptr;
 
    }
 

	
 
    /// get a pointer to the value (binary)
 
    constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept
 
    {
 
        return is_binary() ? m_value.binary : nullptr;
 
        return is_binary() ? m_data.m_value.binary : nullptr;
 
    }
 

	
 
    /*!
 
@@ -21053,7 +21190,7 @@ class basic_json // NOLINT(cppcoreguidel
 
#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
 
                                                detail::negation<std::is_same<ValueType, std::string_view>>,
 
#endif
 
#if defined(JSON_HAS_CPP_17)
 
#if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI
 
                                                detail::negation<std::is_same<ValueType, std::any>>,
 
#endif
 
                                                detail::is_detected_lazy<detail::get_template_function, const basic_json_t&, ValueType>
 
@@ -21090,7 +21227,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    ////////////////////
 
    // element access //
 
    ////////////////////
 
@@ -21108,7 +21244,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        {
 
            JSON_TRY
 
            {
 
                return set_parent(m_value.array->at(idx));
 
                return set_parent(m_data.m_value.array->at(idx));
 
            }
 
            JSON_CATCH (std::out_of_range&)
 
            {
 
@@ -21131,7 +21267,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        {
 
            JSON_TRY
 
            {
 
                return m_value.array->at(idx);
 
                return m_data.m_value.array->at(idx);
 
            }
 
            JSON_CATCH (std::out_of_range&)
 
            {
 
@@ -21155,8 +21291,8 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
 
        }
 

	
 
        auto it = m_value.object->find(key);
 
        if (it == m_value.object->end())
 
        auto it = m_data.m_value.object->find(key);
 
        if (it == m_data.m_value.object->end())
 
        {
 
            JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this));
 
        }
 
@@ -21175,8 +21311,8 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
 
        }
 

	
 
        auto it = m_value.object->find(std::forward<KeyType>(key));
 
        if (it == m_value.object->end())
 
        auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
 
        if (it == m_data.m_value.object->end())
 
        {
 
            JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this));
 
        }
 
@@ -21193,8 +21329,8 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
 
        }
 

	
 
        auto it = m_value.object->find(key);
 
        if (it == m_value.object->end())
 
        auto it = m_data.m_value.object->find(key);
 
        if (it == m_data.m_value.object->end())
 
        {
 
            JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this));
 
        }
 
@@ -21213,8 +21349,8 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
 
        }
 

	
 
        auto it = m_value.object->find(std::forward<KeyType>(key));
 
        if (it == m_value.object->end())
 
        auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
 
        if (it == m_data.m_value.object->end())
 
        {
 
            JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this));
 
        }
 
@@ -21228,8 +21364,8 @@ class basic_json // NOLINT(cppcoreguidel
 
        // implicitly convert null value to an empty array
 
        if (is_null())
 
        {
 
            m_type = value_t::array;
 
            m_value.array = create<array_t>();
 
            m_data.m_type = value_t::array;
 
            m_data.m_value.array = create<array_t>();
 
            assert_invariant();
 
        }
 

	
 
@@ -21237,17 +21373,17 @@ class basic_json // NOLINT(cppcoreguidel
 
        if (JSON_HEDLEY_LIKELY(is_array()))
 
        {
 
            // fill up array with null values if given idx is outside range
 
            if (idx >= m_value.array->size())
 
            if (idx >= m_data.m_value.array->size())
 
            {
 
#if JSON_DIAGNOSTICS
 
                // remember array size & capacity before resizing
 
                const auto old_size = m_value.array->size();
 
                const auto old_capacity = m_value.array->capacity();
 
#endif
 
                m_value.array->resize(idx + 1);
 
                const auto old_size = m_data.m_value.array->size();
 
                const auto old_capacity = m_data.m_value.array->capacity();
 
#endif
 
                m_data.m_value.array->resize(idx + 1);
 

	
 
#if JSON_DIAGNOSTICS
 
                if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity))
 
                if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity))
 
                {
 
                    // capacity has changed: update all parents
 
                    set_parents();
 
@@ -21261,7 +21397,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                assert_invariant();
 
            }
 

	
 
            return m_value.array->operator[](idx);
 
            return m_data.m_value.array->operator[](idx);
 
        }
 

	
 
        JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this));
 
@@ -21274,7 +21410,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        // const operator[] only works for arrays
 
        if (JSON_HEDLEY_LIKELY(is_array()))
 
        {
 
            return m_value.array->operator[](idx);
 
            return m_data.m_value.array->operator[](idx);
 
        }
 

	
 
        JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this));
 
@@ -21287,15 +21423,15 @@ class basic_json // NOLINT(cppcoreguidel
 
        // implicitly convert null value to an empty object
 
        if (is_null())
 
        {
 
            m_type = value_t::object;
 
            m_value.object = create<object_t>();
 
            m_data.m_type = value_t::object;
 
            m_data.m_value.object = create<object_t>();
 
            assert_invariant();
 
        }
 

	
 
        // operator[] only works for objects
 
        if (JSON_HEDLEY_LIKELY(is_object()))
 
        {
 
            auto result = m_value.object->emplace(std::move(key), nullptr);
 
            auto result = m_data.m_value.object->emplace(std::move(key), nullptr);
 
            return set_parent(result.first->second);
 
        }
 

	
 
@@ -21309,8 +21445,8 @@ class basic_json // NOLINT(cppcoreguidel
 
        // const operator[] only works for objects
 
        if (JSON_HEDLEY_LIKELY(is_object()))
 
        {
 
            auto it = m_value.object->find(key);
 
            JSON_ASSERT(it != m_value.object->end());
 
            auto it = m_data.m_value.object->find(key);
 
            JSON_ASSERT(it != m_data.m_value.object->end());
 
            return it->second;
 
        }
 

	
 
@@ -21340,15 +21476,15 @@ class basic_json // NOLINT(cppcoreguidel
 
        // implicitly convert null value to an empty object
 
        if (is_null())
 
        {
 
            m_type = value_t::object;
 
            m_value.object = create<object_t>();
 
            m_data.m_type = value_t::object;
 
            m_data.m_value.object = create<object_t>();
 
            assert_invariant();
 
        }
 

	
 
        // operator[] only works for objects
 
        if (JSON_HEDLEY_LIKELY(is_object()))
 
        {
 
            auto result = m_value.object->emplace(std::forward<KeyType>(key), nullptr);
 
            auto result = m_data.m_value.object->emplace(std::forward<KeyType>(key), nullptr);
 
            return set_parent(result.first->second);
 
        }
 

	
 
@@ -21364,8 +21500,8 @@ class basic_json // NOLINT(cppcoreguidel
 
        // const operator[] only works for objects
 
        if (JSON_HEDLEY_LIKELY(is_object()))
 
        {
 
            auto it = m_value.object->find(std::forward<KeyType>(key));
 
            JSON_ASSERT(it != m_value.object->end());
 
            auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
 
            JSON_ASSERT(it != m_data.m_value.object->end());
 
            return it->second;
 
        }
 

	
 
@@ -21602,7 +21738,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        IteratorType result = end();
 

	
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::boolean:
 
            case value_t::number_float:
 
@@ -21619,32 +21755,32 @@ class basic_json // NOLINT(cppcoreguidel
 
                if (is_string())
 
                {
 
                    AllocatorType<string_t> alloc;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
 
                    m_value.string = nullptr;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);
 
                    m_data.m_value.string = nullptr;
 
                }
 
                else if (is_binary())
 
                {
 
                    AllocatorType<binary_t> alloc;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
 
                    m_value.binary = nullptr;
 
                }
 

	
 
                m_type = value_t::null;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);
 
                    m_data.m_value.binary = nullptr;
 
                }
 

	
 
                m_data.m_type = value_t::null;
 
                assert_invariant();
 
                break;
 
            }
 

	
 
            case value_t::object:
 
            {
 
                result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator);
 
                result.m_it.object_iterator = m_data.m_value.object->erase(pos.m_it.object_iterator);
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator);
 
                result.m_it.array_iterator = m_data.m_value.array->erase(pos.m_it.array_iterator);
 
                break;
 
            }
 

	
 
@@ -21672,7 +21808,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        IteratorType result = end();
 

	
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::boolean:
 
            case value_t::number_float:
 
@@ -21690,33 +21826,33 @@ class basic_json // NOLINT(cppcoreguidel
 
                if (is_string())
 
                {
 
                    AllocatorType<string_t> alloc;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
 
                    m_value.string = nullptr;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);
 
                    m_data.m_value.string = nullptr;
 
                }
 
                else if (is_binary())
 
                {
 
                    AllocatorType<binary_t> alloc;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
 
                    m_value.binary = nullptr;
 
                }
 

	
 
                m_type = value_t::null;
 
                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);
 
                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);
 
                    m_data.m_value.binary = nullptr;
 
                }
 

	
 
                m_data.m_type = value_t::null;
 
                assert_invariant();
 
                break;
 
            }
 

	
 
            case value_t::object:
 
            {
 
                result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator,
 
                result.m_it.object_iterator = m_data.m_value.object->erase(first.m_it.object_iterator,
 
                                              last.m_it.object_iterator);
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator,
 
                result.m_it.array_iterator = m_data.m_value.array->erase(first.m_it.array_iterator,
 
                                             last.m_it.array_iterator);
 
                break;
 
            }
 
@@ -21741,7 +21877,7 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
 
        }
 

	
 
        return m_value.object->erase(std::forward<KeyType>(key));
 
        return m_data.m_value.object->erase(std::forward<KeyType>(key));
 
    }
 

	
 
    template < typename KeyType, detail::enable_if_t <
 
@@ -21754,10 +21890,10 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
 
        }
 

	
 
        const auto it = m_value.object->find(std::forward<KeyType>(key));
 
        if (it != m_value.object->end())
 
        {
 
            m_value.object->erase(it);
 
        const auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
 
        if (it != m_data.m_value.object->end())
 
        {
 
            m_data.m_value.object->erase(it);
 
            return 1;
 
        }
 
        return 0;
 
@@ -21795,7 +21931,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
 
            }
 

	
 
            m_value.array->erase(m_value.array->begin() + static_cast<difference_type>(idx));
 
            m_data.m_value.array->erase(m_data.m_value.array->begin() + static_cast<difference_type>(idx));
 
        }
 
        else
 
        {
 
@@ -21805,7 +21941,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    ////////////
 
    // lookup //
 
    ////////////
 
@@ -21821,7 +21956,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        if (is_object())
 
        {
 
            result.m_it.object_iterator = m_value.object->find(key);
 
            result.m_it.object_iterator = m_data.m_value.object->find(key);
 
        }
 

	
 
        return result;
 
@@ -21835,7 +21970,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        if (is_object())
 
        {
 
            result.m_it.object_iterator = m_value.object->find(key);
 
            result.m_it.object_iterator = m_data.m_value.object->find(key);
 
        }
 

	
 
        return result;
 
@@ -21851,7 +21986,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        if (is_object())
 
        {
 
            result.m_it.object_iterator = m_value.object->find(std::forward<KeyType>(key));
 
            result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));
 
        }
 

	
 
        return result;
 
@@ -21867,7 +22002,7 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
        if (is_object())
 
        {
 
            result.m_it.object_iterator = m_value.object->find(std::forward<KeyType>(key));
 
            result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));
 
        }
 

	
 
        return result;
 
@@ -21878,7 +22013,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    size_type count(const typename object_t::key_type& key) const
 
    {
 
        // return 0 for all nonobject types
 
        return is_object() ? m_value.object->count(key) : 0;
 
        return is_object() ? m_data.m_value.object->count(key) : 0;
 
    }
 

	
 
    /// @brief returns the number of occurrences of a key in a JSON object
 
@@ -21888,14 +22023,14 @@ class basic_json // NOLINT(cppcoreguidel
 
    size_type count(KeyType && key) const
 
    {
 
        // return 0 for all nonobject types
 
        return is_object() ? m_value.object->count(std::forward<KeyType>(key)) : 0;
 
        return is_object() ? m_data.m_value.object->count(std::forward<KeyType>(key)) : 0;
 
    }
 

	
 
    /// @brief check the existence of an element in a JSON object
 
    /// @sa https://json.nlohmann.me/api/basic_json/contains/
 
    bool contains(const typename object_t::key_type& key) const
 
    {
 
        return is_object() && m_value.object->find(key) != m_value.object->end();
 
        return is_object() && m_data.m_value.object->find(key) != m_data.m_value.object->end();
 
    }
 

	
 
    /// @brief check the existence of an element in a JSON object
 
@@ -21904,7 +22039,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
 
    bool contains(KeyType && key) const
 
    {
 
        return is_object() && m_value.object->find(std::forward<KeyType>(key)) != m_value.object->end();
 
        return is_object() && m_data.m_value.object->find(std::forward<KeyType>(key)) != m_data.m_value.object->end();
 
    }
 

	
 
    /// @brief check the existence of an element in a JSON object given a JSON pointer
 
@@ -21923,7 +22058,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    ///////////////
 
    // iterators //
 
    ///////////////
 
@@ -22062,7 +22196,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    //////////////
 
    // capacity //
 
    //////////////
 
@@ -22074,7 +22207,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/empty/
 
    bool empty() const noexcept
 
    {
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::null:
 
            {
 
@@ -22085,13 +22218,13 @@ class basic_json // NOLINT(cppcoreguidel
 
            case value_t::array:
 
            {
 
                // delegate call to array_t::empty()
 
                return m_value.array->empty();
 
                return m_data.m_value.array->empty();
 
            }
 

	
 
            case value_t::object:
 
            {
 
                // delegate call to object_t::empty()
 
                return m_value.object->empty();
 
                return m_data.m_value.object->empty();
 
            }
 

	
 
            case value_t::string:
 
@@ -22113,7 +22246,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/size/
 
    size_type size() const noexcept
 
    {
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::null:
 
            {
 
@@ -22124,13 +22257,13 @@ class basic_json // NOLINT(cppcoreguidel
 
            case value_t::array:
 
            {
 
                // delegate call to array_t::size()
 
                return m_value.array->size();
 
                return m_data.m_value.array->size();
 
            }
 

	
 
            case value_t::object:
 
            {
 
                // delegate call to object_t::size()
 
                return m_value.object->size();
 
                return m_data.m_value.object->size();
 
            }
 

	
 
            case value_t::string:
 
@@ -22152,18 +22285,18 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/max_size/
 
    size_type max_size() const noexcept
 
    {
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::array:
 
            {
 
                // delegate call to array_t::max_size()
 
                return m_value.array->max_size();
 
                return m_data.m_value.array->max_size();
 
            }
 

	
 
            case value_t::object:
 
            {
 
                // delegate call to object_t::max_size()
 
                return m_value.object->max_size();
 
                return m_data.m_value.object->max_size();
 
            }
 

	
 
            case value_t::null:
 
@@ -22184,7 +22317,6 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @}
 

	
 

	
 
    ///////////////
 
    // modifiers //
 
    ///////////////
 
@@ -22196,53 +22328,53 @@ class basic_json // NOLINT(cppcoreguidel
 
    /// @sa https://json.nlohmann.me/api/basic_json/clear/
 
    void clear() noexcept
 
    {
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::number_integer:
 
            {
 
                m_value.number_integer = 0;
 
                m_data.m_value.number_integer = 0;
 
                break;
 
            }
 

	
 
            case value_t::number_unsigned:
 
            {
 
                m_value.number_unsigned = 0;
 
                m_data.m_value.number_unsigned = 0;
 
                break;
 
            }
 

	
 
            case value_t::number_float:
 
            {
 
                m_value.number_float = 0.0;
 
                m_data.m_value.number_float = 0.0;
 
                break;
 
            }
 

	
 
            case value_t::boolean:
 
            {
 
                m_value.boolean = false;
 
                m_data.m_value.boolean = false;
 
                break;
 
            }
 

	
 
            case value_t::string:
 
            {
 
                m_value.string->clear();
 
                m_data.m_value.string->clear();
 
                break;
 
            }
 

	
 
            case value_t::binary:
 
            {
 
                m_value.binary->clear();
 
                m_data.m_value.binary->clear();
 
                break;
 
            }
 

	
 
            case value_t::array:
 
            {
 
                m_value.array->clear();
 
                m_data.m_value.array->clear();
 
                break;
 
            }
 

	
 
            case value_t::object:
 
            {
 
                m_value.object->clear();
 
                m_data.m_value.object->clear();
 
                break;
 
            }
 

	
 
@@ -22266,15 +22398,15 @@ class basic_json // NOLINT(cppcoreguidel
 
        // transform null object into an array
 
        if (is_null())
 
        {
 
            m_type = value_t::array;
 
            m_value = value_t::array;
 
            m_data.m_type = value_t::array;
 
            m_data.m_value = value_t::array;
 
            assert_invariant();
 
        }
 

	
 
        // add element to array (move semantics)
 
        const auto old_capacity = m_value.array->capacity();
 
        m_value.array->push_back(std::move(val));
 
        set_parent(m_value.array->back(), old_capacity);
 
        const auto old_capacity = m_data.m_value.array->capacity();
 
        m_data.m_value.array->push_back(std::move(val));
 
        set_parent(m_data.m_value.array->back(), old_capacity);
 
        // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor
 
    }
 

	
 
@@ -22299,15 +22431,15 @@ class basic_json // NOLINT(cppcoreguidel
 
        // transform null object into an array
 
        if (is_null())
 
        {
 
            m_type = value_t::array;
 
            m_value = value_t::array;
 
            m_data.m_type = value_t::array;
 
            m_data.m_value = value_t::array;
 
            assert_invariant();
 
        }
 

	
 
        // add element to array
 
        const auto old_capacity = m_value.array->capacity();
 
        m_value.array->push_back(val);
 
        set_parent(m_value.array->back(), old_capacity);
 
        const auto old_capacity = m_data.m_value.array->capacity();
 
        m_data.m_value.array->push_back(val);
 
        set_parent(m_data.m_value.array->back(), old_capacity);
 
    }
 

	
 
    /// @brief add an object to an array
 
@@ -22331,13 +22463,13 @@ class basic_json // NOLINT(cppcoreguidel
 
        // transform null object into an object
 
        if (is_null())
 
        {
 
            m_type = value_t::object;
 
            m_value = value_t::object;
 
            m_data.m_type = value_t::object;
 
            m_data.m_value = value_t::object;
 
            assert_invariant();
 
        }
 

	
 
        // add element to object
 
        auto res = m_value.object->insert(val);
 
        auto res = m_data.m_value.object->insert(val);
 
        set_parent(res.first->second);
 
    }
 

	
 
@@ -22387,15 +22519,15 @@ class basic_json // NOLINT(cppcoreguidel
 
        // transform null object into an array
 
        if (is_null())
 
        {
 
            m_type = value_t::array;
 
            m_value = value_t::array;
 
            m_data.m_type = value_t::array;
 
            m_data.m_value = value_t::array;
 
            assert_invariant();
 
        }
 

	
 
        // add element to array (perfect forwarding)
 
        const auto old_capacity = m_value.array->capacity();
 
        m_value.array->emplace_back(std::forward<Args>(args)...);
 
        return set_parent(m_value.array->back(), old_capacity);
 
        const auto old_capacity = m_data.m_value.array->capacity();
 
        m_data.m_value.array->emplace_back(std::forward<Args>(args)...);
 
        return set_parent(m_data.m_value.array->back(), old_capacity);
 
    }
 

	
 
    /// @brief add an object to an object if key does not exist
 
@@ -22412,13 +22544,13 @@ class basic_json // NOLINT(cppcoreguidel
 
        // transform null object into an object
 
        if (is_null())
 
        {
 
            m_type = value_t::object;
 
            m_value = value_t::object;
 
            m_data.m_type = value_t::object;
 
            m_data.m_value = value_t::object;
 
            assert_invariant();
 
        }
 

	
 
        // add element to array (perfect forwarding)
 
        auto res = m_value.object->emplace(std::forward<Args>(args)...);
 
        auto res = m_data.m_value.object->emplace(std::forward<Args>(args)...);
 
        set_parent(res.first->second);
 

	
 
        // create result iterator and set iterator to the result of emplace
 
@@ -22436,14 +22568,14 @@ class basic_json // NOLINT(cppcoreguidel
 
    iterator insert_iterator(const_iterator pos, Args&& ... args)
 
    {
 
        iterator result(this);
 
        JSON_ASSERT(m_value.array != nullptr);
 

	
 
        auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);
 
        m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
 
        result.m_it.array_iterator = m_value.array->begin() + insert_pos;
 
        JSON_ASSERT(m_data.m_value.array != nullptr);
 

	
 
        auto insert_pos = std::distance(m_data.m_value.array->begin(), pos.m_it.array_iterator);
 
        m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
 
        result.m_it.array_iterator = m_data.m_value.array->begin() + insert_pos;
 

	
 
        // This could have been written as:
 
        // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);
 
        // result.m_it.array_iterator = m_data.m_value.array->insert(pos.m_it.array_iterator, cnt, val);
 
        // but the return value of insert is missing in GCC 4.8, so it is written this way instead.
 

	
 
        set_parents();
 
@@ -22570,7 +22702,7 @@ class basic_json // NOLINT(cppcoreguidel
 
            JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", this));
 
        }
 

	
 
        m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
 
        m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
 
    }
 

	
 
    /// @brief updates a JSON object from another object, overwriting existing keys
 
@@ -22587,8 +22719,8 @@ class basic_json // NOLINT(cppcoreguidel
 
        // implicitly convert null value to an empty object
 
        if (is_null())
 
        {
 
            m_type = value_t::object;
 
            m_value.object = create<object_t>();
 
            m_data.m_type = value_t::object;
 
            m_data.m_value.object = create<object_t>();
 
            assert_invariant();
 
        }
 

	
 
@@ -22613,16 +22745,16 @@ class basic_json // NOLINT(cppcoreguidel
 
        {
 
            if (merge_objects && it.value().is_object())
 
            {
 
                auto it2 = m_value.object->find(it.key());
 
                if (it2 != m_value.object->end())
 
                auto it2 = m_data.m_value.object->find(it.key());
 
                if (it2 != m_data.m_value.object->end())
 
                {
 
                    it2->second.update(it.value(), true);
 
                    continue;
 
                }
 
            }
 
            m_value.object->operator[](it.key()) = it.value();
 
            m_data.m_value.object->operator[](it.key()) = it.value();
 
#if JSON_DIAGNOSTICS
 
            m_value.object->operator[](it.key()).m_parent = this;
 
            m_data.m_value.object->operator[](it.key()).m_parent = this;
 
#endif
 
        }
 
    }
 
@@ -22632,12 +22764,12 @@ class basic_json // NOLINT(cppcoreguidel
 
    void swap(reference other) noexcept (
 
        std::is_nothrow_move_constructible<value_t>::value&&
 
        std::is_nothrow_move_assignable<value_t>::value&&
 
        std::is_nothrow_move_constructible<json_value>::value&&
 
        std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
        std::is_nothrow_move_assignable<json_value>::value
 
    )
 
    {
 
        std::swap(m_type, other.m_type);
 
        std::swap(m_value, other.m_value);
 
        std::swap(m_data.m_type, other.m_data.m_type);
 
        std::swap(m_data.m_value, other.m_data.m_value);
 

	
 
        set_parents();
 
        other.set_parents();
 
@@ -22649,7 +22781,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    friend void swap(reference left, reference right) noexcept (
 
        std::is_nothrow_move_constructible<value_t>::value&&
 
        std::is_nothrow_move_assignable<value_t>::value&&
 
        std::is_nothrow_move_constructible<json_value>::value&&
 
        std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
        std::is_nothrow_move_assignable<json_value>::value
 
    )
 
    {
 
@@ -22658,13 +22790,13 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @brief exchanges the values
 
    /// @sa https://json.nlohmann.me/api/basic_json/swap/
 
    void swap(array_t& other) // NOLINT(bugprone-exception-escape)
 
    void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
    {
 
        // swap only works for arrays
 
        if (JSON_HEDLEY_LIKELY(is_array()))
 
        {
 
            using std::swap;
 
            swap(*(m_value.array), other);
 
            swap(*(m_data.m_value.array), other);
 
        }
 
        else
 
        {
 
@@ -22674,13 +22806,13 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @brief exchanges the values
 
    /// @sa https://json.nlohmann.me/api/basic_json/swap/
 
    void swap(object_t& other) // NOLINT(bugprone-exception-escape)
 
    void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
    {
 
        // swap only works for objects
 
        if (JSON_HEDLEY_LIKELY(is_object()))
 
        {
 
            using std::swap;
 
            swap(*(m_value.object), other);
 
            swap(*(m_data.m_value.object), other);
 
        }
 
        else
 
        {
 
@@ -22690,13 +22822,13 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @brief exchanges the values
 
    /// @sa https://json.nlohmann.me/api/basic_json/swap/
 
    void swap(string_t& other) // NOLINT(bugprone-exception-escape)
 
    void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
    {
 
        // swap only works for strings
 
        if (JSON_HEDLEY_LIKELY(is_string()))
 
        {
 
            using std::swap;
 
            swap(*(m_value.string), other);
 
            swap(*(m_data.m_value.string), other);
 
        }
 
        else
 
        {
 
@@ -22706,13 +22838,13 @@ class basic_json // NOLINT(cppcoreguidel
 

	
 
    /// @brief exchanges the values
 
    /// @sa https://json.nlohmann.me/api/basic_json/swap/
 
    void swap(binary_t& other) // NOLINT(bugprone-exception-escape)
 
    void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
    {
 
        // swap only works for strings
 
        if (JSON_HEDLEY_LIKELY(is_binary()))
 
        {
 
            using std::swap;
 
            swap(*(m_value.binary), other);
 
            swap(*(m_data.m_value.binary), other);
 
        }
 
        else
 
        {
 
@@ -22728,7 +22860,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        if (JSON_HEDLEY_LIKELY(is_binary()))
 
        {
 
            using std::swap;
 
            swap(*(m_value.binary), other);
 
            swap(*(m_data.m_value.binary), other);
 
        }
 
        else
 
        {
 
@@ -22756,31 +22888,31 @@ class basic_json // NOLINT(cppcoreguidel
 
        switch (lhs_type)                                                                                \
 
        {                                                                                                \
 
            case value_t::array:                                                                         \
 
                return (*lhs.m_value.array) op (*rhs.m_value.array);                                     \
 
                return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array);                                     \
 
                \
 
            case value_t::object:                                                                        \
 
                return (*lhs.m_value.object) op (*rhs.m_value.object);                                   \
 
                return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object);                                   \
 
                \
 
            case value_t::null:                                                                          \
 
                return (null_result);                                                                    \
 
                \
 
            case value_t::string:                                                                        \
 
                return (*lhs.m_value.string) op (*rhs.m_value.string);                                   \
 
                return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string);                                   \
 
                \
 
            case value_t::boolean:                                                                       \
 
                return (lhs.m_value.boolean) op (rhs.m_value.boolean);                                   \
 
                return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean);                                   \
 
                \
 
            case value_t::number_integer:                                                                \
 
                return (lhs.m_value.number_integer) op (rhs.m_value.number_integer);                     \
 
                return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer);                     \
 
                \
 
            case value_t::number_unsigned:                                                               \
 
                return (lhs.m_value.number_unsigned) op (rhs.m_value.number_unsigned);                   \
 
                return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned);                   \
 
                \
 
            case value_t::number_float:                                                                  \
 
                return (lhs.m_value.number_float) op (rhs.m_value.number_float);                         \
 
                return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float);                         \
 
                \
 
            case value_t::binary:                                                                        \
 
                return (*lhs.m_value.binary) op (*rhs.m_value.binary);                                   \
 
                return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary);                                   \
 
                \
 
            case value_t::discarded:                                                                     \
 
            default:                                                                                     \
 
@@ -22789,27 +22921,27 @@ class basic_json // NOLINT(cppcoreguidel
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)                   \
 
    {                                                                                                    \
 
        return static_cast<number_float_t>(lhs.m_value.number_integer) op rhs.m_value.number_float;      \
 
        return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float;      \
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)                   \
 
    {                                                                                                    \
 
        return lhs.m_value.number_float op static_cast<number_float_t>(rhs.m_value.number_integer);      \
 
        return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer);      \
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)                  \
 
    {                                                                                                    \
 
        return static_cast<number_float_t>(lhs.m_value.number_unsigned) op rhs.m_value.number_float;     \
 
        return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float;     \
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)                  \
 
    {                                                                                                    \
 
        return lhs.m_value.number_float op static_cast<number_float_t>(rhs.m_value.number_unsigned);     \
 
        return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned);     \
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)                \
 
    {                                                                                                    \
 
        return static_cast<number_integer_t>(lhs.m_value.number_unsigned) op rhs.m_value.number_integer; \
 
        return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \
 
    }                                                                                                    \
 
    else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)                \
 
    {                                                                                                    \
 
        return lhs.m_value.number_integer op static_cast<number_integer_t>(rhs.m_value.number_unsigned); \
 
        return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \
 
    }                                                                                                    \
 
    else if(compares_unordered(lhs, rhs))\
 
    {\
 
@@ -22826,8 +22958,8 @@ class basic_json // NOLINT(cppcoreguidel
 
    // an operation is computed as an odd number of inverses of others
 
    static bool compares_unordered(const_reference lhs, const_reference rhs, bool inverse = false) noexcept
 
    {
 
        if ((lhs.is_number_float() && std::isnan(lhs.m_value.number_float) && rhs.is_number())
 
                || (rhs.is_number_float() && std::isnan(rhs.m_value.number_float) && lhs.is_number()))
 
        if ((lhs.is_number_float() && std::isnan(lhs.m_data.m_value.number_float) && rhs.is_number())
 
                || (rhs.is_number_float() && std::isnan(rhs.m_data.m_value.number_float) && lhs.is_number()))
 
        {
 
            return true;
 
        }
 
@@ -23171,7 +23303,6 @@ class basic_json // NOLINT(cppcoreguidel
 
#endif  // JSON_NO_IO
 
    /// @}
 

	
 

	
 
    /////////////////////
 
    // deserialization //
 
    /////////////////////
 
@@ -23328,7 +23459,7 @@ class basic_json // NOLINT(cppcoreguidel
 
    JSON_HEDLEY_RETURNS_NON_NULL
 
    const char* type_name() const noexcept
 
    {
 
        switch (m_type)
 
        switch (m_data.m_type)
 
        {
 
            case value_t::null:
 
                return "null";
 
@@ -23352,17 +23483,43 @@ class basic_json // NOLINT(cppcoreguidel
 
        }
 
    }
 

	
 

	
 
  JSON_PRIVATE_UNLESS_TESTED:
 
    //////////////////////
 
    // member variables //
 
    //////////////////////
 

	
 
    /// the type of the current element
 
    value_t m_type = value_t::null;
 

	
 
    /// the value of the current element
 
    json_value m_value = {};
 
    struct data
 
    {
 
        /// the type of the current element
 
        value_t m_type = value_t::null;
 

	
 
        /// the value of the current element
 
        json_value m_value = {};
 

	
 
        data(const value_t v)
 
            : m_type(v), m_value(v)
 
        {
 
        }
 

	
 
        data(size_type cnt, const basic_json& val)
 
            : m_type(value_t::array)
 
        {
 
            m_value.array = create<array_t>(cnt, val);
 
        }
 

	
 
        data() noexcept = default;
 
        data(data&&) noexcept = default;
 
        data(const data&) noexcept = delete;
 
        data& operator=(data&&) noexcept = delete;
 
        data& operator=(const data&) noexcept = delete;
 

	
 
        ~data() noexcept
 
        {
 
            m_value.destroy(m_type);
 
        }
 
    };
 

	
 
    data m_data = {};
 

	
 
#if JSON_DIAGNOSTICS
 
    /// a pointer to a parent value (for debugging purposes)
 
@@ -23543,7 +23700,6 @@ class basic_json // NOLINT(cppcoreguidel
 
        return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
 
    }
 

	
 

	
 
    JSON_HEDLEY_WARN_UNUSED_RESULT
 
    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
 
    static basic_json from_cbor(detail::span_input_adapter&& i,
 
@@ -23667,7 +23823,6 @@ class basic_json // NOLINT(cppcoreguidel
 
        return res ? result : basic_json(value_t::discarded);
 
    }
 

	
 

	
 
    /// @brief create a JSON value from an input in BJData format
 
    /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/
 
    template<typename InputType>
 
@@ -23890,7 +24045,7 @@ class basic_json // NOLINT(cppcoreguidel
 
            }
 

	
 
            // make sure the top element of the pointer exists
 
            json_pointer top_pointer = ptr.top();
 
            json_pointer const top_pointer = ptr.top();
 
            if (top_pointer != ptr)
 
            {
 
                result.at(top_pointer);
 
@@ -23902,7 +24057,7 @@ class basic_json // NOLINT(cppcoreguidel
 
            // parent must exist when performing patch add per RFC6902 specs
 
            basic_json& parent = result.at(ptr);
 

	
 
            switch (parent.m_type)
 
            switch (parent.m_data.m_type)
 
            {
 
                case value_t::null:
 
                case value_t::object:
 
@@ -23948,7 +24103,7 @@ class basic_json // NOLINT(cppcoreguidel
 
        };
 

	
 
        // wrapper for "remove" operation; remove value at ptr
 
        const auto operation_remove = [this, &result](json_pointer & ptr)
 
        const auto operation_remove = [this, & result](json_pointer & ptr)
 
        {
 
            // get reference to parent of JSON pointer ptr
 
            const auto last_path = ptr.back();
 
@@ -23991,13 +24146,13 @@ class basic_json // NOLINT(cppcoreguidel
 
                                          bool string_type) -> basic_json &
 
            {
 
                // find value
 
                auto it = val.m_value.object->find(member);
 
                auto it = val.m_data.m_value.object->find(member);
 

	
 
                // context-sensitive error message
 
                const auto error_msg = (op == "op") ? "operation" : detail::concat("operation '", op, '\'');
 

	
 
                // check if desired value is present
 
                if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end()))
 
                if (JSON_HEDLEY_UNLIKELY(it == val.m_data.m_value.object->end()))
 
                {
 
                    // NOLINTNEXTLINE(performance-inefficient-string-concatenation)
 
                    JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, " must have member '", member, "'"), &val));
 
@@ -24052,7 +24207,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                    json_pointer from_ptr(from_path);
 

	
 
                    // the "from" location must exist - use at()
 
                    basic_json v = result.at(from_ptr);
 
                    basic_json const v = result.at(from_ptr);
 

	
 
                    // The move operation is functionally identical to a
 
                    // "remove" operation on the "from" location, followed
 
@@ -24069,7 +24224,7 @@ class basic_json // NOLINT(cppcoreguidel
 
                    const json_pointer from_ptr(from_path);
 

	
 
                    // the "from" location must exist - use at()
 
                    basic_json v = result.at(from_ptr);
 
                    basic_json const v = result.at(from_ptr);
 

	
 
                    // The copy is functionally identical to an "add"
 
                    // operation at the target location using the value
 
@@ -24311,7 +24466,11 @@ inline namespace json_literals
 
/// @brief user-defined string literal for JSON values
 
/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/
 
JSON_HEDLEY_NON_NULL(1)
 
inline nlohmann::json operator "" _json(const char* s, std::size_t n)
 
#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
 
    inline nlohmann::json operator ""_json(const char* s, std::size_t n)
 
#else
 
    inline nlohmann::json operator "" _json(const char* s, std::size_t n)
 
#endif
 
{
 
    return nlohmann::json::parse(s, s + n);
 
}
 
@@ -24319,7 +24478,11 @@ inline nlohmann::json operator "" _json(
 
/// @brief user-defined string literal for JSON pointer
 
/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/
 
JSON_HEDLEY_NON_NULL(1)
 
inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n)
 
#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
 
    inline nlohmann::json::json_pointer operator ""_json_pointer(const char* s, std::size_t n)
 
#else
 
    inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n)
 
#endif
 
{
 
    return nlohmann::json::json_pointer(std::string(s, n));
 
}
 
@@ -24338,7 +24501,7 @@ namespace std // NOLINT(cert-dcl58-cpp)
 
/// @brief hash value for JSON objects
 
/// @sa https://json.nlohmann.me/api/basic_json/std_hash/
 
NLOHMANN_BASIC_JSON_TPL_DECLARATION
 
struct hash<nlohmann::NLOHMANN_BASIC_JSON_TPL>
 
struct hash<nlohmann::NLOHMANN_BASIC_JSON_TPL> // NOLINT(cert-dcl58-cpp)
 
{
 
    std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const
 
    {
 
@@ -24371,8 +24534,8 @@ struct less< ::nlohmann::detail::value_t
 
/// @brief exchanges the values of two JSON objects
 
/// @sa https://json.nlohmann.me/api/basic_json/std_swap/
 
NLOHMANN_BASIC_JSON_TPL_DECLARATION
 
inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept(  // NOLINT(readability-inconsistent-declaration-parameter-name)
 
    is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&&                          // NOLINT(misc-redundant-expression)
 
inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept(  // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp)
 
    is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&&                          // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
 
    is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)
 
{
 
    j1.swap(j2);
 
@@ -24383,17 +24546,22 @@ inline void swap(nlohmann::NLOHMANN_BASI
 
}  // namespace std
 

	
 
#if JSON_USE_GLOBAL_UDLS
 
    using nlohmann::literals::json_literals::operator "" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
    using nlohmann::literals::json_literals::operator "" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
    #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
 
        using nlohmann::literals::json_literals::operator ""_json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
        using nlohmann::literals::json_literals::operator ""_json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
    #else
 
        using nlohmann::literals::json_literals::operator "" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
        using nlohmann::literals::json_literals::operator "" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)
 
    #endif
 
#endif
 

	
 
// #include <nlohmann/detail/macro_unscope.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
 
@@ -24428,16 +24596,17 @@ inline void swap(nlohmann::NLOHMANN_BASI
 
    #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
 
    #undef JSON_HAS_THREE_WAY_COMPARISON
 
    #undef JSON_HAS_RANGES
 
    #undef JSON_HAS_STATIC_RTTI
 
    #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
 
#endif
 

	
 
// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
 
//     __ _____ _____ _____
 
//  __|  |   __|     |   | |  JSON for Modern C++
 
// |  |  |__   |  |  | | | |  version 3.11.2
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
 
// |  |  |__   |  |  | | | |  version 3.11.3
 
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 
//
 
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 
// SPDX-License-Identifier: MIT
 

	
 

	
0 comments (0 inline, 0 general)