/*
 *  Catch v2.13.7
 *  Generated: 2021-07-28 20:29:27.753164
 *  ----------------------------------------------------------
 *  This file has been merged from multiple headers. Please don't edit it
 * directly Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved.
 *
 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 */
#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
// start catch.hpp

#define CATCH_VERSION_MAJOR 2
#define CATCH_VERSION_MINOR 13
#define CATCH_VERSION_PATCH 7

#ifdef __clang__
#pragma clang system_header
#elif defined __GNUC__
#pragma GCC system_header
#endif

// start catch_suppress_warnings.h

#ifdef __clang__
#ifdef __ICC // icpc defines the __clang__ macro
#pragma warning(push)
#pragma warning(disable : 161 1682)
#else // __ICC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#pragma clang diagnostic ignored "-Wswitch-enum"
#pragma clang diagnostic ignored "-Wcovered-switch-default"
#endif
#elif defined __GNUC__
// Because REQUIREs trigger GCC's -Wparentheses, and because still
// supported version of g++ have only buggy support for _Pragmas,
// Wparentheses have to be suppressed globally.
#pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wpadded"
#endif
// end catch_suppress_warnings.h
#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
#define CATCH_IMPL
#define CATCH_CONFIG_ALL_PARTS
#endif

// In the impl file, we want to have access to all parts of the headers
// Can also be used to sanely support PCHs
#if defined(CATCH_CONFIG_ALL_PARTS)
#define CATCH_CONFIG_EXTERNAL_INTERFACES
#if defined(CATCH_CONFIG_DISABLE_MATCHERS)
#undef CATCH_CONFIG_DISABLE_MATCHERS
#endif
#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#endif
#endif

#if !defined(CATCH_CONFIG_IMPL_ONLY)
// start catch_platform.h

// See e.g.:
// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html
#ifdef __APPLE__
#include <TargetConditionals.h>
#if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1)
#define CATCH_PLATFORM_MAC
#elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1)
#define CATCH_PLATFORM_IPHONE
#endif

#elif defined(linux) || defined(__linux) || defined(__linux__)
#define CATCH_PLATFORM_LINUX

#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ||              \
    defined(__MINGW32__)
#define CATCH_PLATFORM_WINDOWS
#endif

// end catch_platform.h

#ifdef CATCH_IMPL
#ifndef CLARA_CONFIG_MAIN
#define CLARA_CONFIG_MAIN_NOT_DEFINED
#define CLARA_CONFIG_MAIN
#endif
#endif

// start catch_user_interfaces.h

namespace Catch {
    unsigned int rngSeed();
}

// end catch_user_interfaces.h
// start catch_tag_alias_autoregistrar.h

// start catch_common.h

// start catch_compiler_capabilities.h

// Detect a number of compiler features - by compiler
// The following features are defined:
//
// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?
// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?
// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?
// ****************
// Note to maintainers: if new toggles are added please document them
// in configuration.md, too
// ****************

// In general each macro has a _NO_<feature name> form
// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.
// Many features, at point of detection, define an _INTERNAL_ macro, so they
// can be combined, en-mass, with the _NO_ forms later.

#ifdef __cplusplus

#if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
#define CATCH_CPP14_OR_GREATER
#endif

#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
#define CATCH_CPP17_OR_GREATER
#endif

#endif

// Only GCC compiler should be used in this block, so other compilers trying to
// mask themselves as GCC should be ignored.
#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) &&         \
    !defined(__LCC__)
#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma("GCC diagnostic push")
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma("GCC diagnostic pop")

#define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)

#endif

#if defined(__clang__)

#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma("clang diagnostic push")
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma("clang diagnostic pop")

// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
// which results in calls to destructors being emitted for each temporary,
// without a matching initialization. In practice, this can result in something
// like `std::string::~string` being called on an uninitialized value.
//
// For example, this code will likely segfault under IBM XL:
// ```
// REQUIRE(std::string("12") + "34" == "1234")
// ```
//
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
#if !defined(__ibmxl__) && !defined(__CUDACC__)
#define CATCH_INTERNAL_IGNORE_BUT_WARN(...)                                                        \
    (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg,           \
                                               hicpp-vararg) */
#endif

#define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                   \
    _Pragma("clang diagnostic ignored \"-Wexit-time-destructors\"")                                \
        _Pragma("clang diagnostic ignored \"-Wglobal-constructors\"")

#define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS                                               \
    _Pragma("clang diagnostic ignored \"-Wparentheses\"")

#define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                    \
    _Pragma("clang diagnostic ignored \"-Wunused-variable\"")

#define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                             \
    _Pragma("clang diagnostic ignored "                                                            \
            "\"-Wgnu-zero-variadic-macro-arguments\"")

#define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                           \
    _Pragma("clang diagnostic ignored \"-Wunused-template\"")

#endif // __clang__

////////////////////////////////////////////////////////////////////////////////
// Assume that non-Windows platforms support posix signals by default
#if !defined(CATCH_PLATFORM_WINDOWS)
#define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS
#endif

////////////////////////////////////////////////////////////////////////////////
// We know some environments not to support full POSIX signals
#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)
#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
#endif

#ifdef __OS400__
#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
#define CATCH_CONFIG_COLOUR_NONE
#endif

////////////////////////////////////////////////////////////////////////////////
// Android somehow still does not support std::to_string
#if defined(__ANDROID__)
#define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
#define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE
#endif

////////////////////////////////////////////////////////////////////////////////
// Not all Windows environments support SEH properly
#if defined(__MINGW32__)
#define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
#endif

////////////////////////////////////////////////////////////////////////////////
// PS4
#if defined(__ORBIS__)
#define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
#endif

////////////////////////////////////////////////////////////////////////////////
// Cygwin
#ifdef __CYGWIN__

// Required for some versions of Cygwin to declare gettimeofday
// see:
// http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin
#define _BSD_SOURCE
// some versions of cygwin (most) do not support std::to_string. Use the libstd
// check.
// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html
// line 2812-2813
#if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) &&                                     \
      !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

#define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING

#endif
#endif // __CYGWIN__

////////////////////////////////////////////////////////////////////////////////
// Visual C++
#if defined(_MSC_VER)

#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma(warning(push))
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma(warning(pop))

// Universal Windows platform does not support SEH
// Or console colours (or console at all...)
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
#define CATCH_CONFIG_COLOUR_NONE
#else
#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
#endif

// MSVC traditional preprocessor needs some workaround for __VA_ARGS__
// _MSVC_TRADITIONAL == 0 means new conformant preprocessor
// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor
#if !defined(__clang__) // Handle Clang masquerading for msvc
#if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
#define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#endif // MSVC_TRADITIONAL
#endif // __clang__

#endif // _MSC_VER

#if defined(_REENTRANT) || defined(_MSC_VER)
// Enable async processing, as -pthread is specified or no additional linking is
// required
#define CATCH_INTERNAL_CONFIG_USE_ASYNC
#endif // _MSC_VER

////////////////////////////////////////////////////////////////////////////////
// Check if we are compiled with -fno-exceptions or equivalent
#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)
#define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED
#endif

////////////////////////////////////////////////////////////////////////////////
// DJGPP
#ifdef __DJGPP__
#define CATCH_INTERNAL_CONFIG_NO_WCHAR
#endif // __DJGPP__

////////////////////////////////////////////////////////////////////////////////
// Embarcadero C++Build
#if defined(__BORLANDC__)
#define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
#endif

////////////////////////////////////////////////////////////////////////////////

// Use of __COUNTER__ is suppressed during code analysis in
// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly
// handled by it.
// Otherwise all supported compilers support COUNTER macro,
// but user still might want to turn it off
#if (!defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L)
#define CATCH_INTERNAL_CONFIG_COUNTER
#endif

////////////////////////////////////////////////////////////////////////////////

// RTX is a special version of Windows that is real time.
// This means that it is detected as Windows, but does not provide
// the same set of capabilities as real Windows does.
#if defined(UNDER_RTSS) || defined(RTX64_BUILD)
#define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
#define CATCH_INTERNAL_CONFIG_NO_ASYNC
#define CATCH_CONFIG_COLOUR_NONE
#endif

#if !defined(_GLIBCXX_USE_C99_MATH_TR1)
#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
#endif

// Various stdlib support checks that require __has_include
#if defined(__has_include)
// Check if string_view is available and usable
#if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
#define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
#endif

// Check if optional is available and usable
#if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
#define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
#endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)

// Check if byte is available and usable
#if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
#include <cstddef>
#if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0)
#define CATCH_INTERNAL_CONFIG_CPP17_BYTE
#endif
#endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)

// Check if variant is available and usable
#if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
#if defined(__clang__) && (__clang_major__ < 8)
// work around clang bug with libstdc++
// https://bugs.llvm.org/show_bug.cgi?id=31852 fix should be in clang 8,
// workaround in libstdc++ 8.2
#include <ciso646>
#if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
#define CATCH_CONFIG_NO_CPP17_VARIANT
#else
#define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
#endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE
       // < 9)
#else
#define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
#endif // defined(__clang__) && (__clang_major__ < 8)
#endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
#endif // defined(__has_include)

#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) &&                 \
    !defined(CATCH_CONFIG_COUNTER)
#define CATCH_CONFIG_COUNTER
#endif
#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) &&         \
    !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)
#define CATCH_CONFIG_WINDOWS_SEH
#endif
// This is set by default, because we assume that unix compilers are
// posix-signal-compatible by default.
#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) &&                                                \
    !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && \
    !defined(CATCH_CONFIG_POSIX_SIGNALS)
#define CATCH_CONFIG_POSIX_SIGNALS
#endif
// This is set by default, because we assume that compilers with no wchar_t
// support are just rare exceptions.
#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) &&                 \
    !defined(CATCH_CONFIG_WCHAR)
#define CATCH_CONFIG_WCHAR
#endif

#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) &&                                          \
    !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)
#define CATCH_CONFIG_CPP11_TO_STRING
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) &&   \
    !defined(CATCH_CONFIG_CPP17_OPTIONAL)
#define CATCH_CONFIG_CPP17_OPTIONAL
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) &&                                            \
    !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
#define CATCH_CONFIG_CPP17_STRING_VIEW
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) &&     \
    !defined(CATCH_CONFIG_CPP17_VARIANT)
#define CATCH_CONFIG_CPP17_VARIANT
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) &&           \
    !defined(CATCH_CONFIG_CPP17_BYTE)
#define CATCH_CONFIG_CPP17_BYTE
#endif

#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
#define CATCH_INTERNAL_CONFIG_NEW_CAPTURE
#endif

#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) &&                                                  \
    !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) &&     \
    !defined(CATCH_CONFIG_NEW_CAPTURE)
#define CATCH_CONFIG_NEW_CAPTURE
#endif

#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
#define CATCH_CONFIG_DISABLE_EXCEPTIONS
#endif

#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) &&   \
    !defined(CATCH_CONFIG_POLYFILL_ISNAN)
#define CATCH_CONFIG_POLYFILL_ISNAN
#endif

#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) &&        \
    !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)
#define CATCH_CONFIG_USE_ASYNC
#endif

#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) &&                                             \
    !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)
#define CATCH_CONFIG_ANDROID_LOGWRITE
#endif

#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) &&                                             \
    !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
#define CATCH_CONFIG_GLOBAL_NEXTAFTER
#endif

// Even if we do not think the compiler has that warning, we still have
// to provide a macro that can be used by the code.
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
#endif
#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
#endif

// The goal of this macro is to avoid evaluation of the arguments, but
// still have the compiler warn on problems inside...
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
#define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
#endif

#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
#undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#elif defined(__clang__) && (__clang_major__ < 5)
#undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#endif

#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#endif

#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
#define CATCH_TRY if ((true))
#define CATCH_CATCH_ALL if ((false))
#define CATCH_CATCH_ANON(type) if ((false))
#else
#define CATCH_TRY try
#define CATCH_CATCH_ALL catch (...)
#define CATCH_CATCH_ANON(type) catch (type)
#endif

#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) &&                                \
    !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) &&                                     \
    !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)
#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#endif

// end catch_compiler_capabilities.h
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line) name##line
#define INTERNAL_CATCH_UNIQUE_NAME_LINE(name, line) INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line)
#ifdef CATCH_CONFIG_COUNTER
#define INTERNAL_CATCH_UNIQUE_NAME(name) INTERNAL_CATCH_UNIQUE_NAME_LINE(name, __COUNTER__)
#else
#define INTERNAL_CATCH_UNIQUE_NAME(name) INTERNAL_CATCH_UNIQUE_NAME_LINE(name, __LINE__)
#endif

#include <iosfwd>
#include <string>
#include <cstdint>

// We need a dummy global operator<< so we can bring it into Catch namespace
// later
struct Catch_global_namespace_dummy {};
std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);

namespace Catch {

    struct CaseSensitive {
        enum Choice { Yes, No };
    };

    class NonCopyable {
        NonCopyable(NonCopyable const&) = delete;
        NonCopyable(NonCopyable&&) = delete;
        NonCopyable& operator=(NonCopyable const&) = delete;
        NonCopyable& operator=(NonCopyable&&) = delete;

    protected:
        NonCopyable();
        virtual ~NonCopyable();
    };

    struct SourceLineInfo {

        SourceLineInfo() = delete;
        SourceLineInfo(char const* _file, std::size_t _line) noexcept : file(_file), line(_line) {}

        SourceLineInfo(SourceLineInfo const& other) = default;
        SourceLineInfo& operator=(SourceLineInfo const&) = default;
        SourceLineInfo(SourceLineInfo&&) noexcept = default;
        SourceLineInfo& operator=(SourceLineInfo&&) noexcept = default;

        bool empty() const noexcept { return file[0] == '\0'; }
        bool operator==(SourceLineInfo const& other) const noexcept;
        bool operator<(SourceLineInfo const& other) const noexcept;

        char const* file;
        std::size_t line;
    };

    std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info);

    // Bring in operator<< from global namespace into Catch namespace
    // This is necessary because the overload of operator<< above makes
    // lookup stop at namespace Catch
    using ::operator<<;

    // Use this in variadic streaming macros to allow
    //    >> +StreamEndStop
    // as well as
    //    >> stuff +StreamEndStop
    struct StreamEndStop {
        std::string operator+() const;
    };
    template <typename T> T const& operator+(T const& value, StreamEndStop) { return value; }
} // namespace Catch

#define CATCH_INTERNAL_LINEINFO                                                                    \
    ::Catch::SourceLineInfo(__FILE__, static_cast<std::size_t>(__LINE__))

// end catch_common.h
namespace Catch {

    struct RegistrarForTagAliases {
        RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo);
    };

} // end namespace Catch

#define CATCH_REGISTER_TAG_ALIAS(alias, spec)                                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME(AutoRegisterTagAlias)(            \
            alias, spec, CATCH_INTERNAL_LINEINFO);                                                 \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

// end catch_tag_alias_autoregistrar.h
// start catch_test_registry.h

// start catch_interfaces_testcase.h

#include <vector>

namespace Catch {

    class TestSpec;

    struct ITestInvoker {
        virtual void invoke() const = 0;
        virtual ~ITestInvoker();
    };

    class TestCase;
    struct IConfig;

    struct ITestCaseRegistry {
        virtual ~ITestCaseRegistry();
        virtual std::vector<TestCase> const& getAllTests() const = 0;
        virtual std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const = 0;
    };

    bool isThrowSafe(TestCase const& testCase, IConfig const& config);
    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config);
    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config);
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config);

} // namespace Catch

// end catch_interfaces_testcase.h
// start catch_stringref.h

#include <cstddef>
#include <string>
#include <iosfwd>
#include <cassert>

namespace Catch {

    /// A non-owning string class (similar to the forthcoming std::string_view)
    /// Note that, because a StringRef may be a substring of another string,
    /// it may not be null terminated.
    class StringRef {
    public:
        using size_type = std::size_t;
        using const_iterator = const char*;

    private:
        static constexpr char const* const s_empty = "";

        char const* m_start = s_empty;
        size_type m_size = 0;

    public: // construction
        constexpr StringRef() noexcept = default;

        StringRef(char const* rawChars) noexcept;

        constexpr StringRef(char const* rawChars, size_type size) noexcept :
            m_start(rawChars), m_size(size) {}

        StringRef(std::string const& stdString) noexcept :
            m_start(stdString.c_str()), m_size(stdString.size()) {}

        explicit operator std::string() const { return std::string(m_start, m_size); }

    public: // operators
        auto operator==(StringRef const& other) const noexcept -> bool;
        auto operator!=(StringRef const& other) const noexcept -> bool { return !(*this == other); }

        auto operator[](size_type index) const noexcept -> char {
            assert(index < m_size);
            return m_start[index];
        }

    public: // named queries
        constexpr auto empty() const noexcept -> bool { return m_size == 0; }
        constexpr auto size() const noexcept -> size_type { return m_size; }

        // Returns the current start pointer. If the StringRef is not
        // null-terminated, throws std::domain_exception
        auto c_str() const -> char const*;

    public: // substrings and searches
        // Returns a substring of [start, start + length).
        // If start + length > size(), then the substring is [start, size()).
        // If start > size(), then the substring is empty.
        auto substr(size_type start, size_type length) const noexcept -> StringRef;

        // Returns the current start pointer. May not be null-terminated.
        auto data() const noexcept -> char const*;

        constexpr auto isNullTerminated() const noexcept -> bool { return m_start[m_size] == '\0'; }

    public: // iterators
        constexpr const_iterator begin() const { return m_start; }
        constexpr const_iterator end() const { return m_start + m_size; }
    };

    auto operator+=(std::string& lhs, StringRef const& sr) -> std::string&;
    auto operator<<(std::ostream& os, StringRef const& sr) -> std::ostream&;

    constexpr auto operator"" _sr(char const* rawChars, std::size_t size) noexcept -> StringRef {
        return StringRef(rawChars, size);
    }
} // namespace Catch

constexpr auto operator"" _catch_sr(char const* rawChars, std::size_t size) noexcept
    -> Catch::StringRef {
    return Catch::StringRef(rawChars, size);
}

// end catch_stringref.h
// start catch_preprocessor.hpp

#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__
#define CATCH_RECURSION_LEVEL1(...)                                                                \
    CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL2(...)                                                                \
    CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL3(...)                                                                \
    CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL4(...)                                                                \
    CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL5(...)                                                                \
    CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))

#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__
// MSVC needs more evaluations
#define CATCH_RECURSION_LEVEL6(...)                                                                \
    CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))
#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))
#else
#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__)
#endif

#define CATCH_REC_END(...)
#define CATCH_REC_OUT

#define CATCH_EMPTY()
#define CATCH_DEFER(id) id CATCH_EMPTY()

#define CATCH_REC_GET_END2() 0, CATCH_REC_END
#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2
#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1
#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT
#define CATCH_REC_NEXT1(test, next) CATCH_DEFER(CATCH_REC_NEXT0)(test, next, 0)
#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)

#define CATCH_REC_LIST0(f, x, peek, ...)                                                           \
    , f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1))(f, peek, __VA_ARGS__)
#define CATCH_REC_LIST1(f, x, peek, ...)                                                           \
    , f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST0))(f, peek, __VA_ARGS__)
#define CATCH_REC_LIST2(f, x, peek, ...)                                                           \
    f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1))(f, peek, __VA_ARGS__)

#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...)                                              \
    , f(userdata, x)                                                                               \
          CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD))(f, userdata, peek, __VA_ARGS__)
#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...)                                              \
    , f(userdata, x)                                                                               \
          CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD))(f, userdata, peek, __VA_ARGS__)
#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...)                                              \
    f(userdata, x)                                                                                 \
        CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD))(f, userdata, peek, __VA_ARGS__)

// Applies the function macro `f` to each of the remaining parameters, inserts
// commas between the results, and passes userdata as the first parameter to
// each invocation, e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a),
// f(x, b), f(x, c)
#define CATCH_REC_LIST_UD(f, userdata, ...)                                                        \
    CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))

#define CATCH_REC_LIST(f, ...)                                                                     \
    CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))

#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)
#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO##__VA_ARGS__
#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__
#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)
#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__
#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param)                                             \
    INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))
#else
// MSVC is adding extra space and needs another indirection to expand
// INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)
#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__
#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param)                                             \
    (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)
#endif

#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__
#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)

#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...)                                                        \
    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())
#define INTERNAL_CATCH_MAKE_TYPE_LIST(...)                                                         \
    INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))
#else
#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...)                                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))
#define INTERNAL_CATCH_MAKE_TYPE_LIST(...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
#endif

#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)                                             \
    CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST, __VA_ARGS__)

#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)
#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1)                                                 \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)
#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2)                                             \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)
#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3)                                         \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)
#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4)                                     \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)
#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5)                                 \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)
#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6)                             \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6)
#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7)                         \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)
#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8)                     \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)
#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9)                \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)
#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10)           \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)

#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N

#define INTERNAL_CATCH_TYPE_GEN                                                                    \
    template <typename...> struct TypeList {};                                                     \
    template <typename... Ts> constexpr auto get_wrapper() noexcept->TypeList<Ts...> {             \
        return {};                                                                                 \
    }                                                                                              \
    template <template <typename...> class...> struct TemplateTypeList {};                         \
    template <template <typename...> class... Cs>                                                  \
    constexpr auto get_wrapper() noexcept->TemplateTypeList<Cs...> {                               \
        return {};                                                                                 \
    }                                                                                              \
    template <typename...> struct append;                                                          \
    template <typename...> struct rewrap;                                                          \
    template <template <typename...> class, typename...> struct create;                            \
    template <template <typename...> class, typename> struct convert;                              \
                                                                                                   \
    template <typename T> struct append<T> { using type = T; };                                    \
    template <template <typename...> class L1,                                                     \
              typename... E1,                                                                      \
              template <typename...>                                                               \
              class L2,                                                                            \
              typename... E2,                                                                      \
              typename... Rest>                                                                    \
    struct append<L1<E1...>, L2<E2...>, Rest...> {                                                 \
        using type = typename append<L1<E1..., E2...>, Rest...>::type;                             \
    };                                                                                             \
    template <template <typename...> class L1, typename... E1, typename... Rest>                   \
    struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> {                                        \
        using type = L1<E1...>;                                                                    \
    };                                                                                             \
                                                                                                   \
    template <template <typename...> class Container,                                              \
              template <typename...>                                                               \
              class List,                                                                          \
              typename... elems>                                                                   \
    struct rewrap<TemplateTypeList<Container>, List<elems...>> {                                   \
        using type = TypeList<Container<elems...>>;                                                \
    };                                                                                             \
    template <template <typename...> class Container,                                              \
              template <typename...>                                                               \
              class List,                                                                          \
              class... Elems,                                                                      \
              typename... Elements>                                                                \
    struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> {                      \
        using type = typename append<                                                              \
            TypeList<Container<Elems...>>,                                                         \
            typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type;                \
    };                                                                                             \
                                                                                                   \
    template <template <typename...> class Final,                                                  \
              template <typename...>                                                               \
              class... Containers,                                                                 \
              typename... Types>                                                                   \
    struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> {                    \
        using type = typename append<                                                              \
            Final<>,                                                                               \
            typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type;               \
    };                                                                                             \
    template <template <typename...> class Final,                                                  \
              template <typename...>                                                               \
              class List,                                                                          \
              typename... Ts>                                                                      \
    struct convert<Final, List<Ts...>> {                                                           \
        using type = typename append<Final<>, TypeList<Ts>...>::type;                              \
    };

#define INTERNAL_CATCH_NTTP_1(signature, ...)                                                      \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp {};                             \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    constexpr auto get_wrapper() noexcept->Nttp<__VA_ARGS__> {                                     \
        return {};                                                                                 \
    }                                                                                              \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class...>                         \
    struct NttpTemplateTypeList {};                                                                \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class... Cs>                      \
    constexpr auto get_wrapper() noexcept->NttpTemplateTypeList<Cs...> {                           \
        return {};                                                                                 \
    }                                                                                              \
                                                                                                   \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container,                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class List,                                                                          \
              INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> {                            \
        using type = TypeList<Container<__VA_ARGS__>>;                                             \
    };                                                                                             \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container,                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class List,                                                                          \
              INTERNAL_CATCH_REMOVE_PARENS(signature),                                             \
              typename... Elements>                                                                \
    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> {               \
        using type = typename append<                                                              \
            TypeList<Container<__VA_ARGS__>>,                                                      \
            typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type;            \
    };                                                                                             \
    template <template <typename...> class Final,                                                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class... Containers,                                                                 \
              typename... Types>                                                                   \
    struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> {                \
        using type = typename append<                                                              \
            Final<>,                                                                               \
            typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type;           \
    };

#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)
#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)                                      \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()
#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)                                \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()

#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)
#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)                                       \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()
#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature, ...)                                 \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()

#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)                                         \
    template <typename Type> void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags) {       \
        Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<Type>),                                    \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       Catch::StringRef(),                                                         \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)                                     \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags) {                             \
        Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>),                             \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       Catch::StringRef(),                                                         \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)                             \
    template <typename Type>                                                                       \
    void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags) {    \
        Catch::AutoReg(Catch::makeTestInvoker(&TestName<Type>::test),                              \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       className,                                                                  \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)                              \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags) { \
        Catch::AutoReg(Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test),                       \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       className,                                                                  \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)                    \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> {                          \
        void test();                                                                               \
    }

#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)              \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> {                       \
        void test();                                                                               \
    }

#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)                                \
    template <typename TestType>                                                                   \
    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)                          \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_NTTP_0
#define INTERNAL_CATCH_NTTP_GEN(...)                                                               \
    INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_0)
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...)                                       \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1,                           \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)                           \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...)                           \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1,                          \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)                          \
    (TestName, ClassName, __VA_ARGS__)
#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...)                                          \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD0,                             \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD0)                             \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...)                                                 \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER0,                                    \
                                 INTERNAL_CATCH_NTTP_REGISTER0)                                    \
    (TestFunc, __VA_ARGS__)
#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...)                                              \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST1,                                  \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST0)                                  \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...)                                             \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST1,                                 \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST0)                                 \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...)                                                      \
    INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_REMOVE_PARENS_11_ARG,                              \
                                 INTERNAL_CATCH_REMOVE_PARENS_10_ARG,                              \
                                 INTERNAL_CATCH_REMOVE_PARENS_9_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_8_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_7_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_6_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_5_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_4_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_3_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_2_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_1_ARG)                               \
    (__VA_ARGS__)
#else
#define INTERNAL_CATCH_NTTP_0(signature)
#define INTERNAL_CATCH_NTTP_GEN(...)                                                               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                          \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_0)(__VA_ARGS__))
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...)                                       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(                                      \
        "dummy",                                                                                   \
        __VA_ARGS__,                                                                               \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1,                                                    \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...)                           \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(                                      \
        "dummy",                                                                                   \
        __VA_ARGS__,                                                                               \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1,                                                   \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__))
#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...)                                          \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD0,                         \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...)                                                 \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER0,                                \
                                     INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__))
#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST1,                              \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...)                                             \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST1,                             \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...)                                                      \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_REMOVE_PARENS_11_ARG,                          \
                                     INTERNAL_CATCH_REMOVE_PARENS_10_ARG,                          \
                                     INTERNAL_CATCH_REMOVE_PARENS_9_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_8_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_7_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_6_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_5_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_4_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_3_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_2_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__))
#endif

// end catch_preprocessor.hpp
// start catch_meta.hpp

#include <type_traits>

namespace Catch {
    template <typename T> struct always_false : std::false_type {};

    template <typename> struct true_given : std::true_type {};
    struct is_callable_tester {
        template <typename Fun, typename... Args>
        true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);
        template <typename...> std::false_type static test(...);
    };

    template <typename T> struct is_callable;

    template <typename Fun, typename... Args>
    struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};

#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
    // replaced with std::invoke_result here.
    template <typename Func, typename... U>
    using FunctionReturnType =
        std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;
#else
    // Keep ::type here because we still support C++11
    template <typename Func, typename... U>
    using FunctionReturnType = typename std::remove_reference<
        typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;
#endif

} // namespace Catch

namespace mpl_ {
    struct na;
}

// end catch_meta.hpp
namespace Catch {

    template <typename C> class TestInvokerAsMethod : public ITestInvoker {
        void (C::*m_testAsMethod)();

    public:
        TestInvokerAsMethod(void (C::*testAsMethod)()) noexcept : m_testAsMethod(testAsMethod) {}

        void invoke() const override {
            C obj;
            (obj.*m_testAsMethod)();
        }
    };

    auto makeTestInvoker(void (*testAsFunction)()) noexcept -> ITestInvoker*;

    template <typename C>
    auto makeTestInvoker(void (C::*testAsMethod)()) noexcept -> ITestInvoker* {
        return new (std::nothrow) TestInvokerAsMethod<C>(testAsMethod);
    }

    struct NameAndTags {
        NameAndTags(StringRef const& name_ = StringRef(),
                    StringRef const& tags_ = StringRef()) noexcept;
        StringRef name;
        StringRef tags;
    };

    struct AutoReg : NonCopyable {
        AutoReg(ITestInvoker* invoker,
                SourceLineInfo const& lineInfo,
                StringRef const& classOrMethod,
                NameAndTags const& nameAndTags) noexcept;
        ~AutoReg();
    };

} // end namespace Catch

#if defined(CATCH_CONFIG_DISABLE)
#define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(TestName, ...) static void TestName()
#define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(TestName, ClassName, ...)                   \
    namespace {                                                                                    \
        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) {                                \
            void test();                                                                           \
        };                                                                                         \
    }                                                                                              \
    void TestName::test()
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                       \
    TestName, TestFunc, Name, Tags, Signature, ...)                                                \
    INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, ...)                                \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(                                                \
                TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));                     \
        }                                                                                          \
    }                                                                                              \
    INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...)                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...)                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...)          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...)          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(ClassName, Name, Tags, ...)       \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(ClassName, Name, Tags, ...)       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(                              \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(                              \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif
#endif

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TESTCASE2(TestName, ...)                                                    \
    static void TestName();                                                                        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::AutoReg                                                                             \
            INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(Catch::makeTestInvoker(&TestName),           \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      Catch::StringRef(),                          \
                                                      Catch::NameAndTags{__VA_ARGS__});            \
    } /* NOLINT */                                                                                 \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    static void TestName()
#define INTERNAL_CATCH_TESTCASE(...)                                                               \
    INTERNAL_CATCH_TESTCASE2(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE(QualifiedMethod, ...)                                   \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::AutoReg                                                                             \
            INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(Catch::makeTestInvoker(&QualifiedMethod),    \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      "&" #QualifiedMethod,                        \
                                                      Catch::NameAndTags{__VA_ARGS__});            \
    } /* NOLINT */                                                                                 \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST_CASE_METHOD2(TestName, ClassName, ...)                                 \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) {                                \
            void test();                                                                           \
        };                                                                                         \
        Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(                                  \
            Catch::makeTestInvoker(&TestName::test),                                               \
            CATCH_INTERNAL_LINEINFO,                                                               \
            #ClassName,                                                                            \
            Catch::NameAndTags{__VA_ARGS__}); /* NOLINT */                                         \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    void TestName::test()
#define INTERNAL_CATCH_TEST_CASE_METHOD(ClassName, ...)                                            \
    INTERNAL_CATCH_TEST_CASE_METHOD2(                                                              \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), ClassName, __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_REGISTER_TESTCASE(Function, ...)                                            \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(                                      \
        Catch::makeTestInvoker(Function),                                                          \
        CATCH_INTERNAL_LINEINFO,                                                                   \
        Catch::StringRef(),                                                                        \
        Catch::NameAndTags{__VA_ARGS__}); /* NOLINT */                                             \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ...)        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));            \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))         \
            template <typename... Types> struct TestName {                                         \
                TestName() {                                                                       \
                    int index = 0;                                                                 \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};     \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (reg_test(Types{},                                                         \
                                  Catch::NameAndTags{Name " - " + std::string(tmpl_types[index]),  \
                                                     Tags}),                                       \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();                \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...)                                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...)                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...)                          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...)                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                \
    TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList)                           \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType> static void TestFuncName();                                       \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            template <typename... Types> struct TestName {                                         \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};                  \
                    constexpr char const* types_list[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TypesList))};                  \
                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);         \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestFuncName<Types>),              \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        Catch::StringRef(),                                        \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(tmpl_types[index / num_types]) + "<" + \
                                                std::string(types_list[index % num_types]) + ">",  \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename create<                                                  \
                    TestName,                                                                      \
                    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()),              \
                    TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(                            \
                        INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;                          \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> static void TestFuncName()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)                                 \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)                                 \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)                  \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)         \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType> static void TestFunc();                                           \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            template <typename... Types> struct TestName {                                         \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<Types>),                  \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        Catch::StringRef(),                                        \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) +  \
                                                " - " + std::to_string(index),                     \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename convert<TestName, TmplList>::type;                       \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> static void TestFunc()

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList)                               \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(                                                      \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        TmplList)

#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, ...)                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(                                                \
                TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));                     \
            INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))  \
            template <typename... Types> struct TestNameClass {                                    \
                TestNameClass() {                                                                  \
                    int index = 0;                                                                 \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};     \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (reg_test(Types{},                                                         \
                                  #ClassName,                                                      \
                                  Catch::NameAndTags{Name " - " + std::string(tmpl_types[index]),  \
                                                     Tags}),                                       \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();           \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(ClassName, Name, Tags, ...)                       \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(ClassName, Name, Tags, ...)                       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(ClassName, Name, Tags, Signature, ...)        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(ClassName, Name, Tags, Signature, ...)        \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                        \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)               \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName<TestType>) {                          \
        void test();                                                                               \
    };                                                                                             \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {                                   \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            template <typename... Types> struct TestNameClass {                                    \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};                  \
                    constexpr char const* types_list[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TypesList))};                  \
                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);         \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestName<Types>::test),            \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        #ClassName,                                                \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(tmpl_types[index / num_types]) + "<" + \
                                                std::string(types_list[index % num_types]) + ">",  \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename create<                                                  \
                    TestNameClass,                                                                 \
                    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()),              \
                    TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(                            \
                        INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;                          \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> void TestName<TestType>::test()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(ClassName, Name, Tags, ...)               \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                            \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(ClassName, Name, Tags, ...)               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(                                      \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                            \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(                                      \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2(                                           \
    TestNameClass, TestName, ClassName, Name, Tags, TmplList)                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName<TestType>) {                          \
        void test();                                                                               \
    };                                                                                             \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            template <typename... Types> struct TestNameClass {                                    \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestName<Types>::test),            \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        #ClassName,                                                \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) +  \
                                                " - " + std::to_string(index),                     \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename convert<TestNameClass, TmplList>::type;                  \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> void TestName<TestType>::test()

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList)             \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2(                                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        TmplList)

// end catch_test_registry.h
// start catch_capture.hpp

// start catch_assertionhandler.h

// start catch_assertioninfo.h

// start catch_result_type.h

namespace Catch {

    // ResultWas::OfType enum
    struct ResultWas {
        enum OfType {
            Unknown = -1,
            Ok = 0,
            Info = 1,
            Warning = 2,

            FailureBit = 0x10,

            ExpressionFailed = FailureBit | 1,
            ExplicitFailure = FailureBit | 2,

            Exception = 0x100 | FailureBit,

            ThrewException = Exception | 1,
            DidntThrowException = Exception | 2,

            FatalErrorCondition = 0x200 | FailureBit

        };
    };

    bool isOk(ResultWas::OfType resultType);
    bool isJustInfo(int flags);

    // ResultDisposition::Flags enum
    struct ResultDisposition {
        enum Flags {
            Normal = 0x01,

            ContinueOnFailure = 0x02, // Failures fail test, but execution continues
            FalseTest = 0x04,         // Prefix expression with !
            SuppressFail = 0x08       // Failures are reported but do not fail the test
        };
    };

    ResultDisposition::Flags operator|(ResultDisposition::Flags lhs, ResultDisposition::Flags rhs);

    bool shouldContinueOnFailure(int flags);
    inline bool isFalseTest(int flags) { return (flags & ResultDisposition::FalseTest) != 0; }
    bool shouldSuppressFailure(int flags);

} // end namespace Catch

// end catch_result_type.h
namespace Catch {

    struct AssertionInfo {
        StringRef macroName;
        SourceLineInfo lineInfo;
        StringRef capturedExpression;
        ResultDisposition::Flags resultDisposition;

        // We want to delete this constructor but a compiler bug in 4.8 means
        // the struct is then treated as non-aggregate
        // AssertionInfo() = delete;
    };

} // end namespace Catch

// end catch_assertioninfo.h
// start catch_decomposer.h

// start catch_tostring.h

#include <vector>
#include <cstddef>
#include <type_traits>
#include <string>
// start catch_stream.h

#include <iosfwd>
#include <cstddef>
#include <ostream>

namespace Catch {

    std::ostream& cout();
    std::ostream& cerr();
    std::ostream& clog();

    class StringRef;

    struct IStream {
        virtual ~IStream();
        virtual std::ostream& stream() const = 0;
    };

    auto makeStream(StringRef const& filename) -> IStream const*;

    class ReusableStringStream : NonCopyable {
        std::size_t m_index;
        std::ostream* m_oss;

    public:
        ReusableStringStream();
        ~ReusableStringStream();

        auto str() const -> std::string;

        template <typename T> auto operator<<(T const& value) -> ReusableStringStream& {
            *m_oss << value;
            return *this;
        }
        auto get() -> std::ostream& { return *m_oss; }
    };
} // namespace Catch

// end catch_stream.h
// start catch_interfaces_enum_values_registry.h

#include <vector>

namespace Catch {

    namespace Detail {
        struct EnumInfo {
            StringRef m_name;
            std::vector<std::pair<int, StringRef>> m_values;

            ~EnumInfo();

            StringRef lookup(int value) const;
        };
    } // namespace Detail

    struct IMutableEnumValuesRegistry {
        virtual ~IMutableEnumValuesRegistry();

        virtual Detail::EnumInfo const&
        registerEnum(StringRef enumName, StringRef allEnums, std::vector<int> const& values) = 0;

        template <typename E>
        Detail::EnumInfo const&
        registerEnum(StringRef enumName, StringRef allEnums, std::initializer_list<E> values) {
            static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int");
            std::vector<int> intValues;
            intValues.reserve(values.size());
            for (auto enumValue : values)
                intValues.push_back(static_cast<int>(enumValue));
            return registerEnum(enumName, allEnums, intValues);
        }
    };

} // namespace Catch

// end catch_interfaces_enum_values_registry.h

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
#include <string_view>
#endif

#ifdef __OBJC__
// start catch_objc_arc.hpp

#import <Foundation/Foundation.h>

#ifdef __has_feature
#define CATCH_ARC_ENABLED __has_feature(objc_arc)
#else
#define CATCH_ARC_ENABLED 0
#endif

void arcSafeRelease(NSObject* obj);
id performOptionalSelector(id obj, SEL sel);

#if !CATCH_ARC_ENABLED
inline void arcSafeRelease(NSObject* obj) { [obj release]; }
inline id performOptionalSelector(id obj, SEL sel) {
    if ([obj respondsToSelector:sel])
        return [obj performSelector:sel];
    return nil;
}
#define CATCH_UNSAFE_UNRETAINED
#define CATCH_ARC_STRONG
#else
inline void arcSafeRelease(NSObject*) {}
inline id performOptionalSelector(id obj, SEL sel) {
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
#endif
    if ([obj respondsToSelector:sel])
        return [obj performSelector:sel];
#ifdef __clang__
#pragma clang diagnostic pop
#endif
    return nil;
}
#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
#define CATCH_ARC_STRONG __strong
#endif

// end catch_objc_arc.hpp
#endif

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4180) // We attempt to stream a function (address) by const&,
                                // which MSVC complains about but is harmless
#endif

namespace Catch {
    namespace Detail {

        extern const std::string unprintableString;

        std::string rawMemoryToString(const void* object, std::size_t size);

        template <typename T> std::string rawMemoryToString(const T& object) {
            return rawMemoryToString(&object, sizeof(object));
        }

        template <typename T> class IsStreamInsertable {
            template <typename Stream, typename U>
            static auto test(int)
                -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());

            template <typename, typename> static auto test(...) -> std::false_type;

        public:
            static const bool value = decltype(test<std::ostream, const T&>(0))::value;
        };

        template <typename E> std::string convertUnknownEnumToString(E e);

        template <typename T>
        typename std::enable_if<!std::is_enum<T>::value &&
                                    !std::is_base_of<std::exception, T>::value,
                                std::string>::type
        convertUnstreamable(T const&) {
            return Detail::unprintableString;
        }
        template <typename T>
        typename std::enable_if<!std::is_enum<T>::value &&
                                    std::is_base_of<std::exception, T>::value,
                                std::string>::type
        convertUnstreamable(T const& ex) {
            return ex.what();
        }

        template <typename T>
        typename std::enable_if<std::is_enum<T>::value, std::string>::type
        convertUnstreamable(T const& value) {
            return convertUnknownEnumToString(value);
        }

#if defined(_MANAGED)
        //! Convert a CLR string to a utf8 std::string
        template <typename T> std::string clrReferenceToString(T ^ ref) {
            if (ref == nullptr)
                return std::string("null");
            auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());
            cli::pin_ptr<System::Byte> p = &bytes[0];
            return std::string(reinterpret_cast<char const*>(p), bytes->Length);
        }
#endif

    } // namespace Detail

    // If we decide for C++14, change these to enable_if_ts
    template <typename T, typename = void> struct StringMaker {
        template <typename Fake = T>
        static typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value,
                                       std::string>::type
        convert(const Fake& value) {
            ReusableStringStream rss;
            // NB: call using the function-like syntax to avoid ambiguity with
            // user-defined templated operator<< under clang.
            rss.operator<<(value);
            return rss.str();
        }

        template <typename Fake = T>
        static typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value,
                                       std::string>::type
        convert(const Fake& value) {
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
            return Detail::convertUnstreamable(value);
#else
            return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);
#endif
        }
    };

    namespace Detail {

        // This function dispatches all stringification requests inside of
        // Catch. Should be preferably called fully qualified, like
        // ::Catch::Detail::stringify
        template <typename T> std::string stringify(const T& e) {
            return ::Catch::StringMaker<
                typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);
        }

        template <typename E> std::string convertUnknownEnumToString(E e) {
            return ::Catch::Detail::stringify(
                static_cast<typename std::underlying_type<E>::type>(e));
        }

#if defined(_MANAGED)
        template <typename T> std::string stringify(T ^ e) {
            return ::Catch::StringMaker<T ^>::convert(e);
        }
#endif

    } // namespace Detail

    // Some predefined specializations

    template <> struct StringMaker<std::string> {
        static std::string convert(const std::string& str);
    };

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    template <> struct StringMaker<std::string_view> {
        static std::string convert(std::string_view str);
    };
#endif

    template <> struct StringMaker<char const*> { static std::string convert(char const* str); };
    template <> struct StringMaker<char*> { static std::string convert(char* str); };

#ifdef CATCH_CONFIG_WCHAR
    template <> struct StringMaker<std::wstring> {
        static std::string convert(const std::wstring& wstr);
    };

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    template <> struct StringMaker<std::wstring_view> {
        static std::string convert(std::wstring_view str);
    };
#endif

    template <> struct StringMaker<wchar_t const*> {
        static std::string convert(wchar_t const* str);
    };
    template <> struct StringMaker<wchar_t*> { static std::string convert(wchar_t* str); };
#endif

    // TBD: Should we use `strnlen` to ensure that we don't go out of the
    // buffer,
    //      while keeping string semantics?
    template <int SZ> struct StringMaker<char[SZ]> {
        static std::string convert(char const* str) {
            return ::Catch::Detail::stringify(std::string{str});
        }
    };
    template <int SZ> struct StringMaker<signed char[SZ]> {
        static std::string convert(signed char const* str) {
            return ::Catch::Detail::stringify(std::string{reinterpret_cast<char const*>(str)});
        }
    };
    template <int SZ> struct StringMaker<unsigned char[SZ]> {
        static std::string convert(unsigned char const* str) {
            return ::Catch::Detail::stringify(std::string{reinterpret_cast<char const*>(str)});
        }
    };

#if defined(CATCH_CONFIG_CPP17_BYTE)
    template <> struct StringMaker<std::byte> { static std::string convert(std::byte value); };
#endif // defined(CATCH_CONFIG_CPP17_BYTE)
    template <> struct StringMaker<int> { static std::string convert(int value); };
    template <> struct StringMaker<long> { static std::string convert(long value); };
    template <> struct StringMaker<long long> { static std::string convert(long long value); };
    template <> struct StringMaker<unsigned int> {
        static std::string convert(unsigned int value);
    };
    template <> struct StringMaker<unsigned long> {
        static std::string convert(unsigned long value);
    };
    template <> struct StringMaker<unsigned long long> {
        static std::string convert(unsigned long long value);
    };

    template <> struct StringMaker<bool> { static std::string convert(bool b); };

    template <> struct StringMaker<char> { static std::string convert(char c); };
    template <> struct StringMaker<signed char> { static std::string convert(signed char c); };
    template <> struct StringMaker<unsigned char> { static std::string convert(unsigned char c); };

    template <> struct StringMaker<std::nullptr_t> { static std::string convert(std::nullptr_t); };

    template <> struct StringMaker<float> {
        static std::string convert(float value);
        static int precision;
    };

    template <> struct StringMaker<double> {
        static std::string convert(double value);
        static int precision;
    };

    template <typename T> struct StringMaker<T*> {
        template <typename U> static std::string convert(U* p) {
            if (p) {
                return ::Catch::Detail::rawMemoryToString(p);
            } else {
                return "nullptr";
            }
        }
    };

    template <typename R, typename C> struct StringMaker<R C::*> {
        static std::string convert(R C::*p) {
            if (p) {
                return ::Catch::Detail::rawMemoryToString(p);
            } else {
                return "nullptr";
            }
        }
    };

#if defined(_MANAGED)
    template <typename T> struct StringMaker<T ^> {
        static std::string convert(T ^ ref) { return ::Catch::Detail::clrReferenceToString(ref); }
    };
#endif

    namespace Detail {
        template <typename InputIterator, typename Sentinel = InputIterator>
        std::string rangeToString(InputIterator first, Sentinel last) {
            ReusableStringStream rss;
            rss << "{ ";
            if (first != last) {
                rss << ::Catch::Detail::stringify(*first);
                for (++first; first != last; ++first)
                    rss << ", " << ::Catch::Detail::stringify(*first);
            }
            rss << " }";
            return rss.str();
        }
    } // namespace Detail

#ifdef __OBJC__
    template <> struct StringMaker<NSString*> {
        static std::string convert(NSString* nsstring) {
            if (!nsstring)
                return "nil";
            return std::string("@") + [nsstring UTF8String];
        }
    };
    template <> struct StringMaker<NSObject*> {
        static std::string convert(NSObject* nsObject) {
            return ::Catch::Detail::stringify([nsObject description]);
        }
    };
    namespace Detail {
        inline std::string stringify(NSString* nsstring) {
            return StringMaker<NSString*>::convert(nsstring);
        }

    }  // namespace Detail
#endif // __OBJC__

} // namespace Catch

//////////////////////////////////////////////////////
// Separate std-lib types stringification, so it can be selectively enabled
// This means that we do not bring in

#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)
#define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
#define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
#define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER
#endif

// Separate std::pair specialization
#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)
#include <utility>
namespace Catch {
    template <typename T1, typename T2> struct StringMaker<std::pair<T1, T2>> {
        static std::string convert(const std::pair<T1, T2>& pair) {
            ReusableStringStream rss;
            rss << "{ " << ::Catch::Detail::stringify(pair.first) << ", "
                << ::Catch::Detail::stringify(pair.second) << " }";
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER

#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)
#include <optional>
namespace Catch {
    template <typename T> struct StringMaker<std::optional<T>> {
        static std::string convert(const std::optional<T>& optional) {
            ReusableStringStream rss;
            if (optional.has_value()) {
                rss << ::Catch::Detail::stringify(*optional);
            } else {
                rss << "{ }";
            }
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER

// Separate std::tuple specialization
#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
#include <tuple>
namespace Catch {
    namespace Detail {
        template <typename Tuple, std::size_t N = 0, bool = (N < std::tuple_size<Tuple>::value)>
        struct TupleElementPrinter {
            static void print(const Tuple& tuple, std::ostream& os) {
                os << (N ? ", " : " ") << ::Catch::Detail::stringify(std::get<N>(tuple));
                TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
            }
        };

        template <typename Tuple, std::size_t N> struct TupleElementPrinter<Tuple, N, false> {
            static void print(const Tuple&, std::ostream&) {}
        };

    } // namespace Detail

    template <typename... Types> struct StringMaker<std::tuple<Types...>> {
        static std::string convert(const std::tuple<Types...>& tuple) {
            ReusableStringStream rss;
            rss << '{';
            Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());
            rss << " }";
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER

#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
#include <variant>
namespace Catch {
    template <> struct StringMaker<std::monostate> {
        static std::string convert(const std::monostate&) { return "{ }"; }
    };

    template <typename... Elements> struct StringMaker<std::variant<Elements...>> {
        static std::string convert(const std::variant<Elements...>& variant) {
            if (variant.valueless_by_exception()) {
                return "{valueless variant}";
            } else {
                return std::visit(
                    [](const auto& value) { return ::Catch::Detail::stringify(value); }, variant);
            }
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER

namespace Catch {
    // Import begin/ end from std here
    using std::begin;
    using std::end;

    namespace detail {
        template <typename...> struct void_type { using type = void; };

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

        template <typename T>
        struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type>
            : std::true_type {};
    } // namespace detail

    template <typename T> struct is_range : detail::is_range_impl<T> {};

#if defined(_MANAGED) // Managed types are never ranges
    template <typename T> struct is_range<T ^> { static const bool value = false; };
#endif

    template <typename Range> std::string rangeToString(Range const& range) {
        return ::Catch::Detail::rangeToString(begin(range), end(range));
    }

    // Handle vector<bool> specially
    template <typename Allocator> std::string rangeToString(std::vector<bool, Allocator> const& v) {
        ReusableStringStream rss;
        rss << "{ ";
        bool first = true;
        for (bool b : v) {
            if (first)
                first = false;
            else
                rss << ", ";
            rss << ::Catch::Detail::stringify(b);
        }
        rss << " }";
        return rss.str();
    }

    template <typename R>
    struct StringMaker<
        R,
        typename std::enable_if<is_range<R>::value &&
                                !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
        static std::string convert(R const& range) { return rangeToString(range); }
    };

    template <typename T, int SZ> struct StringMaker<T[SZ]> {
        static std::string convert(T const (&arr)[SZ]) { return rangeToString(arr); }
    };

} // namespace Catch

// Separate std::chrono::duration specialization
#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#include <ctime>
#include <ratio>
#include <chrono>

namespace Catch {

    template <class Ratio> struct ratio_string { static std::string symbol(); };

    template <class Ratio> std::string ratio_string<Ratio>::symbol() {
        Catch::ReusableStringStream rss;
        rss << '[' << Ratio::num << '/' << Ratio::den << ']';
        return rss.str();
    }
    template <> struct ratio_string<std::atto> { static std::string symbol(); };
    template <> struct ratio_string<std::femto> { static std::string symbol(); };
    template <> struct ratio_string<std::pico> { static std::string symbol(); };
    template <> struct ratio_string<std::nano> { static std::string symbol(); };
    template <> struct ratio_string<std::micro> { static std::string symbol(); };
    template <> struct ratio_string<std::milli> { static std::string symbol(); };

    ////////////
    // std::chrono::duration specializations
    template <typename Value, typename Ratio>
    struct StringMaker<std::chrono::duration<Value, Ratio>> {
        static std::string convert(std::chrono::duration<Value, Ratio> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's';
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " s";
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " m";
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " h";
            return rss.str();
        }
    };

    ////////////
    // std::chrono::time_point specialization
    // Generic time_point cannot be specialized, only
    // std::chrono::time_point<system_clock>
    template <typename Clock, typename Duration>
    struct StringMaker<std::chrono::time_point<Clock, Duration>> {
        static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) {
            return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch";
        }
    };
    // std::chrono::time_point<system_clock> specialization
    template <typename Duration>
    struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {
        static std::string
        convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {
            auto converted = std::chrono::system_clock::to_time_t(time_point);

#ifdef _MSC_VER
            std::tm timeInfo = {};
            gmtime_s(&timeInfo, &converted);
#else
            std::tm* timeInfo = std::gmtime(&converted);
#endif

            auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
            char timeStamp[timeStampSize];
            const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";

#ifdef _MSC_VER
            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
#else
            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
#endif
            return std::string(timeStamp);
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER

#define INTERNAL_CATCH_REGISTER_ENUM(enumName, ...)                                                \
    namespace Catch {                                                                              \
        template <> struct StringMaker<enumName> {                                                 \
            static std::string convert(enumName value) {                                           \
                static const auto& enumInfo =                                                      \
                    ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum(  \
                        #enumName, #__VA_ARGS__, {__VA_ARGS__});                                   \
                return static_cast<std::string>(enumInfo.lookup(static_cast<int>(value)));         \
            }                                                                                      \
        };                                                                                         \
    }

#define CATCH_REGISTER_ENUM(enumName, ...) INTERNAL_CATCH_REGISTER_ENUM(enumName, __VA_ARGS__)

#ifdef _MSC_VER
#pragma warning(pop)
#endif

// end catch_tostring.h
#include <iosfwd>

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4389) // '==' : signed/unsigned mismatch
#pragma warning(disable : 4018) // more "signed/unsigned mismatch"
#pragma warning(disable : 4312) // Converting int to T* using reinterpret_cast
                                // (issue on x64 platform)
#pragma warning(disable : 4180) // qualifier applied to function type has no meaning
#pragma warning(disable : 4800) // Forcing result to true or false
#endif

namespace Catch {

    struct ITransientExpression {
        auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
        auto getResult() const -> bool { return m_result; }
        virtual void streamReconstructedExpression(std::ostream& os) const = 0;

        ITransientExpression(bool isBinaryExpression, bool result) :
            m_isBinaryExpression(isBinaryExpression), m_result(result) {}

        // We don't actually need a virtual destructor, but many static
        // analysers complain if it's not here :-(
        virtual ~ITransientExpression();

        bool m_isBinaryExpression;
        bool m_result;
    };

    void formatReconstructedExpression(std::ostream& os,
                                       std::string const& lhs,
                                       StringRef op,
                                       std::string const& rhs);

    template <typename LhsT, typename RhsT> class BinaryExpr : public ITransientExpression {
        LhsT m_lhs;
        StringRef m_op;
        RhsT m_rhs;

        void streamReconstructedExpression(std::ostream& os) const override {
            formatReconstructedExpression(
                os, Catch::Detail::stringify(m_lhs), m_op, Catch::Detail::stringify(m_rhs));
        }

    public:
        BinaryExpr(bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs) :
            ITransientExpression{true, comparisonResult}, m_lhs(lhs), m_op(op), m_rhs(rhs) {}

        template <typename T> auto operator&&(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator||(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator==(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator!=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator>(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator<(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator>=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator<=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }
    };

    template <typename LhsT> class UnaryExpr : public ITransientExpression {
        LhsT m_lhs;

        void streamReconstructedExpression(std::ostream& os) const override {
            os << Catch::Detail::stringify(m_lhs);
        }

    public:
        explicit UnaryExpr(LhsT lhs) :
            ITransientExpression{false, static_cast<bool>(lhs)}, m_lhs(lhs) {}
    };

    // Specialised comparison functions to handle equality comparisons between
    // ints and pointers (NULL deduces as an int)
    template <typename LhsT, typename RhsT>
    auto compareEqual(LhsT const& lhs, RhsT const& rhs) -> bool {
        return static_cast<bool>(lhs == rhs);
    }
    template <typename T> auto compareEqual(T* const& lhs, int rhs) -> bool {
        return lhs == reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareEqual(T* const& lhs, long rhs) -> bool {
        return lhs == reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareEqual(int lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) == rhs;
    }
    template <typename T> auto compareEqual(long lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) == rhs;
    }

    template <typename LhsT, typename RhsT>
    auto compareNotEqual(LhsT const& lhs, RhsT&& rhs) -> bool {
        return static_cast<bool>(lhs != rhs);
    }
    template <typename T> auto compareNotEqual(T* const& lhs, int rhs) -> bool {
        return lhs != reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareNotEqual(T* const& lhs, long rhs) -> bool {
        return lhs != reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareNotEqual(int lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) != rhs;
    }
    template <typename T> auto compareNotEqual(long lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) != rhs;
    }

    template <typename LhsT> class ExprLhs {
        LhsT m_lhs;

    public:
        explicit ExprLhs(LhsT lhs) : m_lhs(lhs) {}

        template <typename RhsT>
        auto operator==(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {compareEqual(m_lhs, rhs), m_lhs, "==", rhs};
        }
        auto operator==(bool rhs) -> BinaryExpr<LhsT, bool> const {
            return {m_lhs == rhs, m_lhs, "==", rhs};
        }

        template <typename RhsT>
        auto operator!=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {compareNotEqual(m_lhs, rhs), m_lhs, "!=", rhs};
        }
        auto operator!=(bool rhs) -> BinaryExpr<LhsT, bool> const {
            return {m_lhs != rhs, m_lhs, "!=", rhs};
        }

        template <typename RhsT>
        auto operator>(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs > rhs), m_lhs, ">", rhs};
        }
        template <typename RhsT>
        auto operator<(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs < rhs), m_lhs, "<", rhs};
        }
        template <typename RhsT>
        auto operator>=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs >= rhs), m_lhs, ">=", rhs};
        }
        template <typename RhsT>
        auto operator<=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs};
        }
        template <typename RhsT>
        auto operator|(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs};
        }
        template <typename RhsT>
        auto operator&(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs};
        }
        template <typename RhsT>
        auto operator^(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs};
        }

        template <typename RhsT>
        auto operator&&(RhsT const&) -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<RhsT>::value,
                          "operator&& is not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename RhsT>
        auto operator||(RhsT const&) -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<RhsT>::value,
                          "operator|| is not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        auto makeUnaryExpr() const -> UnaryExpr<LhsT> { return UnaryExpr<LhsT>{m_lhs}; }
    };

    void handleExpression(ITransientExpression const& expr);

    template <typename T> void handleExpression(ExprLhs<T> const& expr) {
        handleExpression(expr.makeUnaryExpr());
    }

    struct Decomposer {
        template <typename T> auto operator<=(T const& lhs) -> ExprLhs<T const&> {
            return ExprLhs<T const&>{lhs};
        }

        auto operator<=(bool value) -> ExprLhs<bool> { return ExprLhs<bool>{value}; }
    };

} // end namespace Catch

#ifdef _MSC_VER
#pragma warning(pop)
#endif

// end catch_decomposer.h
// start catch_interfaces_capture.h

#include <string>
#include <chrono>

namespace Catch {

    class AssertionResult;
    struct AssertionInfo;
    struct SectionInfo;
    struct SectionEndInfo;
    struct MessageInfo;
    struct MessageBuilder;
    struct Counts;
    struct AssertionReaction;
    struct SourceLineInfo;

    struct ITransientExpression;
    struct IGeneratorTracker;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    struct BenchmarkInfo;
    template <typename Duration = std::chrono::duration<double, std::nano>> struct BenchmarkStats;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    struct IResultCapture {

        virtual ~IResultCapture();

        virtual bool sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) = 0;
        virtual void sectionEnded(SectionEndInfo const& endInfo) = 0;
        virtual void sectionEndedEarly(SectionEndInfo const& endInfo) = 0;

        virtual auto acquireGeneratorTracker(StringRef generatorName,
                                             SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& = 0;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        virtual void benchmarkPreparing(std::string const& name) = 0;
        virtual void benchmarkStarting(BenchmarkInfo const& info) = 0;
        virtual void benchmarkEnded(BenchmarkStats<> const& stats) = 0;
        virtual void benchmarkFailed(std::string const& error) = 0;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        virtual void pushScopedMessage(MessageInfo const& message) = 0;
        virtual void popScopedMessage(MessageInfo const& message) = 0;

        virtual void emplaceUnscopedMessage(MessageBuilder const& builder) = 0;

        virtual void handleFatalErrorCondition(StringRef message) = 0;

        virtual void handleExpr(AssertionInfo const& info,
                                ITransientExpression const& expr,
                                AssertionReaction& reaction) = 0;
        virtual void handleMessage(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   StringRef const& message,
                                   AssertionReaction& reaction) = 0;
        virtual void handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                        AssertionReaction& reaction) = 0;
        virtual void handleUnexpectedInflightException(AssertionInfo const& info,
                                                       std::string const& message,
                                                       AssertionReaction& reaction) = 0;
        virtual void handleIncomplete(AssertionInfo const& info) = 0;
        virtual void handleNonExpr(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   AssertionReaction& reaction) = 0;

        virtual bool lastAssertionPassed() = 0;
        virtual void assertionPassed() = 0;

        // Deprecated, do not use:
        virtual std::string getCurrentTestName() const = 0;
        virtual const AssertionResult* getLastResult() const = 0;
        virtual void exceptionEarlyReported() = 0;
    };

    IResultCapture& getResultCapture();
} // namespace Catch

// end catch_interfaces_capture.h
namespace Catch {

    struct TestFailureException {};
    struct AssertionResultData;
    struct IResultCapture;
    class RunContext;

    class LazyExpression {
        friend class AssertionHandler;
        friend struct AssertionStats;
        friend class RunContext;

        ITransientExpression const* m_transientExpression = nullptr;
        bool m_isNegated;

    public:
        LazyExpression(bool isNegated);
        LazyExpression(LazyExpression const& other);
        LazyExpression& operator=(LazyExpression const&) = delete;

        explicit operator bool() const;

        friend auto operator<<(std::ostream& os, LazyExpression const& lazyExpr) -> std::ostream&;
    };

    struct AssertionReaction {
        bool shouldDebugBreak = false;
        bool shouldThrow = false;
    };

    class AssertionHandler {
        AssertionInfo m_assertionInfo;
        AssertionReaction m_reaction;
        bool m_completed = false;
        IResultCapture& m_resultCapture;

    public:
        AssertionHandler(StringRef const& macroName,
                         SourceLineInfo const& lineInfo,
                         StringRef capturedExpression,
                         ResultDisposition::Flags resultDisposition);
        ~AssertionHandler() {
            if (!m_completed) {
                m_resultCapture.handleIncomplete(m_assertionInfo);
            }
        }

        template <typename T> void handleExpr(ExprLhs<T> const& expr) {
            handleExpr(expr.makeUnaryExpr());
        }
        void handleExpr(ITransientExpression const& expr);

        void handleMessage(ResultWas::OfType resultType, StringRef const& message);

        void handleExceptionThrownAsExpected();
        void handleUnexpectedExceptionNotThrown();
        void handleExceptionNotThrownAsExpected();
        void handleThrowingCallSkipped();
        void handleUnexpectedInflightException();

        void complete();
        void setCompleted();

        // query
        auto allowThrows() const -> bool;
    };

    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  std::string const& str,
                                  StringRef const& matcherString);

} // namespace Catch

// end catch_assertionhandler.h
// start catch_message.h

#include <string>
#include <vector>

namespace Catch {

    struct MessageInfo {
        MessageInfo(StringRef const& _macroName,
                    SourceLineInfo const& _lineInfo,
                    ResultWas::OfType _type);

        StringRef macroName;
        std::string message;
        SourceLineInfo lineInfo;
        ResultWas::OfType type;
        unsigned int sequence;

        bool operator==(MessageInfo const& other) const;
        bool operator<(MessageInfo const& other) const;

    private:
        static unsigned int globalCount;
    };

    struct MessageStream {

        template <typename T> MessageStream& operator<<(T const& value) {
            m_stream << value;
            return *this;
        }

        ReusableStringStream m_stream;
    };

    struct MessageBuilder : MessageStream {
        MessageBuilder(StringRef const& macroName,
                       SourceLineInfo const& lineInfo,
                       ResultWas::OfType type);

        template <typename T> MessageBuilder& operator<<(T const& value) {
            m_stream << value;
            return *this;
        }

        MessageInfo m_info;
    };

    class ScopedMessage {
    public:
        explicit ScopedMessage(MessageBuilder const& builder);
        ScopedMessage(ScopedMessage& duplicate) = delete;
        ScopedMessage(ScopedMessage&& old);
        ~ScopedMessage();

        MessageInfo m_info;
        bool m_moved;
    };

    class Capturer {
        std::vector<MessageInfo> m_messages;
        IResultCapture& m_resultCapture = getResultCapture();
        size_t m_captured = 0;

    public:
        Capturer(StringRef macroName,
                 SourceLineInfo const& lineInfo,
                 ResultWas::OfType resultType,
                 StringRef names);
        ~Capturer();

        void captureValue(size_t index, std::string const& value);

        template <typename T> void captureValues(size_t index, T const& value) {
            captureValue(index, Catch::Detail::stringify(value));
        }

        template <typename T, typename... Ts>
        void captureValues(size_t index, T const& value, Ts const&... values) {
            captureValue(index, Catch::Detail::stringify(value));
            captureValues(index + 1, values...);
        }
    };

} // end namespace Catch

// end catch_message.h
#if !defined(CATCH_CONFIG_DISABLE)

#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)
#define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__
#else
#define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION"
#endif

#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)

///////////////////////////////////////////////////////////////////////////////
// Another way to speed-up compilation is to omit local try-catch for REQUIRE*
// macros.
#define INTERNAL_CATCH_TRY
#define INTERNAL_CATCH_CATCH(capturer)

#else // CATCH_CONFIG_FAST_COMPILE

#define INTERNAL_CATCH_TRY try
#define INTERNAL_CATCH_CATCH(handler)                                                              \
    catch (...) {                                                                                  \
        handler.handleUnexpectedInflightException();                                               \
    }

#endif

#define INTERNAL_CATCH_REACT(handler) handler.complete();

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST(macroName, resultDisposition, ...)                                     \
    do {                                                                                           \
        CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__);                                               \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        INTERNAL_CATCH_TRY {                                                                       \
            CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                              \
            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS                                           \
            catchAssertionHandler.handleExpr(Catch::Decomposer() <= __VA_ARGS__);                  \
            CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                               \
        }                                                                                          \
        INTERNAL_CATCH_CATCH(catchAssertionHandler)                                                \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while ((void)0, (false) && static_cast<bool>(!!(__VA_ARGS__)))

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_IF(macroName, resultDisposition, ...)                                       \
    INTERNAL_CATCH_TEST(macroName, resultDisposition, __VA_ARGS__);                                \
    if (Catch::getResultCapture().lastAssertionPassed())

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_ELSE(macroName, resultDisposition, ...)                                     \
    INTERNAL_CATCH_TEST(macroName, resultDisposition, __VA_ARGS__);                                \
    if (!Catch::getResultCapture().lastAssertionPassed())

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_NO_THROW(macroName, resultDisposition, ...)                                 \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        try {                                                                                      \
            static_cast<void>(__VA_ARGS__);                                                        \
            catchAssertionHandler.handleExceptionNotThrownAsExpected();                            \
        } catch (...) {                                                                            \
            catchAssertionHandler.handleUnexpectedInflightException();                             \
        }                                                                                          \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS(macroName, resultDisposition, ...)                                   \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleExceptionThrownAsExpected();                           \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS_AS(macroName, exceptionType, resultDisposition, expr)                \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType),           \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(expr);                                                           \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (exceptionType const&) {                                                       \
                catchAssertionHandler.handleExceptionThrownAsExpected();                           \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleUnexpectedInflightException();                         \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_MSG(macroName, messageType, resultDisposition, ...)                         \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition); \
        catchAssertionHandler.handleMessage(                                                       \
            messageType,                                                                           \
            (Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop()).m_stream.str());    \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_CAPTURE(varName, macroName, ...)                                            \
    auto varName =                                                                                 \
        Catch::Capturer(macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__); \
    varName.captureValues(0, __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_INFO(macroName, log)                                                        \
    Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME(scopedMessage)(                                \
        Catch::MessageBuilder(                                                                     \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info)                 \
        << log);

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_UNSCOPED_INFO(macroName, log)                                               \
    Catch::getResultCapture().emplaceUnscopedMessage(                                              \
        Catch::MessageBuilder(                                                                     \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info)                 \
        << log)

///////////////////////////////////////////////////////////////////////////////
// Although this is matcher-based, it can be used with just a string
#define INTERNAL_CATCH_THROWS_STR_MATCHES(macroName, resultDisposition, matcher, ...)              \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher),          \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (...) {                                                                        \
                Catch::handleExceptionMatchExpr(                                                   \
                    catchAssertionHandler, matcher, #matcher##_catch_sr);                          \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

#endif // CATCH_CONFIG_DISABLE

// end catch_capture.hpp
// start catch_section.h

// start catch_section_info.h

// start catch_totals.h

#include <cstddef>

namespace Catch {

    struct Counts {
        Counts operator-(Counts const& other) const;
        Counts& operator+=(Counts const& other);

        std::size_t total() const;
        bool allPassed() const;
        bool allOk() const;

        std::size_t passed = 0;
        std::size_t failed = 0;
        std::size_t failedButOk = 0;
    };

    struct Totals {

        Totals operator-(Totals const& other) const;
        Totals& operator+=(Totals const& other);

        Totals delta(Totals const& prevTotals) const;

        int error = 0;
        Counts assertions;
        Counts testCases;
    };
} // namespace Catch

// end catch_totals.h
#include <string>

namespace Catch {

    struct SectionInfo {
        SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name);

        // Deprecated
        SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name, std::string const&) :
            SectionInfo(_lineInfo, _name) {}

        std::string name;
        std::string description; // !Deprecated: this will always be empty
        SourceLineInfo lineInfo;
    };

    struct SectionEndInfo {
        SectionInfo sectionInfo;
        Counts prevAssertions;
        double durationInSeconds;
    };

} // end namespace Catch

// end catch_section_info.h
// start catch_timer.h

#include <cstdint>

namespace Catch {

    auto getCurrentNanosecondsSinceEpoch() -> uint64_t;
    auto getEstimatedClockResolution() -> uint64_t;

    class Timer {
        uint64_t m_nanoseconds = 0;

    public:
        void start();
        auto getElapsedNanoseconds() const -> uint64_t;
        auto getElapsedMicroseconds() const -> uint64_t;
        auto getElapsedMilliseconds() const -> unsigned int;
        auto getElapsedSeconds() const -> double;
    };

} // namespace Catch

// end catch_timer.h
#include <string>

namespace Catch {

    class Section : NonCopyable {
    public:
        Section(SectionInfo const& info);
        ~Section();

        // This indicates whether the section should be executed or not
        explicit operator bool() const;

    private:
        SectionInfo m_info;

        std::string m_name;
        Counts m_assertions;
        bool m_sectionIncluded;
        Timer m_timer;
    };

} // end namespace Catch

#define INTERNAL_CATCH_SECTION(...)                                                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                        \
    if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) =                 \
            Catch::SectionInfo(CATCH_INTERNAL_LINEINFO, __VA_ARGS__))                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

#define INTERNAL_CATCH_DYNAMIC_SECTION(...)                                                        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                        \
    if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) =                 \
            Catch::SectionInfo(CATCH_INTERNAL_LINEINFO,                                            \
                               (Catch::ReusableStringStream() << __VA_ARGS__).str()))              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

// end catch_section.h
// start catch_interfaces_exception.h

// start catch_interfaces_registry_hub.h

#include <string>
#include <memory>

namespace Catch {

    class TestCase;
    struct ITestCaseRegistry;
    struct IExceptionTranslatorRegistry;
    struct IExceptionTranslator;
    struct IReporterRegistry;
    struct IReporterFactory;
    struct ITagAliasRegistry;
    struct IMutableEnumValuesRegistry;

    class StartupExceptionRegistry;

    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;

    struct IRegistryHub {
        virtual ~IRegistryHub();

        virtual IReporterRegistry const& getReporterRegistry() const = 0;
        virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
        virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;
        virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0;

        virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0;
    };

    struct IMutableRegistryHub {
        virtual ~IMutableRegistryHub();
        virtual void registerReporter(std::string const& name,
                                      IReporterFactoryPtr const& factory) = 0;
        virtual void registerListener(IReporterFactoryPtr const& factory) = 0;
        virtual void registerTest(TestCase const& testInfo) = 0;
        virtual void registerTranslator(const IExceptionTranslator* translator) = 0;
        virtual void registerTagAlias(std::string const& alias,
                                      std::string const& tag,
                                      SourceLineInfo const& lineInfo) = 0;
        virtual void registerStartupException() noexcept = 0;
        virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0;
    };

    IRegistryHub const& getRegistryHub();
    IMutableRegistryHub& getMutableRegistryHub();
    void cleanUp();
    std::string translateActiveException();

} // namespace Catch

// end catch_interfaces_registry_hub.h
#if defined(CATCH_CONFIG_DISABLE)
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG(translatorName, signature)                       \
    static std::string translatorName(signature)
#endif

#include <exception>
#include <string>
#include <vector>

namespace Catch {
    using exceptionTranslateFunction = std::string (*)();

    struct IExceptionTranslator;
    using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;

    struct IExceptionTranslator {
        virtual ~IExceptionTranslator();
        virtual std::string translate(ExceptionTranslators::const_iterator it,
                                      ExceptionTranslators::const_iterator itEnd) const = 0;
    };

    struct IExceptionTranslatorRegistry {
        virtual ~IExceptionTranslatorRegistry();

        virtual std::string translateActiveException() const = 0;
    };

    class ExceptionTranslatorRegistrar {
        template <typename T> class ExceptionTranslator : public IExceptionTranslator {
        public:
            ExceptionTranslator(std::string (*translateFunction)(T&)) :
                m_translateFunction(translateFunction) {}

            std::string translate(ExceptionTranslators::const_iterator it,
                                  ExceptionTranslators::const_iterator itEnd) const override {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
                return "";
#else
                try {
                    if (it == itEnd)
                        std::rethrow_exception(std::current_exception());
                    else
                        return (*it)->translate(it + 1, itEnd);
                } catch (T& ex) {
                    return m_translateFunction(ex);
                }
#endif
            }

        protected:
            std::string (*m_translateFunction)(T&);
        };

    public:
        template <typename T> ExceptionTranslatorRegistrar(std::string (*translateFunction)(T&)) {
            getMutableRegistryHub().registerTranslator(
                new ExceptionTranslator<T>(translateFunction));
        }
    };
} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2(translatorName, signature)                             \
    static std::string translatorName(signature);                                                  \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ExceptionTranslatorRegistrar                                                        \
            INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionRegistrar)(&translatorName);        \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    static std::string translatorName(signature)

#define INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature)                                              \
    INTERNAL_CATCH_TRANSLATE_EXCEPTION2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator), signature)

// end catch_interfaces_exception.h
// start catch_approx.h

#include <type_traits>

namespace Catch {
    namespace Detail {

        class Approx {
        private:
            bool equalityComparisonImpl(double other) const;
            // Validates the new margin (margin >= 0)
            // out-of-line to avoid including stdexcept in the header
            void setMargin(double margin);
            // Validates the new epsilon (0 < epsilon < 1)
            // out-of-line to avoid including stdexcept in the header
            void setEpsilon(double epsilon);

        public:
            explicit Approx(double value);

            static Approx custom();

            Approx operator-() const;

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx operator()(T const& value) {
                Approx approx(static_cast<double>(value));
                approx.m_epsilon = m_epsilon;
                approx.m_margin = m_margin;
                approx.m_scale = m_scale;
                return approx;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            explicit Approx(T const& value) : Approx(static_cast<double>(value)) {}

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator==(const T& lhs, Approx const& rhs) {
                auto lhs_v = static_cast<double>(lhs);
                return rhs.equalityComparisonImpl(lhs_v);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator==(Approx const& lhs, const T& rhs) {
                return operator==(rhs, lhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator!=(T const& lhs, Approx const& rhs) {
                return !operator==(lhs, rhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator!=(Approx const& lhs, T const& rhs) {
                return !operator==(rhs, lhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator<=(T const& lhs, Approx const& rhs) {
                return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator<=(Approx const& lhs, T const& rhs) {
                return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator>=(T const& lhs, Approx const& rhs) {
                return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator>=(Approx const& lhs, T const& rhs) {
                return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& epsilon(T const& newEpsilon) {
                double epsilonAsDouble = static_cast<double>(newEpsilon);
                setEpsilon(epsilonAsDouble);
                return *this;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& margin(T const& newMargin) {
                double marginAsDouble = static_cast<double>(newMargin);
                setMargin(marginAsDouble);
                return *this;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& scale(T const& newScale) {
                m_scale = static_cast<double>(newScale);
                return *this;
            }

            std::string toString() const;

        private:
            double m_epsilon;
            double m_margin;
            double m_scale;
            double m_value;
        };
    } // end namespace Detail

    namespace literals {
        Detail::Approx operator"" _a(long double val);
        Detail::Approx operator"" _a(unsigned long long val);
    } // end namespace literals

    template <> struct StringMaker<Catch::Detail::Approx> {
        static std::string convert(Catch::Detail::Approx const& value);
    };

} // end namespace Catch

// end catch_approx.h
// start catch_string_manip.h

#include <string>
#include <iosfwd>
#include <vector>

namespace Catch {

    bool startsWith(std::string const& s, std::string const& prefix);
    bool startsWith(std::string const& s, char prefix);
    bool endsWith(std::string const& s, std::string const& suffix);
    bool endsWith(std::string const& s, char suffix);
    bool contains(std::string const& s, std::string const& infix);
    void toLowerInPlace(std::string& s);
    std::string toLower(std::string const& s);
    //! Returns a new string without whitespace at the start/end
    std::string trim(std::string const& str);
    //! Returns a substring of the original ref without whitespace. Beware
    //! lifetimes!
    StringRef trim(StringRef ref);

    // !!! Be aware, returns refs into original string - make sure original
    // string outlives them
    std::vector<StringRef> splitStringRef(StringRef str, char delimiter);
    bool
    replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis);

    struct pluralise {
        pluralise(std::size_t count, std::string const& label);

        friend std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser);

        std::size_t m_count;
        std::string m_label;
    };
} // namespace Catch

// end catch_string_manip.h
#ifndef CATCH_CONFIG_DISABLE_MATCHERS
// start catch_capture_matchers.h

// start catch_matchers.h

#include <string>
#include <vector>

namespace Catch {
    namespace Matchers {
        namespace Impl {

            template <typename ArgT> struct MatchAllOf;
            template <typename ArgT> struct MatchAnyOf;
            template <typename ArgT> struct MatchNotOf;

            class MatcherUntypedBase {
            public:
                MatcherUntypedBase() = default;
                MatcherUntypedBase(MatcherUntypedBase const&) = default;
                MatcherUntypedBase& operator=(MatcherUntypedBase const&) = delete;
                std::string toString() const;

            protected:
                virtual ~MatcherUntypedBase();
                virtual std::string describe() const = 0;
                mutable std::string m_cachedToString;
            };

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
#endif

            template <typename ObjectT> struct MatcherMethod {
                virtual bool match(ObjectT const& arg) const = 0;
            };

#if defined(__OBJC__)
            // Hack to fix Catch GH issue #1661. Could use id for generic Object
            // support. use of const for Object pointers is very uncommon and
            // under ARC it causes some kind of signature mismatch that breaks
            // compilation
            template <> struct MatcherMethod<NSString*> {
                virtual bool match(NSString* arg) const = 0;
            };
#endif

#ifdef __clang__
#pragma clang diagnostic pop
#endif

            template <typename T> struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {

                MatchAllOf<T> operator&&(MatcherBase const& other) const;
                MatchAnyOf<T> operator||(MatcherBase const& other) const;
                MatchNotOf<T> operator!() const;
            };

            template <typename ArgT> struct MatchAllOf : MatcherBase<ArgT> {
                bool match(ArgT const& arg) const override {
                    for (auto matcher : m_matchers) {
                        if (!matcher->match(arg))
                            return false;
                    }
                    return true;
                }
                std::string describe() const override {
                    std::string description;
                    description.reserve(4 + m_matchers.size() * 32);
                    description += "( ";
                    bool first = true;
                    for (auto matcher : m_matchers) {
                        if (first)
                            first = false;
                        else
                            description += " and ";
                        description += matcher->toString();
                    }
                    description += " )";
                    return description;
                }

                MatchAllOf<ArgT> operator&&(MatcherBase<ArgT> const& other) {
                    auto copy(*this);
                    copy.m_matchers.push_back(&other);
                    return copy;
                }

                std::vector<MatcherBase<ArgT> const*> m_matchers;
            };
            template <typename ArgT> struct MatchAnyOf : MatcherBase<ArgT> {

                bool match(ArgT const& arg) const override {
                    for (auto matcher : m_matchers) {
                        if (matcher->match(arg))
                            return true;
                    }
                    return false;
                }
                std::string describe() const override {
                    std::string description;
                    description.reserve(4 + m_matchers.size() * 32);
                    description += "( ";
                    bool first = true;
                    for (auto matcher : m_matchers) {
                        if (first)
                            first = false;
                        else
                            description += " or ";
                        description += matcher->toString();
                    }
                    description += " )";
                    return description;
                }

                MatchAnyOf<ArgT> operator||(MatcherBase<ArgT> const& other) {
                    auto copy(*this);
                    copy.m_matchers.push_back(&other);
                    return copy;
                }

                std::vector<MatcherBase<ArgT> const*> m_matchers;
            };

            template <typename ArgT> struct MatchNotOf : MatcherBase<ArgT> {

                MatchNotOf(MatcherBase<ArgT> const& underlyingMatcher) :
                    m_underlyingMatcher(underlyingMatcher) {}

                bool match(ArgT const& arg) const override {
                    return !m_underlyingMatcher.match(arg);
                }

                std::string describe() const override {
                    return "not " + m_underlyingMatcher.toString();
                }
                MatcherBase<ArgT> const& m_underlyingMatcher;
            };

            template <typename T>
            MatchAllOf<T> MatcherBase<T>::operator&&(MatcherBase const& other) const {
                return MatchAllOf<T>() && *this && other;
            }
            template <typename T>
            MatchAnyOf<T> MatcherBase<T>::operator||(MatcherBase const& other) const {
                return MatchAnyOf<T>() || *this || other;
            }
            template <typename T> MatchNotOf<T> MatcherBase<T>::operator!() const {
                return MatchNotOf<T>(*this);
            }

        } // namespace Impl

    } // namespace Matchers

    using namespace Matchers;
    using Matchers::Impl::MatcherBase;

} // namespace Catch

// end catch_matchers.h
// start catch_matchers_exception.hpp

namespace Catch {
    namespace Matchers {
        namespace Exception {

            class ExceptionMessageMatcher : public MatcherBase<std::exception> {
                std::string m_message;

            public:
                ExceptionMessageMatcher(std::string const& message) : m_message(message) {}

                bool match(std::exception const& ex) const override;

                std::string describe() const override;
            };

        } // namespace Exception

        Exception::ExceptionMessageMatcher Message(std::string const& message);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_exception.hpp
// start catch_matchers_floating.h

namespace Catch {
    namespace Matchers {

        namespace Floating {

            enum class FloatingPointKind : uint8_t;

            struct WithinAbsMatcher : MatcherBase<double> {
                WithinAbsMatcher(double target, double margin);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                double m_margin;
            };

            struct WithinUlpsMatcher : MatcherBase<double> {
                WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                uint64_t m_ulps;
                FloatingPointKind m_type;
            };

            // Given IEEE-754 format for floats and doubles, we can assume
            // that float -> double promotion is lossless. Given this, we can
            // assume that if we do the standard relative comparison of
            // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get
            // the same result if we do this for floats, as if we do this for
            // doubles that were promoted from floats.
            struct WithinRelMatcher : MatcherBase<double> {
                WithinRelMatcher(double target, double epsilon);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                double m_epsilon;
            };

        } // namespace Floating

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred
        Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff);
        Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff);
        Floating::WithinAbsMatcher WithinAbs(double target, double margin);
        Floating::WithinRelMatcher WithinRel(double target, double eps);
        // defaults epsilon to 100*numeric_limits<double>::epsilon()
        Floating::WithinRelMatcher WithinRel(double target);
        Floating::WithinRelMatcher WithinRel(float target, float eps);
        // defaults epsilon to 100*numeric_limits<float>::epsilon()
        Floating::WithinRelMatcher WithinRel(float target);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_floating.h
// start catch_matchers_generic.hpp

#include <functional>
#include <string>

namespace Catch {
    namespace Matchers {
        namespace Generic {

            namespace Detail {
                std::string finalizeDescription(const std::string& desc);
            }

            template <typename T> class PredicateMatcher : public MatcherBase<T> {
                std::function<bool(T const&)> m_predicate;
                std::string m_description;

            public:
                PredicateMatcher(std::function<bool(T const&)> const& elem,
                                 std::string const& descr) :
                    m_predicate(std::move(elem)),
                    m_description(Detail::finalizeDescription(descr)) {}

                bool match(T const& item) const override { return m_predicate(item); }

                std::string describe() const override { return m_description; }
            };

        } // namespace Generic

        // The following functions create the actual matcher objects.
        // The user has to explicitly specify type to the function, because
        // inferring std::function<bool(T const&)> is hard (but possible) and
        // requires a lot of TMP.
        template <typename T>
        Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate,
                                               std::string const& description = "") {
            return Generic::PredicateMatcher<T>(predicate, description);
        }

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_generic.hpp
// start catch_matchers_string.h

#include <string>

namespace Catch {
    namespace Matchers {

        namespace StdString {

            struct CasedString {
                CasedString(std::string const& str, CaseSensitive::Choice caseSensitivity);
                std::string adjustString(std::string const& str) const;
                std::string caseSensitivitySuffix() const;

                CaseSensitive::Choice m_caseSensitivity;
                std::string m_str;
            };

            struct StringMatcherBase : MatcherBase<std::string> {
                StringMatcherBase(std::string const& operation, CasedString const& comparator);
                std::string describe() const override;

                CasedString m_comparator;
                std::string m_operation;
            };

            struct EqualsMatcher : StringMatcherBase {
                EqualsMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct ContainsMatcher : StringMatcherBase {
                ContainsMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct StartsWithMatcher : StringMatcherBase {
                StartsWithMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct EndsWithMatcher : StringMatcherBase {
                EndsWithMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };

            struct RegexMatcher : MatcherBase<std::string> {
                RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity);
                bool match(std::string const& matchee) const override;
                std::string describe() const override;

            private:
                std::string m_regex;
                CaseSensitive::Choice m_caseSensitivity;
            };

        } // namespace StdString

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred

        StdString::EqualsMatcher Equals(std::string const& str,
                                        CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::ContainsMatcher
        Contains(std::string const& str,
                 CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::EndsWithMatcher
        EndsWith(std::string const& str,
                 CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::StartsWithMatcher
        StartsWith(std::string const& str,
                   CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::RegexMatcher Matches(std::string const& regex,
                                        CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_string.h
// start catch_matchers_vector.h

#include <algorithm>

namespace Catch {
    namespace Matchers {

        namespace Vector {
            template <typename T, typename Alloc>
            struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {

                ContainsElementMatcher(T const& comparator) : m_comparator(comparator) {}

                bool match(std::vector<T, Alloc> const& v) const override {
                    for (auto const& el : v) {
                        if (el == m_comparator) {
                            return true;
                        }
                    }
                    return false;
                }

                std::string describe() const override {
                    return "Contains: " + ::Catch::Detail::stringify(m_comparator);
                }

                T const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                ContainsMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    // !TBD: see note in EqualsMatcher
                    if (m_comparator.size() > v.size())
                        return false;
                    for (auto const& comparator : m_comparator) {
                        auto present = false;
                        for (const auto& el : v) {
                            if (el == comparator) {
                                present = true;
                                break;
                            }
                        }
                        if (!present) {
                            return false;
                        }
                    }
                    return true;
                }
                std::string describe() const override {
                    return "Contains: " + ::Catch::Detail::stringify(m_comparator);
                }

                std::vector<T, AllocComp> const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                EqualsMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    // !TBD: This currently works if all elements can be
                    // compared using !=
                    // - a more general approach would be via a compare template
                    // that defaults to using !=. but could be specialised for,
                    // e.g. std::vector<T, Alloc> etc
                    // - then just call that directly
                    if (m_comparator.size() != v.size())
                        return false;
                    for (std::size_t i = 0; i < v.size(); ++i)
                        if (m_comparator[i] != v[i])
                            return false;
                    return true;
                }
                std::string describe() const override {
                    return "Equals: " + ::Catch::Detail::stringify(m_comparator);
                }
                std::vector<T, AllocComp> const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                ApproxMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    if (m_comparator.size() != v.size())
                        return false;
                    for (std::size_t i = 0; i < v.size(); ++i)
                        if (m_comparator[i] != approx(v[i]))
                            return false;
                    return true;
                }
                std::string describe() const override {
                    return "is approx: " + ::Catch::Detail::stringify(m_comparator);
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& epsilon(T const& newEpsilon) {
                    approx.epsilon(newEpsilon);
                    return *this;
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& margin(T const& newMargin) {
                    approx.margin(newMargin);
                    return *this;
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& scale(T const& newScale) {
                    approx.scale(newScale);
                    return *this;
                }

                std::vector<T, AllocComp> const& m_comparator;
                mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
                UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) :
                    m_target(target) {}
                bool match(std::vector<T, AllocMatch> const& vec) const override {
                    if (m_target.size() != vec.size()) {
                        return false;
                    }
                    return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
                }

                std::string describe() const override {
                    return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target);
                }

            private:
                std::vector<T, AllocComp> const& m_target;
            };

        } // namespace Vector

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::ContainsMatcher<T, AllocComp, AllocMatch>
        Contains(std::vector<T, AllocComp> const& comparator) {
            return Vector::ContainsMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T, typename Alloc = std::allocator<T>>
        Vector::ContainsElementMatcher<T, Alloc> VectorContains(T const& comparator) {
            return Vector::ContainsElementMatcher<T, Alloc>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::EqualsMatcher<T, AllocComp, AllocMatch>
        Equals(std::vector<T, AllocComp> const& comparator) {
            return Vector::EqualsMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::ApproxMatcher<T, AllocComp, AllocMatch>
        Approx(std::vector<T, AllocComp> const& comparator) {
            return Vector::ApproxMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>
        UnorderedEquals(std::vector<T, AllocComp> const& target) {
            return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>(target);
        }

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_vector.h
namespace Catch {

    template <typename ArgT, typename MatcherT> class MatchExpr : public ITransientExpression {
        ArgT const& m_arg;
        MatcherT m_matcher;
        StringRef m_matcherString;

    public:
        MatchExpr(ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString) :
            ITransientExpression{true, matcher.match(arg)},
            m_arg(arg),
            m_matcher(matcher),
            m_matcherString(matcherString) {}

        void streamReconstructedExpression(std::ostream& os) const override {
            auto matcherAsString = m_matcher.toString();
            os << Catch::Detail::stringify(m_arg) << ' ';
            if (matcherAsString == Detail::unprintableString)
                os << m_matcherString;
            else
                os << matcherAsString;
        }
    };

    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;

    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  StringMatcher const& matcher,
                                  StringRef const& matcherString);

    template <typename ArgT, typename MatcherT>
    auto makeMatchExpr(ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString)
        -> MatchExpr<ArgT, MatcherT> {
        return MatchExpr<ArgT, MatcherT>(arg, matcher, matcherString);
    }

} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CHECK_THAT(macroName, matcher, resultDisposition, arg)                            \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher),                  \
            resultDisposition);                                                                    \
        INTERNAL_CATCH_TRY {                                                                       \
            catchAssertionHandler.handleExpr(                                                      \
                Catch::makeMatchExpr(arg, matcher, #matcher##_catch_sr));                          \
        }                                                                                          \
        INTERNAL_CATCH_CATCH(catchAssertionHandler)                                                \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS_MATCHES(macroName, exceptionType, resultDisposition, matcher, ...)   \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(                   \
                exceptionType) ","                                                                 \
                               " " CATCH_INTERNAL_STRINGIFY(matcher),                              \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (exceptionType const& ex) {                                                    \
                catchAssertionHandler.handleExpr(                                                  \
                    Catch::makeMatchExpr(ex, matcher, #matcher##_catch_sr));                       \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleUnexpectedInflightException();                         \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

// end catch_capture_matchers.h
#endif
// start catch_generators.hpp

// start catch_interfaces_generatortracker.h

#include <memory>

namespace Catch {

    namespace Generators {
        class GeneratorUntypedBase {
        public:
            GeneratorUntypedBase() = default;
            virtual ~GeneratorUntypedBase();
            // Attempts to move the generator to the next element
            //
            // Returns true iff the move succeeded (and a valid element
            // can be retrieved).
            virtual bool next() = 0;
        };
        using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>;

    } // namespace Generators

    struct IGeneratorTracker {
        virtual ~IGeneratorTracker();
        virtual auto hasGenerator() const -> bool = 0;
        virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0;
        virtual void setGenerator(Generators::GeneratorBasePtr&& generator) = 0;
    };

} // namespace Catch

// end catch_interfaces_generatortracker.h
// start catch_enforce.h

#include <exception>

namespace Catch {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    template <typename Ex> [[noreturn]] void throw_exception(Ex const& e) { throw e; }
#else // ^^ Exceptions are enabled //  Exceptions are disabled vv
    [[noreturn]] void throw_exception(std::exception const& e);
#endif

    [[noreturn]] void throw_logic_error(std::string const& msg);
    [[noreturn]] void throw_domain_error(std::string const& msg);
    [[noreturn]] void throw_runtime_error(std::string const& msg);

} // namespace Catch

#define CATCH_MAKE_MSG(...) (Catch::ReusableStringStream() << __VA_ARGS__).str()

#define CATCH_INTERNAL_ERROR(...)                                                                  \
    Catch::throw_logic_error(                                                                      \
        CATCH_MAKE_MSG(CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__))

#define CATCH_ERROR(...) Catch::throw_domain_error(CATCH_MAKE_MSG(__VA_ARGS__))

#define CATCH_RUNTIME_ERROR(...) Catch::throw_runtime_error(CATCH_MAKE_MSG(__VA_ARGS__))

#define CATCH_ENFORCE(condition, ...)                                                              \
    do {                                                                                           \
        if (!(condition))                                                                          \
            CATCH_ERROR(__VA_ARGS__);                                                              \
    } while (false)

// end catch_enforce.h
#include <memory>
#include <vector>
#include <cassert>

#include <utility>
#include <exception>

namespace Catch {

    class GeneratorException : public std::exception {
        const char* const m_msg = "";

    public:
        GeneratorException(const char* msg) : m_msg(msg) {}

        const char* what() const noexcept override final;
    };

    namespace Generators {

        // !TBD move this into its own location?
        namespace pf {
            template <typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
                return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
            }
        } // namespace pf

        template <typename T> struct IGenerator : GeneratorUntypedBase {
            virtual ~IGenerator() = default;

            // Returns the current element of the generator
            //
            // \Precondition The generator is either freshly constructed,
            // or the last call to `next()` returned true
            virtual T const& get() const = 0;
            using type = T;
        };

        template <typename T> class SingleValueGenerator final : public IGenerator<T> {
            T m_value;

        public:
            SingleValueGenerator(T&& value) : m_value(std::move(value)) {}

            T const& get() const override { return m_value; }
            bool next() override { return false; }
        };

        template <typename T> class FixedValuesGenerator final : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "FixedValuesGenerator does not support bools because "
                          "of std::vector<bool>"
                          "specialization, use SingleValue Generator instead.");
            std::vector<T> m_values;
            size_t m_idx = 0;

        public:
            FixedValuesGenerator(std::initializer_list<T> values) : m_values(values) {}

            T const& get() const override { return m_values[m_idx]; }
            bool next() override {
                ++m_idx;
                return m_idx < m_values.size();
            }
        };

        template <typename T> class GeneratorWrapper final {
            std::unique_ptr<IGenerator<T>> m_generator;

        public:
            GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator) :
                m_generator(std::move(generator)) {}
            T const& get() const { return m_generator->get(); }
            bool next() { return m_generator->next(); }
        };

        template <typename T> GeneratorWrapper<T> value(T&& value) {
            return GeneratorWrapper<T>(
                pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));
        }
        template <typename T> GeneratorWrapper<T> values(std::initializer_list<T> values) {
            return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values));
        }

        template <typename T> class Generators : public IGenerator<T> {
            std::vector<GeneratorWrapper<T>> m_generators;
            size_t m_current = 0;

            void populate(GeneratorWrapper<T>&& generator) {
                m_generators.emplace_back(std::move(generator));
            }
            void populate(T&& val) { m_generators.emplace_back(value(std::forward<T>(val))); }
            template <typename U> void populate(U&& val) { populate(T(std::forward<U>(val))); }
            template <typename U, typename... Gs>
            void populate(U&& valueOrGenerator, Gs&&... moreGenerators) {
                populate(std::forward<U>(valueOrGenerator));
                populate(std::forward<Gs>(moreGenerators)...);
            }

        public:
            template <typename... Gs> Generators(Gs&&... moreGenerators) {
                m_generators.reserve(sizeof...(Gs));
                populate(std::forward<Gs>(moreGenerators)...);
            }

            T const& get() const override { return m_generators[m_current].get(); }

            bool next() override {
                if (m_current >= m_generators.size()) {
                    return false;
                }
                const bool current_status = m_generators[m_current].next();
                if (!current_status) {
                    ++m_current;
                }
                return m_current < m_generators.size();
            }
        };

        template <typename... Ts>
        GeneratorWrapper<std::tuple<Ts...>>
        table(std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples) {
            return values<std::tuple<Ts...>>(tuples);
        }

        // Tag type to signal that a generator sequence should convert arguments
        // to a specific type
        template <typename T> struct as {};

        template <typename T, typename... Gs>
        auto makeGenerators(GeneratorWrapper<T>&& generator, Gs&&... moreGenerators)
            -> Generators<T> {
            return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);
        }
        template <typename T>
        auto makeGenerators(GeneratorWrapper<T>&& generator) -> Generators<T> {
            return Generators<T>(std::move(generator));
        }
        template <typename T, typename... Gs>
        auto makeGenerators(T&& val, Gs&&... moreGenerators) -> Generators<T> {
            return makeGenerators(value(std::forward<T>(val)), std::forward<Gs>(moreGenerators)...);
        }
        template <typename T, typename U, typename... Gs>
        auto makeGenerators(as<T>, U&& val, Gs&&... moreGenerators) -> Generators<T> {
            return makeGenerators(value(T(std::forward<U>(val))),
                                  std::forward<Gs>(moreGenerators)...);
        }

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker&;

        template <typename L>
        // Note: The type after -> is weird, because VS2015 cannot parse
        //       the expression used in the typedef inside, when it is in
        //       return type. Yeah.
        auto generate(StringRef generatorName,
                      SourceLineInfo const& lineInfo,
                      L const& generatorExpression)
            -> decltype(std::declval<decltype(generatorExpression())>().get()) {
            using UnderlyingType = typename decltype(generatorExpression())::type;

            IGeneratorTracker& tracker = acquireGeneratorTracker(generatorName, lineInfo);
            if (!tracker.hasGenerator()) {
                tracker.setGenerator(
                    pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));
            }

            auto const& generator =
                static_cast<IGenerator<UnderlyingType> const&>(*tracker.getGenerator());
            return generator.get();
        }

    } // namespace Generators
} // namespace Catch

#define GENERATE(...)                                                                              \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [] {                                                               \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)
#define GENERATE_COPY(...)                                                                         \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [=] {                                                              \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)
#define GENERATE_REF(...)                                                                          \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [&] {                                                              \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)

// end catch_generators.hpp
// start catch_generators_generic.hpp

namespace Catch {
    namespace Generators {

        template <typename T> class TakeGenerator : public IGenerator<T> {
            GeneratorWrapper<T> m_generator;
            size_t m_returned = 0;
            size_t m_target;

        public:
            TakeGenerator(size_t target, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_target(target) {
                assert(target != 0 && "Empty generators are not allowed");
            }
            T const& get() const override { return m_generator.get(); }
            bool next() override {
                ++m_returned;
                if (m_returned >= m_target) {
                    return false;
                }

                const auto success = m_generator.next();
                // If the underlying generator does not contain enough values
                // then we cut short as well
                if (!success) {
                    m_returned = m_target;
                }
                return success;
            }
        };

        template <typename T>
        GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                pf::make_unique<TakeGenerator<T>>(target, std::move(generator)));
        }

        template <typename T, typename Predicate> class FilterGenerator : public IGenerator<T> {
            GeneratorWrapper<T> m_generator;
            Predicate m_predicate;

        public:
            template <typename P = Predicate>
            FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_predicate(std::forward<P>(pred)) {
                if (!m_predicate(m_generator.get())) {
                    // It might happen that there are no values that pass the
                    // filter. In that case we throw an exception.
                    auto has_initial_value = next();
                    if (!has_initial_value) {
                        Catch::throw_exception(
                            GeneratorException("No valid value found in filtered generator"));
                    }
                }
            }

            T const& get() const override { return m_generator.get(); }

            bool next() override {
                bool success = m_generator.next();
                if (!success) {
                    return false;
                }
                while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true)
                    ;
                return success;
            }
        };

        template <typename T, typename Predicate>
        GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(
                    std::forward<Predicate>(pred), std::move(generator))));
        }

        template <typename T> class RepeatGenerator : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "RepeatGenerator currently does not support bools"
                          "because of std::vector<bool> specialization");
            GeneratorWrapper<T> m_generator;
            mutable std::vector<T> m_returned;
            size_t m_target_repeats;
            size_t m_current_repeat = 0;
            size_t m_repeat_index = 0;

        public:
            RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_target_repeats(repeats) {
                assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
            }

            T const& get() const override {
                if (m_current_repeat == 0) {
                    m_returned.push_back(m_generator.get());
                    return m_returned.back();
                }
                return m_returned[m_repeat_index];
            }

            bool next() override {
                // There are 2 basic cases:
                // 1) We are still reading the generator
                // 2) We are reading our own cache

                // In the first case, we need to poke the underlying generator.
                // If it happily moves, we are left in that state, otherwise it
                // is time to start reading from our cache
                if (m_current_repeat == 0) {
                    const auto success = m_generator.next();
                    if (!success) {
                        ++m_current_repeat;
                    }
                    return m_current_repeat < m_target_repeats;
                }

                // In the second case, we need to move indices forward and check
                // that we haven't run up against the end
                ++m_repeat_index;
                if (m_repeat_index == m_returned.size()) {
                    m_repeat_index = 0;
                    ++m_current_repeat;
                }
                return m_current_repeat < m_target_repeats;
            }
        };

        template <typename T>
        GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));
        }

        template <typename T, typename U, typename Func> class MapGenerator : public IGenerator<T> {
            // TBD: provide static assert for mapping function, for friendly
            // error message
            GeneratorWrapper<U> m_generator;
            Func m_function;
            // To avoid returning dangling reference, we have to save the values
            T m_cache;

        public:
            template <typename F2 = Func>
            MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
                m_generator(std::move(generator)),
                m_function(std::forward<F2>(function)),
                m_cache(m_function(m_generator.get())) {}

            T const& get() const override { return m_cache; }
            bool next() override {
                const auto success = m_generator.next();
                if (success) {
                    m_cache = m_function(m_generator.get());
                }
                return success;
            }
        };

        template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>
        GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
            return GeneratorWrapper<T>(pf::make_unique<MapGenerator<T, U, Func>>(
                std::forward<Func>(function), std::move(generator)));
        }

        template <typename T, typename U, typename Func>
        GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
            return GeneratorWrapper<T>(pf::make_unique<MapGenerator<T, U, Func>>(
                std::forward<Func>(function), std::move(generator)));
        }

        template <typename T> class ChunkGenerator final : public IGenerator<std::vector<T>> {
            std::vector<T> m_chunk;
            size_t m_chunk_size;
            GeneratorWrapper<T> m_generator;
            bool m_used_up = false;

        public:
            ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
                m_chunk_size(size), m_generator(std::move(generator)) {
                m_chunk.reserve(m_chunk_size);
                if (m_chunk_size != 0) {
                    m_chunk.push_back(m_generator.get());
                    for (size_t i = 1; i < m_chunk_size; ++i) {
                        if (!m_generator.next()) {
                            Catch::throw_exception(
                                GeneratorException("Not enough values to initialize the first "
                                                   "chunk"));
                        }
                        m_chunk.push_back(m_generator.get());
                    }
                }
            }
            std::vector<T> const& get() const override { return m_chunk; }
            bool next() override {
                m_chunk.clear();
                for (size_t idx = 0; idx < m_chunk_size; ++idx) {
                    if (!m_generator.next()) {
                        return false;
                    }
                    m_chunk.push_back(m_generator.get());
                }
                return true;
            }
        };

        template <typename T>
        GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<std::vector<T>>(
                pf::make_unique<ChunkGenerator<T>>(size, std::move(generator)));
        }

    } // namespace Generators
} // namespace Catch

// end catch_generators_generic.hpp
// start catch_generators_specific.hpp

// start catch_context.h

#include <memory>

namespace Catch {

    struct IResultCapture;
    struct IRunner;
    struct IConfig;
    struct IMutableContext;

    using IConfigPtr = std::shared_ptr<IConfig const>;

    struct IContext {
        virtual ~IContext();

        virtual IResultCapture* getResultCapture() = 0;
        virtual IRunner* getRunner() = 0;
        virtual IConfigPtr const& getConfig() const = 0;
    };

    struct IMutableContext : IContext {
        virtual ~IMutableContext();
        virtual void setResultCapture(IResultCapture* resultCapture) = 0;
        virtual void setRunner(IRunner* runner) = 0;
        virtual void setConfig(IConfigPtr const& config) = 0;

    private:
        static IMutableContext* currentContext;
        friend IMutableContext& getCurrentMutableContext();
        friend void cleanUpContext();
        static void createContext();
    };

    inline IMutableContext& getCurrentMutableContext() {
        if (!IMutableContext::currentContext)
            IMutableContext::createContext();
        // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
        return *IMutableContext::currentContext;
    }

    inline IContext& getCurrentContext() { return getCurrentMutableContext(); }

    void cleanUpContext();

    class SimplePcg32;
    SimplePcg32& rng();
} // namespace Catch

// end catch_context.h
// start catch_interfaces_config.h

// start catch_option.hpp

namespace Catch {

    // An optional type
    template <typename T> class Option {
    public:
        Option() : nullableValue(nullptr) {}
        Option(T const& _value) : nullableValue(new (storage) T(_value)) {}
        Option(Option const& _other) : nullableValue(_other ? new (storage) T(*_other) : nullptr) {}

        ~Option() { reset(); }

        Option& operator=(Option const& _other) {
            if (&_other != this) {
                reset();
                if (_other)
                    nullableValue = new (storage) T(*_other);
            }
            return *this;
        }
        Option& operator=(T const& _value) {
            reset();
            nullableValue = new (storage) T(_value);
            return *this;
        }

        void reset() {
            if (nullableValue)
                nullableValue->~T();
            nullableValue = nullptr;
        }

        T& operator*() { return *nullableValue; }
        T const& operator*() const { return *nullableValue; }
        T* operator->() { return nullableValue; }
        const T* operator->() const { return nullableValue; }

        T valueOr(T const& defaultValue) const {
            return nullableValue ? *nullableValue : defaultValue;
        }

        bool some() const { return nullableValue != nullptr; }
        bool none() const { return nullableValue == nullptr; }

        bool operator!() const { return nullableValue == nullptr; }
        explicit operator bool() const { return some(); }

    private:
        T* nullableValue;
        alignas(alignof(T)) char storage[sizeof(T)];
    };

} // end namespace Catch

// end catch_option.hpp
#include <chrono>
#include <iosfwd>
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    enum class Verbosity { Quiet = 0, Normal, High };

    struct WarnAbout {
        enum What { Nothing = 0x00, NoAssertions = 0x01, NoTests = 0x02 };
    };

    struct ShowDurations {
        enum OrNot { DefaultForReporter, Always, Never };
    };
    struct RunTests {
        enum InWhatOrder { InDeclarationOrder, InLexicographicalOrder, InRandomOrder };
    };
    struct UseColour {
        enum YesOrNo { Auto, Yes, No };
    };
    struct WaitForKeypress {
        enum When {
            Never,
            BeforeStart = 1,
            BeforeExit = 2,
            BeforeStartAndExit = BeforeStart | BeforeExit
        };
    };

    class TestSpec;

    struct IConfig : NonCopyable {

        virtual ~IConfig();

        virtual bool allowThrows() const = 0;
        virtual std::ostream& stream() const = 0;
        virtual std::string name() const = 0;
        virtual bool includeSuccessfulResults() const = 0;
        virtual bool shouldDebugBreak() const = 0;
        virtual bool warnAboutMissingAssertions() const = 0;
        virtual bool warnAboutNoTests() const = 0;
        virtual int abortAfter() const = 0;
        virtual bool showInvisibles() const = 0;
        virtual ShowDurations::OrNot showDurations() const = 0;
        virtual double minDuration() const = 0;
        virtual TestSpec const& testSpec() const = 0;
        virtual bool hasTestFilters() const = 0;
        virtual std::vector<std::string> const& getTestsOrTags() const = 0;
        virtual RunTests::InWhatOrder runOrder() const = 0;
        virtual unsigned int rngSeed() const = 0;
        virtual UseColour::YesOrNo useColour() const = 0;
        virtual std::vector<std::string> const& getSectionsToRun() const = 0;
        virtual Verbosity verbosity() const = 0;

        virtual bool benchmarkNoAnalysis() const = 0;
        virtual int benchmarkSamples() const = 0;
        virtual double benchmarkConfidenceInterval() const = 0;
        virtual unsigned int benchmarkResamples() const = 0;
        virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0;
    };

    using IConfigPtr = std::shared_ptr<IConfig const>;
} // namespace Catch

// end catch_interfaces_config.h
// start catch_random_number_generator.h

#include <cstdint>

namespace Catch {

    // This is a simple implementation of C++11 Uniform Random Number
    // Generator. It does not provide all operators, because Catch2
    // does not use it, but it should behave as expected inside stdlib's
    // distributions.
    // The implementation is based on the PCG family (http://pcg-random.org)
    class SimplePcg32 {
        using state_type = std::uint64_t;

    public:
        using result_type = std::uint32_t;
        static constexpr result_type(min)() { return 0; }
        static constexpr result_type(max)() { return static_cast<result_type>(-1); }

        // Provide some default initial state for the default constructor
        SimplePcg32() : SimplePcg32(0xed743cc4U) {}

        explicit SimplePcg32(result_type seed_);

        void seed(result_type seed_);
        void discard(uint64_t skip);

        result_type operator()();

    private:
        friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
        friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs);

        // In theory we also need operator<< and operator>>
        // In practice we do not use them, so we will skip them for now

        std::uint64_t m_state;
        // This part of the state determines which "stream" of the numbers
        // is chosen -- we take it as a constant for Catch2, so we only
        // need to deal with seeding the main state.
        // Picked by reading 8 bytes from `/dev/random` :-)
        static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;
    };

} // end namespace Catch

// end catch_random_number_generator.h
#include <random>

namespace Catch {
    namespace Generators {

        template <typename Float> class RandomFloatingGenerator final : public IGenerator<Float> {
            Catch::SimplePcg32& m_rng;
            std::uniform_real_distribution<Float> m_dist;
            Float m_current_number;

        public:
            RandomFloatingGenerator(Float a, Float b) : m_rng(rng()), m_dist(a, b) {
                static_cast<void>(next());
            }

            Float const& get() const override { return m_current_number; }
            bool next() override {
                m_current_number = m_dist(m_rng);
                return true;
            }
        };

        template <typename Integer>
        class RandomIntegerGenerator final : public IGenerator<Integer> {
            Catch::SimplePcg32& m_rng;
            std::uniform_int_distribution<Integer> m_dist;
            Integer m_current_number;

        public:
            RandomIntegerGenerator(Integer a, Integer b) : m_rng(rng()), m_dist(a, b) {
                static_cast<void>(next());
            }

            Integer const& get() const override { return m_current_number; }
            bool next() override {
                m_current_number = m_dist(m_rng);
                return true;
            }
        };

        // TODO: Ideally this would be also constrained against the various char
        // types,
        //       but I don't expect users to run into that in practice.
        template <typename T>
        typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value,
                                GeneratorWrapper<T>>::type
        random(T a, T b) {
            return GeneratorWrapper<T>(pf::make_unique<RandomIntegerGenerator<T>>(a, b));
        }

        template <typename T>
        typename std::enable_if<std::is_floating_point<T>::value, GeneratorWrapper<T>>::type
        random(T a, T b) {
            return GeneratorWrapper<T>(pf::make_unique<RandomFloatingGenerator<T>>(a, b));
        }

        template <typename T> class RangeGenerator final : public IGenerator<T> {
            T m_current;
            T m_end;
            T m_step;
            bool m_positive;

        public:
            RangeGenerator(T const& start, T const& end, T const& step) :
                m_current(start), m_end(end), m_step(step), m_positive(m_step > T(0)) {
                assert(m_current != m_end && "Range start and end cannot be equal");
                assert(m_step != T(0) && "Step size cannot be zero");
                assert(
                    ((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) &&
                    "Step moves away from end");
            }

            RangeGenerator(T const& start, T const& end) :
                RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) {}

            T const& get() const override { return m_current; }

            bool next() override {
                m_current += m_step;
                return (m_positive) ? (m_current < m_end) : (m_current > m_end);
            }
        };

        template <typename T>
        GeneratorWrapper<T> range(T const& start, T const& end, T const& step) {
            static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value,
                          "Type must be numeric");
            return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));
        }

        template <typename T> GeneratorWrapper<T> range(T const& start, T const& end) {
            static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value,
                          "Type must be an integer");
            return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));
        }

        template <typename T> class IteratorGenerator final : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "IteratorGenerator currently does not support bools"
                          "because of std::vector<bool> specialization");

            std::vector<T> m_elems;
            size_t m_current = 0;

        public:
            template <typename InputIterator, typename InputSentinel>
            IteratorGenerator(InputIterator first, InputSentinel last) : m_elems(first, last) {
                if (m_elems.empty()) {
                    Catch::throw_exception(
                        GeneratorException("IteratorGenerator received no valid values"));
                }
            }

            T const& get() const override { return m_elems[m_current]; }

            bool next() override {
                ++m_current;
                return m_current != m_elems.size();
            }
        };

        template <typename InputIterator,
                  typename InputSentinel,
                  typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
        GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
            return GeneratorWrapper<ResultType>(
                pf::make_unique<IteratorGenerator<ResultType>>(from, to));
        }

        template <typename Container, typename ResultType = typename Container::value_type>
        GeneratorWrapper<ResultType> from_range(Container const& cnt) {
            return GeneratorWrapper<ResultType>(
                pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));
        }

    } // namespace Generators
} // namespace Catch

// end catch_generators_specific.hpp

// These files are included here so the single_include script doesn't put them
// in the conditionally compiled sections
// start catch_test_case_info.h

#include <string>
#include <vector>
#include <memory>

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

namespace Catch {

    struct ITestInvoker;

    struct TestCaseInfo {
        enum SpecialProperties {
            None = 0,
            IsHidden = 1 << 1,
            ShouldFail = 1 << 2,
            MayFail = 1 << 3,
            Throws = 1 << 4,
            NonPortable = 1 << 5,
            Benchmark = 1 << 6
        };

        TestCaseInfo(std::string const& _name,
                     std::string const& _className,
                     std::string const& _description,
                     std::vector<std::string> const& _tags,
                     SourceLineInfo const& _lineInfo);

        friend void setTags(TestCaseInfo& testCaseInfo, std::vector<std::string> tags);

        bool isHidden() const;
        bool throws() const;
        bool okToFail() const;
        bool expectedToFail() const;

        std::string tagsAsString() const;

        std::string name;
        std::string className;
        std::string description;
        std::vector<std::string> tags;
        std::vector<std::string> lcaseTags;
        SourceLineInfo lineInfo;
        SpecialProperties properties;
    };

    class TestCase : public TestCaseInfo {
    public:
        TestCase(ITestInvoker* testCase, TestCaseInfo&& info);

        TestCase withName(std::string const& _newName) const;

        void invoke() const;

        TestCaseInfo const& getTestCaseInfo() const;

        bool operator==(TestCase const& other) const;
        bool operator<(TestCase const& other) const;

    private:
        std::shared_ptr<ITestInvoker> test;
    };

    TestCase makeTestCase(ITestInvoker* testCase,
                          std::string const& className,
                          NameAndTags const& nameAndTags,
                          SourceLineInfo const& lineInfo);
} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_case_info.h
// start catch_interfaces_runner.h

namespace Catch {

    struct IRunner {
        virtual ~IRunner();
        virtual bool aborting() const = 0;
    };
} // namespace Catch

// end catch_interfaces_runner.h

#ifdef __OBJC__
// start catch_objc.hpp

#import <objc/runtime.h>

#include <string>

// NB. Any general catch headers included here must be included
// in catch.hpp first to make sure they are included by the single
// header for non obj-usage

///////////////////////////////////////////////////////////////////////////////
// This protocol is really only here for (self) documenting purposes, since
// all its methods are optional.
@protocol OcFixture

@optional

- (void)setUp;
- (void)tearDown;

@end

namespace Catch {

    class OcMethod : public ITestInvoker {

    public:
        OcMethod(Class cls, SEL sel) : m_cls(cls), m_sel(sel) {}

        virtual void invoke() const {
            id obj = [[m_cls alloc] init];

            performOptionalSelector(obj, @selector(setUp));
            performOptionalSelector(obj, m_sel);
            performOptionalSelector(obj, @selector(tearDown));

            arcSafeRelease(obj);
        }

    private:
        virtual ~OcMethod() {}

        Class m_cls;
        SEL m_sel;
    };

    namespace Detail {

        inline std::string getAnnotation(Class cls,
                                         std::string const& annotationName,
                                         std::string const& testCaseName) {
            NSString* selStr = [[NSString alloc]
                initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
            SEL sel = NSSelectorFromString(selStr);
            arcSafeRelease(selStr);
            id value = performOptionalSelector(cls, sel);
            if (value)
                return [(NSString*)value UTF8String];
            return "";
        }
    } // namespace Detail

    inline std::size_t registerTestMethods() {
        std::size_t noTestMethods = 0;
        int noClasses = objc_getClassList(nullptr, 0);

        Class* classes = (CATCH_UNSAFE_UNRETAINED Class*)malloc(sizeof(Class) * noClasses);
        objc_getClassList(classes, noClasses);

        for (int c = 0; c < noClasses; c++) {
            Class cls = classes[c];
            {
                u_int count;
                Method* methods = class_copyMethodList(cls, &count);
                for (u_int m = 0; m < count; m++) {
                    SEL selector = method_getName(methods[m]);
                    std::string methodName = sel_getName(selector);
                    if (startsWith(methodName, "Catch_TestCase_")) {
                        std::string testCaseName = methodName.substr(15);
                        std::string name = Detail::getAnnotation(cls, "Name", testCaseName);
                        std::string desc = Detail::getAnnotation(cls, "Description", testCaseName);
                        const char* className = class_getName(cls);

                        getMutableRegistryHub().registerTest(
                            makeTestCase(new OcMethod(cls, selector),
                                         className,
                                         NameAndTags(name.c_str(), desc.c_str()),
                                         SourceLineInfo("", 0)));
                        noTestMethods++;
                    }
                }
                free(methods);
            }
        }
        return noTestMethods;
    }

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)

    namespace Matchers {
        namespace Impl {
            namespace NSStringMatchers {

                struct StringHolder : MatcherBase<NSString*> {
                    StringHolder(NSString* substr) : m_substr([substr copy]) {}
                    StringHolder(StringHolder const& other) : m_substr([other.m_substr copy]) {}
                    StringHolder() { arcSafeRelease(m_substr); }

                    bool match(NSString* str) const override { return false; }

                    NSString* CATCH_ARC_STRONG m_substr;
                };

                struct Equals : StringHolder {
                    Equals(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) && [str isEqualToString:m_substr];
                    }

                    std::string describe() const override {
                        return "equals string: " + Catch::Detail::stringify(m_substr);
                    }
                };

                struct Contains : StringHolder {
                    Contains(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location != NSNotFound;
                    }

                    std::string describe() const override {
                        return "contains string: " + Catch::Detail::stringify(m_substr);
                    }
                };

                struct StartsWith : StringHolder {
                    StartsWith(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location == 0;
                    }

                    std::string describe() const override {
                        return "starts with: " + Catch::Detail::stringify(m_substr);
                    }
                };
                struct EndsWith : StringHolder {
                    EndsWith(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location ==
                                   [str length] - [m_substr length];
                    }

                    std::string describe() const override {
                        return "ends with: " + Catch::Detail::stringify(m_substr);
                    }
                };

            } // namespace NSStringMatchers
        }     // namespace Impl

        inline Impl::NSStringMatchers::Equals Equals(NSString* substr) {
            return Impl::NSStringMatchers::Equals(substr);
        }

        inline Impl::NSStringMatchers::Contains Contains(NSString* substr) {
            return Impl::NSStringMatchers::Contains(substr);
        }

        inline Impl::NSStringMatchers::StartsWith StartsWith(NSString* substr) {
            return Impl::NSStringMatchers::StartsWith(substr);
        }

        inline Impl::NSStringMatchers::EndsWith EndsWith(NSString* substr) {
            return Impl::NSStringMatchers::EndsWith(substr);
        }

    } // namespace Matchers

    using namespace Matchers;

#endif // CATCH_CONFIG_DISABLE_MATCHERS

} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define OC_MAKE_UNIQUE_NAME(root, uniqueSuffix) root##uniqueSuffix
#define OC_TEST_CASE2(name, desc, uniqueSuffix)                                                    \
    +(NSString*)OC_MAKE_UNIQUE_NAME(Catch_Name_test_, uniqueSuffix) {                              \
        return @name;                                                                              \
    }                                                                                              \
    +(NSString*)OC_MAKE_UNIQUE_NAME(Catch_Description_test_, uniqueSuffix) {                       \
        return @desc;                                                                              \
    }                                                                                              \
    -(void)OC_MAKE_UNIQUE_NAME(Catch_TestCase_test_, uniqueSuffix)

#define OC_TEST_CASE(name, desc) OC_TEST_CASE2(name, desc, __LINE__)

// end catch_objc.hpp
#endif

// Benchmarking needs the externally-facing parts of reporters to work
#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_external_interfaces.h

// start catch_reporter_bases.hpp

// start catch_interfaces_reporter.h

// start catch_config.hpp

// start catch_test_spec_parser.h

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

// start catch_test_spec.h

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

// start catch_wildcard_pattern.h

namespace Catch {
    class WildcardPattern {
        enum WildcardPosition {
            NoWildcard = 0,
            WildcardAtStart = 1,
            WildcardAtEnd = 2,
            WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
        };

    public:
        WildcardPattern(std::string const& pattern, CaseSensitive::Choice caseSensitivity);
        virtual ~WildcardPattern() = default;
        virtual bool matches(std::string const& str) const;

    private:
        std::string normaliseString(std::string const& str) const;
        CaseSensitive::Choice m_caseSensitivity;
        WildcardPosition m_wildcard = NoWildcard;
        std::string m_pattern;
    };
} // namespace Catch

// end catch_wildcard_pattern.h
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    struct IConfig;

    class TestSpec {
        class Pattern {
        public:
            explicit Pattern(std::string const& name);
            virtual ~Pattern();
            virtual bool matches(TestCaseInfo const& testCase) const = 0;
            std::string const& name() const;

        private:
            std::string const m_name;
        };
        using PatternPtr = std::shared_ptr<Pattern>;

        class NamePattern : public Pattern {
        public:
            explicit NamePattern(std::string const& name, std::string const& filterString);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            WildcardPattern m_wildcardPattern;
        };

        class TagPattern : public Pattern {
        public:
            explicit TagPattern(std::string const& tag, std::string const& filterString);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            std::string m_tag;
        };

        class ExcludedPattern : public Pattern {
        public:
            explicit ExcludedPattern(PatternPtr const& underlyingPattern);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            PatternPtr m_underlyingPattern;
        };

        struct Filter {
            std::vector<PatternPtr> m_patterns;

            bool matches(TestCaseInfo const& testCase) const;
            std::string name() const;
        };

    public:
        struct FilterMatch {
            std::string name;
            std::vector<TestCase const*> tests;
        };
        using Matches = std::vector<FilterMatch>;
        using vectorStrings = std::vector<std::string>;

        bool hasFilters() const;
        bool matches(TestCaseInfo const& testCase) const;
        Matches matchesByFilter(std::vector<TestCase> const& testCases,
                                IConfig const& config) const;
        const vectorStrings& getInvalidArgs() const;

    private:
        std::vector<Filter> m_filters;
        std::vector<std::string> m_invalidArgs;
        friend class TestSpecParser;
    };
} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_spec.h
// start catch_interfaces_tag_alias_registry.h

#include <string>

namespace Catch {

    struct TagAlias;

    struct ITagAliasRegistry {
        virtual ~ITagAliasRegistry();
        // Nullptr if not present
        virtual TagAlias const* find(std::string const& alias) const = 0;
        virtual std::string expandAliases(std::string const& unexpandedTestSpec) const = 0;

        static ITagAliasRegistry const& get();
    };

} // end namespace Catch

// end catch_interfaces_tag_alias_registry.h
namespace Catch {

    class TestSpecParser {
        enum Mode { None, Name, QuotedName, Tag, EscapedName };
        Mode m_mode = None;
        Mode lastMode = None;
        bool m_exclusion = false;
        std::size_t m_pos = 0;
        std::size_t m_realPatternPos = 0;
        std::string m_arg;
        std::string m_substring;
        std::string m_patternName;
        std::vector<std::size_t> m_escapeChars;
        TestSpec::Filter m_currentFilter;
        TestSpec m_testSpec;
        ITagAliasRegistry const* m_tagAliases = nullptr;

    public:
        TestSpecParser(ITagAliasRegistry const& tagAliases);

        TestSpecParser& parse(std::string const& arg);
        TestSpec testSpec();

    private:
        bool visitChar(char c);
        void startNewMode(Mode mode);
        bool processNoneChar(char c);
        void processNameChar(char c);
        bool processOtherChar(char c);
        void endMode();
        void escape();
        bool isControlChar(char c) const;
        void saveLastMode();
        void revertBackToLastMode();
        void addFilter();
        bool separate();

        // Handles common preprocessing of the pattern for name/tag patterns
        std::string preprocessPattern();
        // Adds the current pattern as a test name
        void addNamePattern();
        // Adds the current pattern as a tag
        void addTagPattern();

        inline void addCharToPattern(char c) {
            m_substring += c;
            m_patternName += c;
            m_realPatternPos++;
        }
    };
    TestSpec parseTestSpec(std::string const& arg);

} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_spec_parser.h
// Libstdc++ doesn't like incomplete classes for unique_ptr

#include <memory>
#include <vector>
#include <string>

#ifndef CATCH_CONFIG_CONSOLE_WIDTH
#define CATCH_CONFIG_CONSOLE_WIDTH 80
#endif

namespace Catch {

    struct IStream;

    struct ConfigData {
        bool listTests = false;
        bool listTags = false;
        bool listReporters = false;
        bool listTestNamesOnly = false;

        bool showSuccessfulTests = false;
        bool shouldDebugBreak = false;
        bool noThrow = false;
        bool showHelp = false;
        bool showInvisibles = false;
        bool filenamesAsTags = false;
        bool libIdentify = false;

        int abortAfter = -1;
        unsigned int rngSeed = 0;

        bool benchmarkNoAnalysis = false;
        unsigned int benchmarkSamples = 100;
        double benchmarkConfidenceInterval = 0.95;
        unsigned int benchmarkResamples = 100000;
        std::chrono::milliseconds::rep benchmarkWarmupTime = 100;

        Verbosity verbosity = Verbosity::Normal;
        WarnAbout::What warnings = WarnAbout::Nothing;
        ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;
        double minDuration = -1;
        RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;
        UseColour::YesOrNo useColour = UseColour::Auto;
        WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;

        std::string outputFilename;
        std::string name;
        std::string processName;
#ifndef CATCH_CONFIG_DEFAULT_REPORTER
#define CATCH_CONFIG_DEFAULT_REPORTER "console"
#endif
        std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER;
#undef CATCH_CONFIG_DEFAULT_REPORTER

        std::vector<std::string> testsOrTags;
        std::vector<std::string> sectionsToRun;
    };

    class Config : public IConfig {
    public:
        Config() = default;
        Config(ConfigData const& data);
        virtual ~Config() = default;

        std::string const& getFilename() const;

        bool listTests() const;
        bool listTestNamesOnly() const;
        bool listTags() const;
        bool listReporters() const;

        std::string getProcessName() const;
        std::string const& getReporterName() const;

        std::vector<std::string> const& getTestsOrTags() const override;
        std::vector<std::string> const& getSectionsToRun() const override;

        TestSpec const& testSpec() const override;
        bool hasTestFilters() const override;

        bool showHelp() const;

        // IConfig interface
        bool allowThrows() const override;
        std::ostream& stream() const override;
        std::string name() const override;
        bool includeSuccessfulResults() const override;
        bool warnAboutMissingAssertions() const override;
        bool warnAboutNoTests() const override;
        ShowDurations::OrNot showDurations() const override;
        double minDuration() const override;
        RunTests::InWhatOrder runOrder() const override;
        unsigned int rngSeed() const override;
        UseColour::YesOrNo useColour() const override;
        bool shouldDebugBreak() const override;
        int abortAfter() const override;
        bool showInvisibles() const override;
        Verbosity verbosity() const override;
        bool benchmarkNoAnalysis() const override;
        int benchmarkSamples() const override;
        double benchmarkConfidenceInterval() const override;
        unsigned int benchmarkResamples() const override;
        std::chrono::milliseconds benchmarkWarmupTime() const override;

    private:
        IStream const* openStream();
        ConfigData m_data;

        std::unique_ptr<IStream const> m_stream;
        TestSpec m_testSpec;
        bool m_hasTestFilters = false;
    };

} // end namespace Catch

// end catch_config.hpp
// start catch_assertionresult.h

#include <string>

namespace Catch {

    struct AssertionResultData {
        AssertionResultData() = delete;

        AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression);

        std::string message;
        mutable std::string reconstructedExpression;
        LazyExpression lazyExpression;
        ResultWas::OfType resultType;

        std::string reconstructExpression() const;
    };

    class AssertionResult {
    public:
        AssertionResult() = delete;
        AssertionResult(AssertionInfo const& info, AssertionResultData const& data);

        bool isOk() const;
        bool succeeded() const;
        ResultWas::OfType getResultType() const;
        bool hasExpression() const;
        bool hasMessage() const;
        std::string getExpression() const;
        std::string getExpressionInMacro() const;
        bool hasExpandedExpression() const;
        std::string getExpandedExpression() const;
        std::string getMessage() const;
        SourceLineInfo getSourceInfo() const;
        StringRef getTestMacroName() const;

        // protected:
        AssertionInfo m_info;
        AssertionResultData m_resultData;
    };

} // end namespace Catch

// end catch_assertionresult.h
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_estimate.hpp

// Statistics estimates

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct Estimate {
            Duration point;
            Duration lower_bound;
            Duration upper_bound;
            double confidence_interval;

            template <typename Duration2> operator Estimate<Duration2>() const {
                return {point, lower_bound, upper_bound, confidence_interval};
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_estimate.hpp
// start catch_outlier_classification.hpp

// Outlier information

namespace Catch {
    namespace Benchmark {
        struct OutlierClassification {
            int samples_seen = 0;
            int low_severe = 0;  // more than 3 times IQR below Q1
            int low_mild = 0;    // 1.5 to 3 times IQR below Q1
            int high_mild = 0;   // 1.5 to 3 times IQR above Q3
            int high_severe = 0; // more than 3 times IQR above Q3

            int total() const { return low_severe + low_mild + high_mild + high_severe; }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_outlier_classification.hpp

#include <iterator>
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

#include <string>
#include <iosfwd>
#include <map>
#include <set>
#include <memory>
#include <algorithm>

namespace Catch {

    struct ReporterConfig {
        explicit ReporterConfig(IConfigPtr const& _fullConfig);

        ReporterConfig(IConfigPtr const& _fullConfig, std::ostream& _stream);

        std::ostream& stream() const;
        IConfigPtr fullConfig() const;

    private:
        std::ostream* m_stream;
        IConfigPtr m_fullConfig;
    };

    struct ReporterPreferences {
        bool shouldRedirectStdOut = false;
        bool shouldReportAllAssertions = false;
    };

    template <typename T> struct LazyStat : Option<T> {
        LazyStat& operator=(T const& _value) {
            Option<T>::operator=(_value);
            used = false;
            return *this;
        }
        void reset() {
            Option<T>::reset();
            used = false;
        }
        bool used = false;
    };

    struct TestRunInfo {
        TestRunInfo(std::string const& _name);
        std::string name;
    };
    struct GroupInfo {
        GroupInfo(std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount);

        std::string name;
        std::size_t groupIndex;
        std::size_t groupsCounts;
    };

    struct AssertionStats {
        AssertionStats(AssertionResult const& _assertionResult,
                       std::vector<MessageInfo> const& _infoMessages,
                       Totals const& _totals);

        AssertionStats(AssertionStats const&) = default;
        AssertionStats(AssertionStats&&) = default;
        AssertionStats& operator=(AssertionStats const&) = delete;
        AssertionStats& operator=(AssertionStats&&) = delete;
        virtual ~AssertionStats();

        AssertionResult assertionResult;
        std::vector<MessageInfo> infoMessages;
        Totals totals;
    };

    struct SectionStats {
        SectionStats(SectionInfo const& _sectionInfo,
                     Counts const& _assertions,
                     double _durationInSeconds,
                     bool _missingAssertions);
        SectionStats(SectionStats const&) = default;
        SectionStats(SectionStats&&) = default;
        SectionStats& operator=(SectionStats const&) = default;
        SectionStats& operator=(SectionStats&&) = default;
        virtual ~SectionStats();

        SectionInfo sectionInfo;
        Counts assertions;
        double durationInSeconds;
        bool missingAssertions;
    };

    struct TestCaseStats {
        TestCaseStats(TestCaseInfo const& _testInfo,
                      Totals const& _totals,
                      std::string const& _stdOut,
                      std::string const& _stdErr,
                      bool _aborting);

        TestCaseStats(TestCaseStats const&) = default;
        TestCaseStats(TestCaseStats&&) = default;
        TestCaseStats& operator=(TestCaseStats const&) = default;
        TestCaseStats& operator=(TestCaseStats&&) = default;
        virtual ~TestCaseStats();

        TestCaseInfo testInfo;
        Totals totals;
        std::string stdOut;
        std::string stdErr;
        bool aborting;
    };

    struct TestGroupStats {
        TestGroupStats(GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting);
        TestGroupStats(GroupInfo const& _groupInfo);

        TestGroupStats(TestGroupStats const&) = default;
        TestGroupStats(TestGroupStats&&) = default;
        TestGroupStats& operator=(TestGroupStats const&) = default;
        TestGroupStats& operator=(TestGroupStats&&) = default;
        virtual ~TestGroupStats();

        GroupInfo groupInfo;
        Totals totals;
        bool aborting;
    };

    struct TestRunStats {
        TestRunStats(TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting);

        TestRunStats(TestRunStats const&) = default;
        TestRunStats(TestRunStats&&) = default;
        TestRunStats& operator=(TestRunStats const&) = default;
        TestRunStats& operator=(TestRunStats&&) = default;
        virtual ~TestRunStats();

        TestRunInfo runInfo;
        Totals totals;
        bool aborting;
    };

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    struct BenchmarkInfo {
        std::string name;
        double estimatedDuration;
        int iterations;
        int samples;
        unsigned int resamples;
        double clockResolution;
        double clockCost;
    };

    template <class Duration> struct BenchmarkStats {
        BenchmarkInfo info;

        std::vector<Duration> samples;
        Benchmark::Estimate<Duration> mean;
        Benchmark::Estimate<Duration> standardDeviation;
        Benchmark::OutlierClassification outliers;
        double outlierVariance;

        template <typename Duration2> operator BenchmarkStats<Duration2>() const {
            std::vector<Duration2> samples2;
            samples2.reserve(samples.size());
            std::transform(samples.begin(),
                           samples.end(),
                           std::back_inserter(samples2),
                           [](Duration d) { return Duration2(d); });
            return {
                info,
                std::move(samples2),
                mean,
                standardDeviation,
                outliers,
                outlierVariance,
            };
        }
    };
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    struct IStreamingReporter {
        virtual ~IStreamingReporter() = default;

        // Implementing class must also provide the following static methods:
        // static std::string getDescription();
        // static std::set<Verbosity> getSupportedVerbosities()

        virtual ReporterPreferences getPreferences() const = 0;

        virtual void noMatchingTestCases(std::string const& spec) = 0;

        virtual void reportInvalidArguments(std::string const&) {}

        virtual void testRunStarting(TestRunInfo const& testRunInfo) = 0;
        virtual void testGroupStarting(GroupInfo const& groupInfo) = 0;

        virtual void testCaseStarting(TestCaseInfo const& testInfo) = 0;
        virtual void sectionStarting(SectionInfo const& sectionInfo) = 0;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        virtual void benchmarkPreparing(std::string const&) {}
        virtual void benchmarkStarting(BenchmarkInfo const&) {}
        virtual void benchmarkEnded(BenchmarkStats<> const&) {}
        virtual void benchmarkFailed(std::string const&) {}
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        virtual void assertionStarting(AssertionInfo const& assertionInfo) = 0;

        // The return value indicates if the messages buffer should be cleared:
        virtual bool assertionEnded(AssertionStats const& assertionStats) = 0;

        virtual void sectionEnded(SectionStats const& sectionStats) = 0;
        virtual void testCaseEnded(TestCaseStats const& testCaseStats) = 0;
        virtual void testGroupEnded(TestGroupStats const& testGroupStats) = 0;
        virtual void testRunEnded(TestRunStats const& testRunStats) = 0;

        virtual void skipTest(TestCaseInfo const& testInfo) = 0;

        // Default empty implementation provided
        virtual void fatalErrorEncountered(StringRef name);

        virtual bool isMulti() const;
    };
    using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;

    struct IReporterFactory {
        virtual ~IReporterFactory();
        virtual IStreamingReporterPtr create(ReporterConfig const& config) const = 0;
        virtual std::string getDescription() const = 0;
    };
    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;

    struct IReporterRegistry {
        using FactoryMap = std::map<std::string, IReporterFactoryPtr>;
        using Listeners = std::vector<IReporterFactoryPtr>;

        virtual ~IReporterRegistry();
        virtual IStreamingReporterPtr create(std::string const& name,
                                             IConfigPtr const& config) const = 0;
        virtual FactoryMap const& getFactories() const = 0;
        virtual Listeners const& getListeners() const = 0;
    };

} // end namespace Catch

// end catch_interfaces_reporter.h
#include <algorithm>
#include <cstring>
#include <cfloat>
#include <cstdio>
#include <cassert>
#include <memory>
#include <ostream>

namespace Catch {
    void prepareExpandedExpression(AssertionResult& result);

    // Returns double formatted as %.3f (format expected on output)
    std::string getFormattedDuration(double duration);

    //! Should the reporter show
    bool shouldShowDuration(IConfig const& config, double duration);

    std::string serializeFilters(std::vector<std::string> const& container);

    template <typename DerivedT> struct StreamingReporterBase : IStreamingReporter {

        StreamingReporterBase(ReporterConfig const& _config) :
            m_config(_config.fullConfig()), stream(_config.stream()) {
            m_reporterPrefs.shouldRedirectStdOut = false;
            if (!DerivedT::getSupportedVerbosities().count(m_config->verbosity()))
                CATCH_ERROR("Verbosity level not supported by this reporter");
        }

        ReporterPreferences getPreferences() const override { return m_reporterPrefs; }

        static std::set<Verbosity> getSupportedVerbosities() { return {Verbosity::Normal}; }

        ~StreamingReporterBase() override = default;

        void noMatchingTestCases(std::string const&) override {}

        void reportInvalidArguments(std::string const&) override {}

        void testRunStarting(TestRunInfo const& _testRunInfo) override {
            currentTestRunInfo = _testRunInfo;
        }

        void testGroupStarting(GroupInfo const& _groupInfo) override {
            currentGroupInfo = _groupInfo;
        }

        void testCaseStarting(TestCaseInfo const& _testInfo) override {
            currentTestCaseInfo = _testInfo;
        }
        void sectionStarting(SectionInfo const& _sectionInfo) override {
            m_sectionStack.push_back(_sectionInfo);
        }

        void sectionEnded(SectionStats const& /* _sectionStats */) override {
            m_sectionStack.pop_back();
        }
        void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {
            currentTestCaseInfo.reset();
        }
        void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {
            currentGroupInfo.reset();
        }
        void testRunEnded(TestRunStats const& /* _testRunStats */) override {
            currentTestCaseInfo.reset();
            currentGroupInfo.reset();
            currentTestRunInfo.reset();
        }

        void skipTest(TestCaseInfo const&) override {
            // Don't do anything with this by default.
            // It can optionally be overridden in the derived class.
        }

        IConfigPtr m_config;
        std::ostream& stream;

        LazyStat<TestRunInfo> currentTestRunInfo;
        LazyStat<GroupInfo> currentGroupInfo;
        LazyStat<TestCaseInfo> currentTestCaseInfo;

        std::vector<SectionInfo> m_sectionStack;
        ReporterPreferences m_reporterPrefs;
    };

    template <typename DerivedT> struct CumulativeReporterBase : IStreamingReporter {
        template <typename T, typename ChildNodeT> struct Node {
            explicit Node(T const& _value) : value(_value) {}
            virtual ~Node() {}

            using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>;
            T value;
            ChildNodes children;
        };
        struct SectionNode {
            explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}
            virtual ~SectionNode() = default;

            bool operator==(SectionNode const& other) const {
                return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
            }
            bool operator==(std::shared_ptr<SectionNode> const& other) const {
                return operator==(*other);
            }

            SectionStats stats;
            using ChildSections = std::vector<std::shared_ptr<SectionNode>>;
            using Assertions = std::vector<AssertionStats>;
            ChildSections childSections;
            Assertions assertions;
            std::string stdOut;
            std::string stdErr;
        };

        struct BySectionInfo {
            BySectionInfo(SectionInfo const& other) : m_other(other) {}
            BySectionInfo(BySectionInfo const& other) : m_other(other.m_other) {}
            bool operator()(std::shared_ptr<SectionNode> const& node) const {
                return ((node->stats.sectionInfo.name == m_other.name) &&
                        (node->stats.sectionInfo.lineInfo == m_other.lineInfo));
            }
            void operator=(BySectionInfo const&) = delete;

        private:
            SectionInfo const& m_other;
        };

        using TestCaseNode = Node<TestCaseStats, SectionNode>;
        using TestGroupNode = Node<TestGroupStats, TestCaseNode>;
        using TestRunNode = Node<TestRunStats, TestGroupNode>;

        CumulativeReporterBase(ReporterConfig const& _config) :
            m_config(_config.fullConfig()), stream(_config.stream()) {
            m_reporterPrefs.shouldRedirectStdOut = false;
            if (!DerivedT::getSupportedVerbosities().count(m_config->verbosity()))
                CATCH_ERROR("Verbosity level not supported by this reporter");
        }
        ~CumulativeReporterBase() override = default;

        ReporterPreferences getPreferences() const override { return m_reporterPrefs; }

        static std::set<Verbosity> getSupportedVerbosities() { return {Verbosity::Normal}; }

        void testRunStarting(TestRunInfo const&) override {}
        void testGroupStarting(GroupInfo const&) override {}

        void testCaseStarting(TestCaseInfo const&) override {}

        void sectionStarting(SectionInfo const& sectionInfo) override {
            SectionStats incompleteStats(sectionInfo, Counts(), 0, false);
            std::shared_ptr<SectionNode> node;
            if (m_sectionStack.empty()) {
                if (!m_rootSection)
                    m_rootSection = std::make_shared<SectionNode>(incompleteStats);
                node = m_rootSection;
            } else {
                SectionNode& parentNode = *m_sectionStack.back();
                auto it = std::find_if(parentNode.childSections.begin(),
                                       parentNode.childSections.end(),
                                       BySectionInfo(sectionInfo));
                if (it == parentNode.childSections.end()) {
                    node = std::make_shared<SectionNode>(incompleteStats);
                    parentNode.childSections.push_back(node);
                } else
                    node = *it;
            }
            m_sectionStack.push_back(node);
            m_deepestSection = std::move(node);
        }

        void assertionStarting(AssertionInfo const&) override {}

        bool assertionEnded(AssertionStats const& assertionStats) override {
            assert(!m_sectionStack.empty());
            // AssertionResult holds a pointer to a temporary
            // DecomposedExpression, which getExpandedExpression() calls to
            // build the expression string. Our section stack copy of the
            // assertionResult will likely outlive the temporary, so it must be
            // expanded or discarded now to avoid calling a destroyed object
            // later.
            prepareExpandedExpression(const_cast<AssertionResult&>(assertionStats.assertionResult));
            SectionNode& sectionNode = *m_sectionStack.back();
            sectionNode.assertions.push_back(assertionStats);
            return true;
        }
        void sectionEnded(SectionStats const& sectionStats) override {
            assert(!m_sectionStack.empty());
            SectionNode& node = *m_sectionStack.back();
            node.stats = sectionStats;
            m_sectionStack.pop_back();
        }
        void testCaseEnded(TestCaseStats const& testCaseStats) override {
            auto node = std::make_shared<TestCaseNode>(testCaseStats);
            assert(m_sectionStack.size() == 0);
            node->children.push_back(m_rootSection);
            m_testCases.push_back(node);
            m_rootSection.reset();

            assert(m_deepestSection);
            m_deepestSection->stdOut = testCaseStats.stdOut;
            m_deepestSection->stdErr = testCaseStats.stdErr;
        }
        void testGroupEnded(TestGroupStats const& testGroupStats) override {
            auto node = std::make_shared<TestGroupNode>(testGroupStats);
            node->children.swap(m_testCases);
            m_testGroups.push_back(node);
        }
        void testRunEnded(TestRunStats const& testRunStats) override {
            auto node = std::make_shared<TestRunNode>(testRunStats);
            node->children.swap(m_testGroups);
            m_testRuns.push_back(node);
            testRunEndedCumulative();
        }
        virtual void testRunEndedCumulative() = 0;

        void skipTest(TestCaseInfo const&) override {}

        IConfigPtr m_config;
        std::ostream& stream;
        std::vector<AssertionStats> m_assertions;
        std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections;
        std::vector<std::shared_ptr<TestCaseNode>> m_testCases;
        std::vector<std::shared_ptr<TestGroupNode>> m_testGroups;

        std::vector<std::shared_ptr<TestRunNode>> m_testRuns;

        std::shared_ptr<SectionNode> m_rootSection;
        std::shared_ptr<SectionNode> m_deepestSection;
        std::vector<std::shared_ptr<SectionNode>> m_sectionStack;
        ReporterPreferences m_reporterPrefs;
    };

    template <char C> char const* getLineOfChars() {
        static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
        if (!*line) {
            std::memset(line, C, CATCH_CONFIG_CONSOLE_WIDTH - 1);
            line[CATCH_CONFIG_CONSOLE_WIDTH - 1] = 0;
        }
        return line;
    }

    struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {
        TestEventListenerBase(ReporterConfig const& _config);

        static std::set<Verbosity> getSupportedVerbosities();

        void assertionStarting(AssertionInfo const&) override;
        bool assertionEnded(AssertionStats const&) override;
    };

} // end namespace Catch

// end catch_reporter_bases.hpp
// start catch_console_colour.h

namespace Catch {

    struct Colour {
        enum Code {
            None = 0,

            White,
            Red,
            Green,
            Blue,
            Cyan,
            Yellow,
            Grey,

            Bright = 0x10,

            BrightRed = Bright | Red,
            BrightGreen = Bright | Green,
            LightGrey = Bright | Grey,
            BrightWhite = Bright | White,
            BrightYellow = Bright | Yellow,

            // By intention
            FileName = LightGrey,
            Warning = BrightYellow,
            ResultError = BrightRed,
            ResultSuccess = BrightGreen,
            ResultExpectedFailure = Warning,

            Error = BrightRed,
            Success = Green,

            OriginalExpression = Cyan,
            ReconstructedExpression = BrightYellow,

            SecondaryText = LightGrey,
            Headers = White
        };

        // Use constructed object for RAII guard
        Colour(Code _colourCode);
        Colour(Colour&& other) noexcept;
        Colour& operator=(Colour&& other) noexcept;
        ~Colour();

        // Use static method for one-shot changes
        static void use(Code _colourCode);

    private:
        bool m_moved = false;
    };

    std::ostream& operator<<(std::ostream& os, Colour const&);

} // end namespace Catch

// end catch_console_colour.h
// start catch_reporter_registrars.hpp

namespace Catch {

    template <typename T> class ReporterRegistrar {

        class ReporterFactory : public IReporterFactory {

            IStreamingReporterPtr create(ReporterConfig const& config) const override {
                return std::unique_ptr<T>(new T(config));
            }

            std::string getDescription() const override { return T::getDescription(); }
        };

    public:
        explicit ReporterRegistrar(std::string const& name) {
            getMutableRegistryHub().registerReporter(name, std::make_shared<ReporterFactory>());
        }
    };

    template <typename T> class ListenerRegistrar {

        class ListenerFactory : public IReporterFactory {

            IStreamingReporterPtr create(ReporterConfig const& config) const override {
                return std::unique_ptr<T>(new T(config));
            }
            std::string getDescription() const override { return std::string(); }
        };

    public:
        ListenerRegistrar() {
            getMutableRegistryHub().registerListener(std::make_shared<ListenerFactory>());
        }
    };
} // namespace Catch

#if !defined(CATCH_CONFIG_DISABLE)

#define CATCH_REGISTER_REPORTER(name, reporterType)                                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType(name);    \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

#define CATCH_REGISTER_LISTENER(listenerType)                                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType;          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#else // CATCH_CONFIG_DISABLE

#define CATCH_REGISTER_REPORTER(name, reporterType)
#define CATCH_REGISTER_LISTENER(listenerType)

#endif // CATCH_CONFIG_DISABLE

// end catch_reporter_registrars.hpp
// Allow users to base their work off existing reporters
// start catch_reporter_compact.h

namespace Catch {

    struct CompactReporter : StreamingReporterBase<CompactReporter> {

        using StreamingReporterBase::StreamingReporterBase;

        ~CompactReporter() override;

        static std::string getDescription();

        void noMatchingTestCases(std::string const& spec) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& _assertionStats) override;

        void sectionEnded(SectionStats const& _sectionStats) override;

        void testRunEnded(TestRunStats const& _testRunStats) override;
    };

} // end namespace Catch

// end catch_reporter_compact.h
// start catch_reporter_console.h

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in
                                // switch Note that 4062 (not all labels are
                                // handled and default is missing) is enabled
#endif

namespace Catch {
    // Fwd decls
    struct SummaryColumn;
    class TablePrinter;

    struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> {
        std::unique_ptr<TablePrinter> m_tablePrinter;

        ConsoleReporter(ReporterConfig const& config);
        ~ConsoleReporter() override;
        static std::string getDescription();

        void noMatchingTestCases(std::string const& spec) override;

        void reportInvalidArguments(std::string const& arg) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& _assertionStats) override;

        void sectionStarting(SectionInfo const& _sectionInfo) override;
        void sectionEnded(SectionStats const& _sectionStats) override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& info) override;
        void benchmarkEnded(BenchmarkStats<> const& stats) override;
        void benchmarkFailed(std::string const& error) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void testCaseEnded(TestCaseStats const& _testCaseStats) override;
        void testGroupEnded(TestGroupStats const& _testGroupStats) override;
        void testRunEnded(TestRunStats const& _testRunStats) override;
        void testRunStarting(TestRunInfo const& _testRunInfo) override;

    private:
        void lazyPrint();

        void lazyPrintWithoutClosingBenchmarkTable();
        void lazyPrintRunInfo();
        void lazyPrintGroupInfo();
        void printTestCaseAndSectionHeader();

        void printClosedHeader(std::string const& _name);
        void printOpenHeader(std::string const& _name);

        // if string has a : in first line will set indent to follow it on
        // subsequent lines
        void printHeaderString(std::string const& _string, std::size_t indent = 0);

        void printTotals(Totals const& totals);
        void printSummaryRow(std::string const& label,
                             std::vector<SummaryColumn> const& cols,
                             std::size_t row);

        void printTotalsDivider(Totals const& totals);
        void printSummaryDivider();
        void printTestFilters();

    private:
        bool m_headerPrinted = false;
    };

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

// end catch_reporter_console.h
// start catch_reporter_junit.h

// start catch_xmlwriter.h

#include <vector>

namespace Catch {
    enum class XmlFormatting {
        None = 0x00,
        Indent = 0x01,
        Newline = 0x02,
    };

    XmlFormatting operator|(XmlFormatting lhs, XmlFormatting rhs);
    XmlFormatting operator&(XmlFormatting lhs, XmlFormatting rhs);

    class XmlEncode {
    public:
        enum ForWhat { ForTextNodes, ForAttributes };

        XmlEncode(std::string const& str, ForWhat forWhat = ForTextNodes);

        void encodeTo(std::ostream& os) const;

        friend std::ostream& operator<<(std::ostream& os, XmlEncode const& xmlEncode);

    private:
        std::string m_str;
        ForWhat m_forWhat;
    };

    class XmlWriter {
    public:
        class ScopedElement {
        public:
            ScopedElement(XmlWriter* writer, XmlFormatting fmt);

            ScopedElement(ScopedElement&& other) noexcept;
            ScopedElement& operator=(ScopedElement&& other) noexcept;

            ~ScopedElement();

            ScopedElement& writeText(std::string const& text,
                                     XmlFormatting fmt = XmlFormatting::Newline |
                                                         XmlFormatting::Indent);

            template <typename T>
            ScopedElement& writeAttribute(std::string const& name, T const& attribute) {
                m_writer->writeAttribute(name, attribute);
                return *this;
            }

        private:
            mutable XmlWriter* m_writer = nullptr;
            XmlFormatting m_fmt;
        };

        XmlWriter(std::ostream& os = Catch::cout());
        ~XmlWriter();

        XmlWriter(XmlWriter const&) = delete;
        XmlWriter& operator=(XmlWriter const&) = delete;

        XmlWriter& startElement(std::string const& name,
                                XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        ScopedElement scopedElement(std::string const& name,
                                    XmlFormatting fmt = XmlFormatting::Newline |
                                                        XmlFormatting::Indent);

        XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        XmlWriter& writeAttribute(std::string const& name, std::string const& attribute);

        XmlWriter& writeAttribute(std::string const& name, bool attribute);

        template <typename T>
        XmlWriter& writeAttribute(std::string const& name, T const& attribute) {
            ReusableStringStream rss;
            rss << attribute;
            return writeAttribute(name, rss.str());
        }

        XmlWriter& writeText(std::string const& text,
                             XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        XmlWriter& writeComment(std::string const& text,
                                XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        void writeStylesheetRef(std::string const& url);

        XmlWriter& writeBlankLine();

        void ensureTagClosed();

    private:
        void applyFormatting(XmlFormatting fmt);

        void writeDeclaration();

        void newlineIfNecessary();

        bool m_tagIsOpen = false;
        bool m_needsNewline = false;
        std::vector<std::string> m_tags;
        std::string m_indent;
        std::ostream& m_os;
    };

} // namespace Catch

// end catch_xmlwriter.h
namespace Catch {

    class JunitReporter : public CumulativeReporterBase<JunitReporter> {
    public:
        JunitReporter(ReporterConfig const& _config);

        ~JunitReporter() override;

        static std::string getDescription();

        void noMatchingTestCases(std::string const& /*spec*/) override;

        void testRunStarting(TestRunInfo const& runInfo) override;

        void testGroupStarting(GroupInfo const& groupInfo) override;

        void testCaseStarting(TestCaseInfo const& testCaseInfo) override;
        bool assertionEnded(AssertionStats const& assertionStats) override;

        void testCaseEnded(TestCaseStats const& testCaseStats) override;

        void testGroupEnded(TestGroupStats const& testGroupStats) override;

        void testRunEndedCumulative() override;

        void writeGroup(TestGroupNode const& groupNode, double suiteTime);

        void writeTestCase(TestCaseNode const& testCaseNode);

        void writeSection(std::string const& className,
                          std::string const& rootName,
                          SectionNode const& sectionNode,
                          bool testOkToFail);

        void writeAssertions(SectionNode const& sectionNode);
        void writeAssertion(AssertionStats const& stats);

        XmlWriter xml;
        Timer suiteTimer;
        std::string stdOutForSuite;
        std::string stdErrForSuite;
        unsigned int unexpectedExceptions = 0;
        bool m_okToFail = false;
    };

} // end namespace Catch

// end catch_reporter_junit.h
// start catch_reporter_xml.h

namespace Catch {
    class XmlReporter : public StreamingReporterBase<XmlReporter> {
    public:
        XmlReporter(ReporterConfig const& _config);

        ~XmlReporter() override;

        static std::string getDescription();

        virtual std::string getStylesheetRef() const;

        void writeSourceInfo(SourceLineInfo const& sourceInfo);

    public: // StreamingReporterBase
        void noMatchingTestCases(std::string const& s) override;

        void testRunStarting(TestRunInfo const& testInfo) override;

        void testGroupStarting(GroupInfo const& groupInfo) override;

        void testCaseStarting(TestCaseInfo const& testInfo) override;

        void sectionStarting(SectionInfo const& sectionInfo) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& assertionStats) override;

        void sectionEnded(SectionStats const& sectionStats) override;

        void testCaseEnded(TestCaseStats const& testCaseStats) override;

        void testGroupEnded(TestGroupStats const& testGroupStats) override;

        void testRunEnded(TestRunStats const& testRunStats) override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const&) override;
        void benchmarkEnded(BenchmarkStats<> const&) override;
        void benchmarkFailed(std::string const&) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    private:
        Timer m_testCaseTimer;
        XmlWriter m_xml;
        int m_sectionDepth = 0;
    };

} // end namespace Catch

// end catch_reporter_xml.h

// end catch_external_interfaces.h
#endif

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_benchmarking_all.hpp

// A proxy header that includes all of the benchmarking headers to allow
// concise include of the benchmarking features. You should prefer the
// individual includes in standard use.

// start catch_benchmark.hpp

// Benchmark

// start catch_chronometer.hpp

// User-facing chronometer

// start catch_clock.hpp

// Clocks

#include <chrono>
#include <ratio>

namespace Catch {
    namespace Benchmark {
        template <typename Clock> using ClockDuration = typename Clock::duration;
        template <typename Clock>
        using FloatDuration = std::chrono::duration<double, typename Clock::period>;

        template <typename Clock> using TimePoint = typename Clock::time_point;

        using default_clock = std::chrono::steady_clock;

        template <typename Clock> struct now {
            TimePoint<Clock> operator()() const { return Clock::now(); }
        };

        using fp_seconds = std::chrono::duration<double, std::ratio<1>>;
    } // namespace Benchmark
} // namespace Catch

// end catch_clock.hpp
// start catch_optimizer.hpp

// Hinting the optimizer

#if defined(_MSC_VER)
#include <atomic> // atomic_thread_fence
#endif

namespace Catch {
    namespace Benchmark {
#if defined(__GNUC__) || defined(__clang__)
        template <typename T> inline void keep_memory(T* p) {
            asm volatile("" : : "g"(p) : "memory");
        }
        inline void keep_memory() { asm volatile("" : : : "memory"); }

        namespace Detail {
            inline void optimizer_barrier() { keep_memory(); }
        } // namespace Detail
#elif defined(_MSC_VER)

#pragma optimize("", off)
        template <typename T> inline void keep_memory(T* p) {
            // thanks @milleniumbug
            *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p);
        }
        // TODO equivalent keep_memory()
#pragma optimize("", on)

        namespace Detail {
            inline void optimizer_barrier() { std::atomic_thread_fence(std::memory_order_seq_cst); }
        } // namespace Detail

#endif

        template <typename T> inline void deoptimize_value(T&& x) { keep_memory(&x); }

        template <typename Fn, typename... Args>
        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) ->
            typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type {
            deoptimize_value(std::forward<Fn>(fn)(std::forward<Args...>(args...)));
        }

        template <typename Fn, typename... Args>
        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) ->
            typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type {
            std::forward<Fn>(fn)(std::forward<Args...>(args...));
        }
    } // namespace Benchmark
} // namespace Catch

// end catch_optimizer.hpp
// start catch_complete_invoke.hpp

// Invoke with a special case for void

#include <type_traits>
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T> struct CompleteType { using type = T; };
            template <> struct CompleteType<void> {
                struct type {};
            };

            template <typename T> using CompleteType_t = typename CompleteType<T>::type;

            template <typename Result> struct CompleteInvoker {
                template <typename Fun, typename... Args>
                static Result invoke(Fun&& fun, Args&&... args) {
                    return std::forward<Fun>(fun)(std::forward<Args>(args)...);
                }
            };
            template <> struct CompleteInvoker<void> {
                template <typename Fun, typename... Args>
                static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
                    std::forward<Fun>(fun)(std::forward<Args>(args)...);
                    return {};
                }
            };

            // invoke and not return void :(
            template <typename Fun, typename... Args>
            CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun,
                                                                             Args&&... args) {
                return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(
                    std::forward<Fun>(fun), std::forward<Args>(args)...);
            }

            const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
        } // namespace Detail

        template <typename Fun>
        Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {
            CATCH_TRY { return Detail::complete_invoke(std::forward<Fun>(fun)); }
            CATCH_CATCH_ALL {
                getResultCapture().benchmarkFailed(translateActiveException());
                CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);
            }
        }
    } // namespace Benchmark
} // namespace Catch

// end catch_complete_invoke.hpp
namespace Catch {
    namespace Benchmark {
        namespace Detail {
            struct ChronometerConcept {
                virtual void start() = 0;
                virtual void finish() = 0;
                virtual ~ChronometerConcept() = default;
            };
            template <typename Clock> struct ChronometerModel final : public ChronometerConcept {
                void start() override { started = Clock::now(); }
                void finish() override { finished = Clock::now(); }

                ClockDuration<Clock> elapsed() const { return finished - started; }

                TimePoint<Clock> started;
                TimePoint<Clock> finished;
            };
        } // namespace Detail

        struct Chronometer {
        public:
            template <typename Fun> void measure(Fun&& fun) {
                measure(std::forward<Fun>(fun), is_callable<Fun(int)>());
            }

            int runs() const { return k; }

            Chronometer(Detail::ChronometerConcept& meter, int k) : impl(&meter), k(k) {}

        private:
            template <typename Fun> void measure(Fun&& fun, std::false_type) {
                measure([&fun](int) { return fun(); }, std::true_type());
            }

            template <typename Fun> void measure(Fun&& fun, std::true_type) {
                Detail::optimizer_barrier();
                impl->start();
                for (int i = 0; i < k; ++i)
                    invoke_deoptimized(fun, i);
                impl->finish();
                Detail::optimizer_barrier();
            }

            Detail::ChronometerConcept* impl;
            int k;
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_chronometer.hpp
// start catch_environment.hpp

// Environment information

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct EnvironmentEstimate {
            Duration mean;
            OutlierClassification outliers;

            template <typename Duration2> operator EnvironmentEstimate<Duration2>() const {
                return {mean, outliers};
            }
        };
        template <typename Clock> struct Environment {
            using clock_type = Clock;
            EnvironmentEstimate<FloatDuration<Clock>> clock_resolution;
            EnvironmentEstimate<FloatDuration<Clock>> clock_cost;
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_environment.hpp
// start catch_execution_plan.hpp

// Execution plan

// start catch_benchmark_function.hpp

// Dumb std::function implementation for consistent call overhead

#include <cassert>
#include <type_traits>
#include <utility>
#include <memory>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T> using Decay = typename std::decay<T>::type;
            template <typename T, typename U>
            struct is_related : std::is_same<Decay<T>, Decay<U>> {};

            /// We need to reinvent std::function because every piece of code
            /// that might add overhead in a measurement context needs to have
            /// consistent performance characteristics so that we can account
            /// for it in the measurement. Implementations of std::function with
            /// optimizations that aren't always applicable, like small buffer
            /// optimizations, are not uncommon. This is effectively an
            /// implementation of std::function without any such optimizations;
            /// it may be slow, but it is consistently slow.
            struct BenchmarkFunction {
            private:
                struct callable {
                    virtual void call(Chronometer meter) const = 0;
                    virtual callable* clone() const = 0;
                    virtual ~callable() = default;
                };
                template <typename Fun> struct model : public callable {
                    model(Fun&& fun) : fun(std::move(fun)) {}
                    model(Fun const& fun) : fun(fun) {}

                    model<Fun>* clone() const override { return new model<Fun>(*this); }

                    void call(Chronometer meter) const override {
                        call(meter, is_callable<Fun(Chronometer)>());
                    }
                    void call(Chronometer meter, std::true_type) const { fun(meter); }
                    void call(Chronometer meter, std::false_type) const { meter.measure(fun); }

                    Fun fun;
                };

                struct do_nothing {
                    void operator()() const {}
                };

                template <typename T> BenchmarkFunction(model<T>* c) : f(c) {}

            public:
                BenchmarkFunction() : f(new model<do_nothing>{{}}) {}

                template <typename Fun,
                          typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value,
                                                  int>::type = 0>
                BenchmarkFunction(Fun&& fun) :
                    f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {}

                BenchmarkFunction(BenchmarkFunction&& that) : f(std::move(that.f)) {}

                BenchmarkFunction(BenchmarkFunction const& that) : f(that.f->clone()) {}

                BenchmarkFunction& operator=(BenchmarkFunction&& that) {
                    f = std::move(that.f);
                    return *this;
                }

                BenchmarkFunction& operator=(BenchmarkFunction const& that) {
                    f.reset(that.f->clone());
                    return *this;
                }

                void operator()(Chronometer meter) const { f->call(meter); }

            private:
                std::unique_ptr<callable> f;
            };
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_benchmark_function.hpp
// start catch_repeat.hpp

// repeat algorithm

#include <type_traits>
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Fun> struct repeater {
                void operator()(int k) const {
                    for (int i = 0; i < k; ++i) {
                        fun();
                    }
                }
                Fun fun;
            };
            template <typename Fun> repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
                return {std::forward<Fun>(fun)};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_repeat.hpp
// start catch_run_for_at_least.hpp

// Run a function for a minimum amount of time

// start catch_measure.hpp

// Measure

// start catch_timing.hpp

// Timing

#include <tuple>
#include <type_traits>

namespace Catch {
    namespace Benchmark {
        template <typename Duration, typename Result> struct Timing {
            Duration elapsed;
            Result result;
            int iterations;
        };
        template <typename Clock, typename Func, typename... Args>
        using TimingOf =
            Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;
    } // namespace Benchmark
} // namespace Catch

// end catch_timing.hpp
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock, typename Fun, typename... Args>
            TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
                auto start = Clock::now();
                auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);
                auto end = Clock::now();
                auto delta = end - start;
                return {delta, std::forward<decltype(r)>(r), 1};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_measure.hpp
#include <utility>
#include <type_traits>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {
                return Detail::measure<Clock>(fun, iters);
            }
            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {
                Detail::ChronometerModel<Clock> meter;
                auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));

                return {meter.elapsed(), std::move(result), iters};
            }

            template <typename Clock, typename Fun>
            using run_for_at_least_argument_t = typename std::
                conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type;

            struct optimized_away_error : std::exception {
                const char* what() const noexcept override {
                    return "could not measure benchmark, maybe it was "
                           "optimized away";
                }
            };

            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>>
            run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
                auto iters = seed;
                while (iters < (1 << 30)) {
                    auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());

                    if (Timing.elapsed >= how_long) {
                        return {Timing.elapsed, std::move(Timing.result), iters};
                    }
                    iters *= 2;
                }
                Catch::throw_exception(optimized_away_error{});
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_run_for_at_least.hpp
#include <algorithm>
#include <iterator>

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct ExecutionPlan {
            int iterations_per_sample;
            Duration estimated_duration;
            Detail::BenchmarkFunction benchmark;
            Duration warmup_time;
            int warmup_iterations;

            template <typename Duration2> operator ExecutionPlan<Duration2>() const {
                return {iterations_per_sample,
                        estimated_duration,
                        benchmark,
                        warmup_time,
                        warmup_iterations};
            }

            template <typename Clock>
            std::vector<FloatDuration<Clock>> run(const IConfig& cfg,
                                                  Environment<FloatDuration<Clock>> env) const {
                // warmup a bit
                Detail::run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time),
                    warmup_iterations,
                    Detail::repeat(now<Clock>{}));

                std::vector<FloatDuration<Clock>> times;
                times.reserve(cfg.benchmarkSamples());
                std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {
                    Detail::ChronometerModel<Clock> model;
                    this->benchmark(Chronometer(model, iterations_per_sample));
                    auto sample_time = model.elapsed() - env.clock_cost.mean;
                    if (sample_time < FloatDuration<Clock>::zero())
                        sample_time = FloatDuration<Clock>::zero();
                    return sample_time / iterations_per_sample;
                });
                return times;
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_execution_plan.hpp
// start catch_estimate_clock.hpp

// Environment measurement

// start catch_stats.hpp

// Statistical analysis tools

#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <numeric>
#include <tuple>
#include <cmath>
#include <utility>
#include <cstddef>
#include <random>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            using sample = std::vector<double>;

            double weighted_average_quantile(int k,
                                             int q,
                                             std::vector<double>::iterator first,
                                             std::vector<double>::iterator last);

            template <typename Iterator>
            OutlierClassification classify_outliers(Iterator first, Iterator last) {
                std::vector<double> copy(first, last);

                auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end());
                auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end());
                auto iqr = q3 - q1;
                auto los = q1 - (iqr * 3.);
                auto lom = q1 - (iqr * 1.5);
                auto him = q3 + (iqr * 1.5);
                auto his = q3 + (iqr * 3.);

                OutlierClassification o;
                for (; first != last; ++first) {
                    auto&& t = *first;
                    if (t < los)
                        ++o.low_severe;
                    else if (t < lom)
                        ++o.low_mild;
                    else if (t > his)
                        ++o.high_severe;
                    else if (t > him)
                        ++o.high_mild;
                    ++o.samples_seen;
                }
                return o;
            }

            template <typename Iterator> double mean(Iterator first, Iterator last) {
                auto count = last - first;
                double sum = std::accumulate(first, last, 0.);
                return sum / count;
            }

            template <typename URng, typename Iterator, typename Estimator>
            sample resample(
                URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) {
                auto n = last - first;
                std::uniform_int_distribution<decltype(n)> dist(0, n - 1);

                sample out;
                out.reserve(resamples);
                std::generate_n(
                    std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] {
                        std::vector<double> resampled;
                        resampled.reserve(n);
                        std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] {
                            return first[dist(rng)];
                        });
                        return estimator(resampled.begin(), resampled.end());
                    });
                std::sort(out.begin(), out.end());
                return out;
            }

            template <typename Estimator, typename Iterator>
            sample jackknife(Estimator&& estimator, Iterator first, Iterator last) {
                auto n = last - first;
                auto second = std::next(first);
                sample results;
                results.reserve(n);

                for (auto it = first; it != last; ++it) {
                    std::iter_swap(it, first);
                    results.push_back(estimator(second, last));
                }

                return results;
            }

            inline double normal_cdf(double x) { return std::erfc(-x / std::sqrt(2.0)) / 2.0; }

            double erfc_inv(double x);

            double normal_quantile(double p);

            template <typename Iterator, typename Estimator>
            Estimate<double> bootstrap(double confidence_level,
                                       Iterator first,
                                       Iterator last,
                                       sample const& resample,
                                       Estimator&& estimator) {
                auto n_samples = last - first;

                double point = estimator(first, last);
                // Degenerate case with a single sample
                if (n_samples == 1)
                    return {point, point, point, confidence_level};

                sample jack = jackknife(estimator, first, last);
                double jack_mean = mean(jack.begin(), jack.end());
                double sum_squares, sum_cubes;
                std::tie(sum_squares, sum_cubes) =
                    std::accumulate(jack.begin(),
                                    jack.end(),
                                    std::make_pair(0., 0.),
                                    [jack_mean](std::pair<double, double> sqcb,
                                                double x) -> std::pair<double, double> {
                                        auto d = jack_mean - x;
                                        auto d2 = d * d;
                                        auto d3 = d2 * d;
                                        return {sqcb.first + d2, sqcb.second + d3};
                                    });

                double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5));
                int n = static_cast<int>(resample.size());
                double prob_n = std::count_if(resample.begin(),
                                              resample.end(),
                                              [point](double x) { return x < point; }) /
                                (double)n;
                // degenerate case with uniform samples
                if (prob_n == 0)
                    return {point, point, point, confidence_level};

                double bias = normal_quantile(prob_n);
                double z1 = normal_quantile((1. - confidence_level) / 2.);

                auto cumn = [n](double x) -> int { return std::lround(normal_cdf(x) * n); };
                auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); };
                double b1 = bias + z1;
                double b2 = bias - z1;
                double a1 = a(b1);
                double a2 = a(b2);
                auto lo = (std::max)(cumn(a1), 0);
                auto hi = (std::min)(cumn(a2), n - 1);

                return {point, resample[lo], resample[hi], confidence_level};
            }

            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n);

            struct bootstrap_analysis {
                Estimate<double> mean;
                Estimate<double> standard_deviation;
                double outlier_variance;
            };

            bootstrap_analysis analyse_samples(double confidence_level,
                                               int n_resamples,
                                               std::vector<double>::iterator first,
                                               std::vector<double>::iterator last);
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_stats.hpp
#include <algorithm>
#include <iterator>
#include <tuple>
#include <vector>
#include <cmath>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock> std::vector<double> resolution(int k) {
                std::vector<TimePoint<Clock>> times;
                times.reserve(k + 1);
                std::generate_n(std::back_inserter(times), k + 1, now<Clock>{});

                std::vector<double> deltas;
                deltas.reserve(k);
                std::transform(std::next(times.begin()),
                               times.end(),
                               times.begin(),
                               std::back_inserter(deltas),
                               [](TimePoint<Clock> a, TimePoint<Clock> b) {
                                   return static_cast<double>((a - b).count());
                               });

                return deltas;
            }

            const auto warmup_iterations = 10000;
            const auto warmup_time = std::chrono::milliseconds(100);
            const auto minimum_ticks = 1000;
            const auto warmup_seed = 10000;
            const auto clock_resolution_estimation_time = std::chrono::milliseconds(500);
            const auto clock_cost_estimation_time_limit = std::chrono::seconds(1);
            const auto clock_cost_estimation_tick_limit = 100000;
            const auto clock_cost_estimation_time = std::chrono::milliseconds(10);
            const auto clock_cost_estimation_iterations = 10000;

            template <typename Clock> int warmup() {
                return run_for_at_least<Clock>(
                           std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time),
                           warmup_seed,
                           &resolution<Clock>)
                    .iterations;
            }
            template <typename Clock>
            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) {
                auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(
                                                     clock_resolution_estimation_time),
                                                 iterations,
                                                 &resolution<Clock>)
                             .result;
                return {
                    FloatDuration<Clock>(mean(r.begin(), r.end())),
                    classify_outliers(r.begin(), r.end()),
                };
            }
            template <typename Clock>
            EnvironmentEstimate<FloatDuration<Clock>>
            estimate_clock_cost(FloatDuration<Clock> resolution) {
                auto time_limit =
                    (std::min)(resolution * clock_cost_estimation_tick_limit,
                               FloatDuration<Clock>(clock_cost_estimation_time_limit));
                auto time_clock = [](int k) {
                    return Detail::measure<Clock>([k] {
                               for (int i = 0; i < k; ++i) {
                                   volatile auto ignored = Clock::now();
                                   (void)ignored;
                               }
                           })
                        .elapsed;
                };
                time_clock(1);
                int iters = clock_cost_estimation_iterations;
                auto&& r = run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time),
                    iters,
                    time_clock);
                std::vector<double> times;
                int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));
                times.reserve(nsamples);
                std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] {
                    return static_cast<double>((time_clock(r.iterations) / r.iterations).count());
                });
                return {
                    FloatDuration<Clock>(mean(times.begin(), times.end())),
                    classify_outliers(times.begin(), times.end()),
                };
            }

            template <typename Clock> Environment<FloatDuration<Clock>> measure_environment() {
                static Environment<FloatDuration<Clock>>* env = nullptr;
                if (env) {
                    return *env;
                }

                auto iters = Detail::warmup<Clock>();
                auto resolution = Detail::estimate_clock_resolution<Clock>(iters);
                auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean);

                env = new Environment<FloatDuration<Clock>>{resolution, cost};
                return *env;
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_estimate_clock.hpp
// start catch_analyse.hpp

// Run and analyse one benchmark

// start catch_sample_analysis.hpp

// Benchmark results

#include <algorithm>
#include <vector>
#include <string>
#include <iterator>

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct SampleAnalysis {
            std::vector<Duration> samples;
            Estimate<Duration> mean;
            Estimate<Duration> standard_deviation;
            OutlierClassification outliers;
            double outlier_variance;

            template <typename Duration2> operator SampleAnalysis<Duration2>() const {
                std::vector<Duration2> samples2;
                samples2.reserve(samples.size());
                std::transform(samples.begin(),
                               samples.end(),
                               std::back_inserter(samples2),
                               [](Duration d) { return Duration2(d); });
                return {
                    std::move(samples2),
                    mean,
                    standard_deviation,
                    outliers,
                    outlier_variance,
                };
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_sample_analysis.hpp
#include <algorithm>
#include <iterator>
#include <vector>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Duration, typename Iterator>
            SampleAnalysis<Duration>
            analyse(const IConfig& cfg, Environment<Duration>, Iterator first, Iterator last) {
                if (!cfg.benchmarkNoAnalysis()) {
                    std::vector<double> samples;
                    samples.reserve(last - first);
                    std::transform(first, last, std::back_inserter(samples), [](Duration d) {
                        return d.count();
                    });

                    auto analysis =
                        Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(),
                                                                  cfg.benchmarkResamples(),
                                                                  samples.begin(),
                                                                  samples.end());
                    auto outliers =
                        Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end());

                    auto wrap_estimate = [](Estimate<double> e) {
                        return Estimate<Duration>{
                            Duration(e.point),
                            Duration(e.lower_bound),
                            Duration(e.upper_bound),
                            e.confidence_interval,
                        };
                    };
                    std::vector<Duration> samples2;
                    samples2.reserve(samples.size());
                    std::transform(samples.begin(),
                                   samples.end(),
                                   std::back_inserter(samples2),
                                   [](double d) { return Duration(d); });
                    return {
                        std::move(samples2),
                        wrap_estimate(analysis.mean),
                        wrap_estimate(analysis.standard_deviation),
                        outliers,
                        analysis.outlier_variance,
                    };
                } else {
                    std::vector<Duration> samples;
                    samples.reserve(last - first);

                    Duration mean = Duration(0);
                    int i = 0;
                    for (auto it = first; it < last; ++it, ++i) {
                        samples.push_back(Duration(*it));
                        mean += Duration(*it);
                    }
                    mean /= i;

                    return {std::move(samples),
                            Estimate<Duration>{mean, mean, mean, 0.0},
                            Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0},
                            OutlierClassification{},
                            0.0};
                }
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_analyse.hpp
#include <algorithm>
#include <functional>
#include <string>
#include <vector>
#include <cmath>

namespace Catch {
    namespace Benchmark {
        struct Benchmark {
            Benchmark(std::string&& name) : name(std::move(name)) {}

            template <class FUN>
            Benchmark(std::string&& name, FUN&& func) :
                fun(std::move(func)), name(std::move(name)) {}

            template <typename Clock>
            ExecutionPlan<FloatDuration<Clock>>
            prepare(const IConfig& cfg, Environment<FloatDuration<Clock>> env) const {
                auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;
                auto run_time = std::max(
                    min_time,
                    std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));
                auto&& test = Detail::run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);
                int new_iters =
                    static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));
                return {new_iters,
                        test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(),
                        fun,
                        std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()),
                        Detail::warmup_iterations};
            }

            template <typename Clock = default_clock> void run() {
                IConfigPtr cfg = getCurrentContext().getConfig();

                auto env = Detail::measure_environment<Clock>();

                getResultCapture().benchmarkPreparing(name);
                CATCH_TRY {
                    auto plan = user_code([&] { return prepare<Clock>(*cfg, env); });

                    BenchmarkInfo info{name,
                                       plan.estimated_duration.count(),
                                       plan.iterations_per_sample,
                                       cfg->benchmarkSamples(),
                                       cfg->benchmarkResamples(),
                                       env.clock_resolution.mean.count(),
                                       env.clock_cost.mean.count()};

                    getResultCapture().benchmarkStarting(info);

                    auto samples = user_code([&] { return plan.template run<Clock>(*cfg, env); });

                    auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());
                    BenchmarkStats<FloatDuration<Clock>> stats{info,
                                                               analysis.samples,
                                                               analysis.mean,
                                                               analysis.standard_deviation,
                                                               analysis.outliers,
                                                               analysis.outlier_variance};
                    getResultCapture().benchmarkEnded(stats);
                }
                CATCH_CATCH_ALL {
                    if (translateActiveException() !=
                        Detail::benchmarkErrorMsg) // benchmark errors have been
                                                   // reported, otherwise
                                                   // rethrow.
                        std::rethrow_exception(std::current_exception());
                }
            }

            // sets lambda to be used in fun *and* executes benchmark!
            template <
                typename Fun,
                typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0>
            Benchmark& operator=(Fun func) {
                fun = Detail::BenchmarkFunction(func);
                run();
                return *this;
            }

            explicit operator bool() { return true; }

        private:
            Detail::BenchmarkFunction fun;
            std::string name;
        };
    } // namespace Benchmark
} // namespace Catch

#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1
#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2

#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)                              \
    if (Catch::Benchmark::Benchmark BenchmarkName{name})                                           \
    BenchmarkName = [&](int benchmarkIndex)

#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)                                     \
    if (Catch::Benchmark::Benchmark BenchmarkName{name})                                           \
    BenchmarkName = [&]

// end catch_benchmark.hpp
// start catch_constructor.hpp

// Constructor and destructor helpers

#include <type_traits>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T, bool Destruct> struct ObjectStorage {
                using TStorage =
                    typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;

                ObjectStorage() : data() {}

                ObjectStorage(const ObjectStorage& other) { new (&data) T(other.stored_object()); }

                ObjectStorage(ObjectStorage&& other) {
                    new (&data) T(std::move(other.stored_object()));
                }

                ~ObjectStorage() { destruct_on_exit<T>(); }

                template <typename... Args> void construct(Args&&... args) {
                    new (&data) T(std::forward<Args>(args)...);
                }

                template <bool AllowManualDestruction = !Destruct>
                typename std::enable_if<AllowManualDestruction>::type destruct() {
                    stored_object().~T();
                }

            private:
                // If this is a constructor benchmark, destruct the underlying
                // object
                template <typename U>
                void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) {
                    destruct<true>();
                }
                // Otherwise, don't
                template <typename U>
                void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) {}

                T& stored_object() { return *static_cast<T*>(static_cast<void*>(&data)); }

                T const& stored_object() const {
                    return *static_cast<T*>(static_cast<void*>(&data));
                }

                TStorage data;
            };
        } // namespace Detail

        template <typename T> using storage_for = Detail::ObjectStorage<T, true>;

        template <typename T> using destructable_object = Detail::ObjectStorage<T, false>;
    } // namespace Benchmark
} // namespace Catch

// end catch_constructor.hpp
// end catch_benchmarking_all.hpp
#endif

#endif // ! CATCH_CONFIG_IMPL_ONLY

#ifdef CATCH_IMPL
// start catch_impl.hpp

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
#endif

// Keep these here for external reporters
// start catch_test_case_tracker.h

#include <string>
#include <vector>
#include <memory>

namespace Catch {
    namespace TestCaseTracking {

        struct NameAndLocation {
            std::string name;
            SourceLineInfo location;

            NameAndLocation(std::string const& _name, SourceLineInfo const& _location);
            friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {
                return lhs.name == rhs.name && lhs.location == rhs.location;
            }
        };

        class ITracker;

        using ITrackerPtr = std::shared_ptr<ITracker>;

        class ITracker {
            NameAndLocation m_nameAndLocation;

        public:
            ITracker(NameAndLocation const& nameAndLoc) : m_nameAndLocation(nameAndLoc) {}

            // static queries
            NameAndLocation const& nameAndLocation() const { return m_nameAndLocation; }

            virtual ~ITracker();

            // dynamic queries
            virtual bool isComplete() const = 0; // Successfully completed or failed
            virtual bool isSuccessfullyCompleted() const = 0;
            virtual bool isOpen() const = 0; // Started but not complete
            virtual bool hasChildren() const = 0;
            virtual bool hasStarted() const = 0;

            virtual ITracker& parent() = 0;

            // actions
            virtual void close() = 0; // Successfully complete
            virtual void fail() = 0;
            virtual void markAsNeedingAnotherRun() = 0;

            virtual void addChild(ITrackerPtr const& child) = 0;
            virtual ITrackerPtr findChild(NameAndLocation const& nameAndLocation) = 0;
            virtual void openChild() = 0;

            // Debug/ checking
            virtual bool isSectionTracker() const = 0;
            virtual bool isGeneratorTracker() const = 0;
        };

        class TrackerContext {

            enum RunState { NotStarted, Executing, CompletedCycle };

            ITrackerPtr m_rootTracker;
            ITracker* m_currentTracker = nullptr;
            RunState m_runState = NotStarted;

        public:
            ITracker& startRun();
            void endRun();

            void startCycle();
            void completeCycle();

            bool completedCycle() const;
            ITracker& currentTracker();
            void setCurrentTracker(ITracker* tracker);
        };

        class TrackerBase : public ITracker {
        protected:
            enum CycleState {
                NotStarted,
                Executing,
                ExecutingChildren,
                NeedsAnotherRun,
                CompletedSuccessfully,
                Failed
            };

            using Children = std::vector<ITrackerPtr>;
            TrackerContext& m_ctx;
            ITracker* m_parent;
            Children m_children;
            CycleState m_runState = NotStarted;

        public:
            TrackerBase(NameAndLocation const& nameAndLocation,
                        TrackerContext& ctx,
                        ITracker* parent);

            bool isComplete() const override;
            bool isSuccessfullyCompleted() const override;
            bool isOpen() const override;
            bool hasChildren() const override;
            bool hasStarted() const override { return m_runState != NotStarted; }

            void addChild(ITrackerPtr const& child) override;

            ITrackerPtr findChild(NameAndLocation const& nameAndLocation) override;
            ITracker& parent() override;

            void openChild() override;

            bool isSectionTracker() const override;
            bool isGeneratorTracker() const override;

            void open();

            void close() override;
            void fail() override;
            void markAsNeedingAnotherRun() override;

        private:
            void moveToParent();
            void moveToThis();
        };

        class SectionTracker : public TrackerBase {
            std::vector<std::string> m_filters;
            std::string m_trimmed_name;

        public:
            SectionTracker(NameAndLocation const& nameAndLocation,
                           TrackerContext& ctx,
                           ITracker* parent);

            bool isSectionTracker() const override;

            bool isComplete() const override;

            static SectionTracker& acquire(TrackerContext& ctx,
                                           NameAndLocation const& nameAndLocation);

            void tryOpen();

            void addInitialFilters(std::vector<std::string> const& filters);
            void addNextFilters(std::vector<std::string> const& filters);
            //! Returns filters active in this tracker
            std::vector<std::string> const& getFilters() const;
            //! Returns whitespace-trimmed name of the tracked section
            std::string const& trimmedName() const;
        };

    } // namespace TestCaseTracking

    using TestCaseTracking::ITracker;
    using TestCaseTracking::SectionTracker;
    using TestCaseTracking::TrackerContext;

} // namespace Catch

// end catch_test_case_tracker.h

// start catch_leak_detector.h

namespace Catch {

    struct LeakDetector {
        LeakDetector();
        ~LeakDetector();
    };

} // namespace Catch
// end catch_leak_detector.h
// Cpp files will be included in the single-header file here
// start catch_stats.cpp

// Statistical analysis tools

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)

#include <cassert>
#include <random>

#if defined(CATCH_CONFIG_USE_ASYNC)
#include <future>
#endif

namespace {
    double erf_inv(double x) {
        // Code accompanying the article "Approximating the erfinv function" in
        // GPU Computing Gems, Volume 2
        double w, p;

        w = -log((1.0 - x) * (1.0 + x));

        if (w < 6.250000) {
            w = w - 3.125000;
            p = -3.6444120640178196996e-21;
            p = -1.685059138182016589e-19 + p * w;
            p = 1.2858480715256400167e-18 + p * w;
            p = 1.115787767802518096e-17 + p * w;
            p = -1.333171662854620906e-16 + p * w;
            p = 2.0972767875968561637e-17 + p * w;
            p = 6.6376381343583238325e-15 + p * w;
            p = -4.0545662729752068639e-14 + p * w;
            p = -8.1519341976054721522e-14 + p * w;
            p = 2.6335093153082322977e-12 + p * w;
            p = -1.2975133253453532498e-11 + p * w;
            p = -5.4154120542946279317e-11 + p * w;
            p = 1.051212273321532285e-09 + p * w;
            p = -4.1126339803469836976e-09 + p * w;
            p = -2.9070369957882005086e-08 + p * w;
            p = 4.2347877827932403518e-07 + p * w;
            p = -1.3654692000834678645e-06 + p * w;
            p = -1.3882523362786468719e-05 + p * w;
            p = 0.0001867342080340571352 + p * w;
            p = -0.00074070253416626697512 + p * w;
            p = -0.0060336708714301490533 + p * w;
            p = 0.24015818242558961693 + p * w;
            p = 1.6536545626831027356 + p * w;
        } else if (w < 16.000000) {
            w = sqrt(w) - 3.250000;
            p = 2.2137376921775787049e-09;
            p = 9.0756561938885390979e-08 + p * w;
            p = -2.7517406297064545428e-07 + p * w;
            p = 1.8239629214389227755e-08 + p * w;
            p = 1.5027403968909827627e-06 + p * w;
            p = -4.013867526981545969e-06 + p * w;
            p = 2.9234449089955446044e-06 + p * w;
            p = 1.2475304481671778723e-05 + p * w;
            p = -4.7318229009055733981e-05 + p * w;
            p = 6.8284851459573175448e-05 + p * w;
            p = 2.4031110387097893999e-05 + p * w;
            p = -0.0003550375203628474796 + p * w;
            p = 0.00095328937973738049703 + p * w;
            p = -0.0016882755560235047313 + p * w;
            p = 0.0024914420961078508066 + p * w;
            p = -0.0037512085075692412107 + p * w;
            p = 0.005370914553590063617 + p * w;
            p = 1.0052589676941592334 + p * w;
            p = 3.0838856104922207635 + p * w;
        } else {
            w = sqrt(w) - 5.000000;
            p = -2.7109920616438573243e-11;
            p = -2.5556418169965252055e-10 + p * w;
            p = 1.5076572693500548083e-09 + p * w;
            p = -3.7894654401267369937e-09 + p * w;
            p = 7.6157012080783393804e-09 + p * w;
            p = -1.4960026627149240478e-08 + p * w;
            p = 2.9147953450901080826e-08 + p * w;
            p = -6.7711997758452339498e-08 + p * w;
            p = 2.2900482228026654717e-07 + p * w;
            p = -9.9298272942317002539e-07 + p * w;
            p = 4.5260625972231537039e-06 + p * w;
            p = -1.9681778105531670567e-05 + p * w;
            p = 7.5995277030017761139e-05 + p * w;
            p = -0.00021503011930044477347 + p * w;
            p = -0.00013871931833623122026 + p * w;
            p = 1.0103004648645343977 + p * w;
            p = 4.8499064014085844221 + p * w;
        }
        return p * x;
    }

    double standard_deviation(std::vector<double>::iterator first,
                              std::vector<double>::iterator last) {
        auto m = Catch::Benchmark::Detail::mean(first, last);
        double variance = std::accumulate(first,
                                          last,
                                          0.,
                                          [m](double a, double b) {
                                              double diff = b - m;
                                              return a + diff * diff;
                                          }) /
                          (last - first);
        return std::sqrt(variance);
    }

} // namespace

namespace Catch {
    namespace Benchmark {
        namespace Detail {

            double weighted_average_quantile(int k,
                                             int q,
                                             std::vector<double>::iterator first,
                                             std::vector<double>::iterator last) {
                auto count = last - first;
                double idx = (count - 1) * k / static_cast<double>(q);
                int j = static_cast<int>(idx);
                double g = idx - j;
                std::nth_element(first, first + j, last);
                auto xj = first[j];
                if (g == 0)
                    return xj;

                auto xj1 = *std::min_element(first + (j + 1), last);
                return xj + g * (xj1 - xj);
            }

            double erfc_inv(double x) { return erf_inv(1.0 - x); }

            double normal_quantile(double p) {
                static const double ROOT_TWO = std::sqrt(2.0);

                double result = 0.0;
                assert(p >= 0 && p <= 1);
                if (p < 0 || p > 1) {
                    return result;
                }

                result = -erfc_inv(2.0 * p);
                // result *= normal distribution standard deviation (1.0) *
                // sqrt(2)
                result *= /*sd * */ ROOT_TWO;
                // result += normal disttribution mean (0)
                return result;
            }

            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) {
                double sb = stddev.point;
                double mn = mean.point / n;
                double mg_min = mn / 2.;
                double sg = (std::min)(mg_min / 4., sb / std::sqrt(n));
                double sg2 = sg * sg;
                double sb2 = sb * sb;

                auto c_max = [n, mn, sb2, sg2](double x) -> double {
                    double k = mn - x;
                    double d = k * k;
                    double nd = n * d;
                    double k0 = -n * nd;
                    double k1 = sb2 - n * sg2 + nd;
                    double det = k1 * k1 - 4 * sg2 * k0;
                    return (int)(-2. * k0 / (k1 + std::sqrt(det)));
                };

                auto var_out = [n, sb2, sg2](double c) {
                    double nc = n - c;
                    return (nc / n) * (sb2 - nc * sg2);
                };

                return (std::min)(var_out(1), var_out((std::min)(c_max(0.), c_max(mg_min)))) / sb2;
            }

            bootstrap_analysis analyse_samples(double confidence_level,
                                               int n_resamples,
                                               std::vector<double>::iterator first,
                                               std::vector<double>::iterator last) {
                CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
                CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
                static std::random_device entropy;
                CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

                auto n = static_cast<int>(last - first); // seriously, one can't use integral types
                                                         // without hell in C++

                auto mean = &Detail::mean<std::vector<double>::iterator>;
                auto stddev = &standard_deviation;

#if defined(CATCH_CONFIG_USE_ASYNC)
                auto Estimate =
                    [=](double (*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
                        auto seed = entropy();
                        return std::async(std::launch::async, [=] {
                            std::mt19937 rng(seed);
                            auto resampled = resample(rng, n_resamples, first, last, f);
                            return bootstrap(confidence_level, first, last, resampled, f);
                        });
                    };

                auto mean_future = Estimate(mean);
                auto stddev_future = Estimate(stddev);

                auto mean_estimate = mean_future.get();
                auto stddev_estimate = stddev_future.get();
#else
                auto Estimate =
                    [=](double (*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
                        auto seed = entropy();
                        std::mt19937 rng(seed);
                        auto resampled = resample(rng, n_resamples, first, last, f);
                        return bootstrap(confidence_level, first, last, resampled, f);
                    };

                auto mean_estimate = Estimate(mean);
                auto stddev_estimate = Estimate(stddev);
#endif // CATCH_USE_ASYNC

                double outlier_variance =
                    Detail::outlier_variance(mean_estimate, stddev_estimate, n);

                return {mean_estimate, stddev_estimate, outlier_variance};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
// end catch_stats.cpp
// start catch_approx.cpp

#include <cmath>
#include <limits>

namespace {

    // Performs equivalent check of std::fabs(lhs - rhs) <= margin
    // But without the subtraction to allow for INFINITY in comparison
    bool marginComparison(double lhs, double rhs, double margin) {
        return (lhs + margin >= rhs) && (rhs + margin >= lhs);
    }

} // namespace

namespace Catch {
    namespace Detail {

        Approx::Approx(double value) :
            m_epsilon(std::numeric_limits<float>::epsilon() * 100),
            m_margin(0.0),
            m_scale(0.0),
            m_value(value) {}

        Approx Approx::custom() { return Approx(0); }

        Approx Approx::operator-() const {
            auto temp(*this);
            temp.m_value = -temp.m_value;
            return temp;
        }

        std::string Approx::toString() const {
            ReusableStringStream rss;
            rss << "Approx( " << ::Catch::Detail::stringify(m_value) << " )";
            return rss.str();
        }

        bool Approx::equalityComparisonImpl(const double other) const {
            // First try with fixed margin, then compute margin based on
            // epsilon, scale and Approx's value Thanks to Richard Harris for
            // his help refining the scaled margin value
            return marginComparison(m_value, other, m_margin) ||
                   marginComparison(m_value,
                                    other,
                                    m_epsilon *
                                        (m_scale + std::fabs(std::isinf(m_value) ? 0 : m_value)));
        }

        void Approx::setMargin(double newMargin) {
            CATCH_ENFORCE(newMargin >= 0,
                          "Invalid Approx::margin: " << newMargin << '.'
                                                     << " Approx::Margin has to be non-negative.");
            m_margin = newMargin;
        }

        void Approx::setEpsilon(double newEpsilon) {
            CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,
                          "Invalid Approx::epsilon: " << newEpsilon << '.'
                                                      << " Approx::epsilon has to be in [0, 1]");
            m_epsilon = newEpsilon;
        }

    } // end namespace Detail

    namespace literals {
        Detail::Approx operator"" _a(long double val) { return Detail::Approx(val); }
        Detail::Approx operator"" _a(unsigned long long val) { return Detail::Approx(val); }
    } // end namespace literals

    std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
        return value.toString();
    }

} // end namespace Catch
// end catch_approx.cpp
// start catch_assertionhandler.cpp

// start catch_debugger.h

namespace Catch {
    bool isDebuggerActive();
}

#ifdef CATCH_PLATFORM_MAC

#if defined(__i386__) || defined(__x86_64__)
#define CATCH_TRAP() __asm__("int $3\n" : :) /* NOLINT */
#elif defined(__aarch64__)
#define CATCH_TRAP() __asm__(".inst 0xd4200000")
#endif

#elif defined(CATCH_PLATFORM_IPHONE)

// use inline assembler
#if defined(__i386__) || defined(__x86_64__)
#define CATCH_TRAP() __asm__("int $3")
#elif defined(__aarch64__)
#define CATCH_TRAP() __asm__(".inst 0xd4200000")
#elif defined(__arm__) && !defined(__thumb__)
#define CATCH_TRAP() __asm__(".inst 0xe7f001f0")
#elif defined(__arm__) && defined(__thumb__)
#define CATCH_TRAP() __asm__(".inst 0xde01")
#endif

#elif defined(CATCH_PLATFORM_LINUX)
// If we can use inline assembler, do it because this allows us to break
// directly at the location of the failing check instead of breaking inside
// raise() called from it, i.e. one stack frame below.
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
#define CATCH_TRAP() asm volatile("int $3") /* NOLINT */
#else                                       // Fall back to the generic way.
#include <signal.h>

#define CATCH_TRAP() raise(SIGTRAP)
#endif
#elif defined(_MSC_VER)
#define CATCH_TRAP() __debugbreak()
#elif defined(__MINGW32__)
extern "C" __declspec(dllimport) void __stdcall DebugBreak();
#define CATCH_TRAP() DebugBreak()
#endif

#ifndef CATCH_BREAK_INTO_DEBUGGER
#ifdef CATCH_TRAP
#define CATCH_BREAK_INTO_DEBUGGER()                                                                \
    [] {                                                                                           \
        if (Catch::isDebuggerActive()) {                                                           \
            CATCH_TRAP();                                                                          \
        }                                                                                          \
    }()
#else
#define CATCH_BREAK_INTO_DEBUGGER() [] {}()
#endif
#endif

// end catch_debugger.h
// start catch_run_context.h

// start catch_fatal_condition.h

#include <cassert>

namespace Catch {

    // Wrapper for platform-specific fatal error (signals/SEH) handlers
    //
    // Tries to be cooperative with other handlers, and not step over
    // other handlers. This means that unknown structured exceptions
    // are passed on, previous signal handlers are called, and so on.
    //
    // Can only be instantiated once, and assumes that once a signal
    // is caught, the binary will end up terminating. Thus, there
    class FatalConditionHandler {
        bool m_started = false;

        // Install/disengage implementation for specific platform.
        // Should be if-defed to work on current platform, can assume
        // engage-disengage 1:1 pairing.
        void engage_platform();
        void disengage_platform();

    public:
        // Should also have platform-specific implementations as needed
        FatalConditionHandler();
        ~FatalConditionHandler();

        void engage() {
            assert(!m_started && "Handler cannot be installed twice.");
            m_started = true;
            engage_platform();
        }

        void disengage() {
            assert(m_started && "Handler cannot be uninstalled without being installed first");
            m_started = false;
            disengage_platform();
        }
    };

    //! Simple RAII guard for (dis)engaging the FatalConditionHandler
    class FatalConditionHandlerGuard {
        FatalConditionHandler* m_handler;

    public:
        FatalConditionHandlerGuard(FatalConditionHandler* handler) : m_handler(handler) {
            m_handler->engage();
        }
        ~FatalConditionHandlerGuard() { m_handler->disengage(); }
    };

} // end namespace Catch

// end catch_fatal_condition.h
#include <string>

namespace Catch {

    struct IMutableContext;

    ///////////////////////////////////////////////////////////////////////////

    class RunContext : public IResultCapture, public IRunner {

    public:
        RunContext(RunContext const&) = delete;
        RunContext& operator=(RunContext const&) = delete;

        explicit RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter);

        ~RunContext() override;

        void testGroupStarting(std::string const& testSpec,
                               std::size_t groupIndex,
                               std::size_t groupsCount);
        void testGroupEnded(std::string const& testSpec,
                            Totals const& totals,
                            std::size_t groupIndex,
                            std::size_t groupsCount);

        Totals runTest(TestCase const& testCase);

        IConfigPtr config() const;
        IStreamingReporter& reporter() const;

    public: // IResultCapture
        // Assertion handlers
        void handleExpr(AssertionInfo const& info,
                        ITransientExpression const& expr,
                        AssertionReaction& reaction) override;
        void handleMessage(AssertionInfo const& info,
                           ResultWas::OfType resultType,
                           StringRef const& message,
                           AssertionReaction& reaction) override;
        void handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                AssertionReaction& reaction) override;
        void handleUnexpectedInflightException(AssertionInfo const& info,
                                               std::string const& message,
                                               AssertionReaction& reaction) override;
        void handleIncomplete(AssertionInfo const& info) override;
        void handleNonExpr(AssertionInfo const& info,
                           ResultWas::OfType resultType,
                           AssertionReaction& reaction) override;

        bool sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) override;

        void sectionEnded(SectionEndInfo const& endInfo) override;
        void sectionEndedEarly(SectionEndInfo const& endInfo) override;

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& info) override;
        void benchmarkEnded(BenchmarkStats<> const& stats) override;
        void benchmarkFailed(std::string const& error) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void pushScopedMessage(MessageInfo const& message) override;
        void popScopedMessage(MessageInfo const& message) override;

        void emplaceUnscopedMessage(MessageBuilder const& builder) override;

        std::string getCurrentTestName() const override;

        const AssertionResult* getLastResult() const override;

        void exceptionEarlyReported() override;

        void handleFatalErrorCondition(StringRef message) override;

        bool lastAssertionPassed() override;

        void assertionPassed() override;

    public:
        // !TBD We need to do this another way!
        bool aborting() const final;

    private:
        void runCurrentTest(std::string& redirectedCout, std::string& redirectedCerr);
        void invokeActiveTestCase();

        void resetAssertionInfo();
        bool testForMissingAssertions(Counts& assertions);

        void assertionEnded(AssertionResult const& result);
        void reportExpr(AssertionInfo const& info,
                        ResultWas::OfType resultType,
                        ITransientExpression const* expr,
                        bool negated);

        void populateReaction(AssertionReaction& reaction);

    private:
        void handleUnfinishedSections();

        TestRunInfo m_runInfo;
        IMutableContext& m_context;
        TestCase const* m_activeTestCase = nullptr;
        ITracker* m_testCaseTracker = nullptr;
        Option<AssertionResult> m_lastResult;

        IConfigPtr m_config;
        Totals m_totals;
        IStreamingReporterPtr m_reporter;
        std::vector<MessageInfo> m_messages;
        std::vector<ScopedMessage>
            m_messageScopes; /* Keeps owners of so-called unscoped messages. */
        AssertionInfo m_lastAssertionInfo;
        std::vector<SectionEndInfo> m_unfinishedSections;
        std::vector<ITracker*> m_activeSections;
        TrackerContext m_trackerContext;
        FatalConditionHandler m_fatalConditionhandler;
        bool m_lastAssertionPassed = false;
        bool m_shouldReportUnexpected = true;
        bool m_includeSuccessfulResults;
    };

    void seedRng(IConfig const& config);
    unsigned int rngSeed();
} // end namespace Catch

// end catch_run_context.h
namespace Catch {

    namespace {
        auto operator<<(std::ostream& os, ITransientExpression const& expr) -> std::ostream& {
            expr.streamReconstructedExpression(os);
            return os;
        }
    } // namespace

    LazyExpression::LazyExpression(bool isNegated) : m_isNegated(isNegated) {}

    LazyExpression::LazyExpression(LazyExpression const& other) : m_isNegated(other.m_isNegated) {}

    LazyExpression::operator bool() const { return m_transientExpression != nullptr; }

    auto operator<<(std::ostream& os, LazyExpression const& lazyExpr) -> std::ostream& {
        if (lazyExpr.m_isNegated)
            os << "!";

        if (lazyExpr) {
            if (lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression())
                os << "(" << *lazyExpr.m_transientExpression << ")";
            else
                os << *lazyExpr.m_transientExpression;
        } else {
            os << "{** error - unchecked empty expression requested **}";
        }
        return os;
    }

    AssertionHandler::AssertionHandler(StringRef const& macroName,
                                       SourceLineInfo const& lineInfo,
                                       StringRef capturedExpression,
                                       ResultDisposition::Flags resultDisposition) :
        m_assertionInfo{macroName, lineInfo, capturedExpression, resultDisposition},
        m_resultCapture(getResultCapture()) {}

    void AssertionHandler::handleExpr(ITransientExpression const& expr) {
        m_resultCapture.handleExpr(m_assertionInfo, expr, m_reaction);
    }
    void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {
        m_resultCapture.handleMessage(m_assertionInfo, resultType, message, m_reaction);
    }

    auto AssertionHandler::allowThrows() const -> bool {
        return getCurrentContext().getConfig()->allowThrows();
    }

    void AssertionHandler::complete() {
        setCompleted();
        if (m_reaction.shouldDebugBreak) {

            // If you find your debugger stopping you here then go one level up
            // on the call-stack for the code that caused it (typically a failed
            // assertion)

            // (To go back to the test and change execution, jump over the
            // throw, next)
            CATCH_BREAK_INTO_DEBUGGER();
        }
        if (m_reaction.shouldThrow) {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
            throw Catch::TestFailureException();
#else
            CATCH_ERROR("Test failure requires aborting test!");
#endif
        }
    }
    void AssertionHandler::setCompleted() { m_completed = true; }

    void AssertionHandler::handleUnexpectedInflightException() {
        m_resultCapture.handleUnexpectedInflightException(
            m_assertionInfo, Catch::translateActiveException(), m_reaction);
    }

    void AssertionHandler::handleExceptionThrownAsExpected() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }
    void AssertionHandler::handleExceptionNotThrownAsExpected() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }

    void AssertionHandler::handleUnexpectedExceptionNotThrown() {
        m_resultCapture.handleUnexpectedExceptionNotThrown(m_assertionInfo, m_reaction);
    }

    void AssertionHandler::handleThrowingCallSkipped() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }

    // This is the overload that takes a string and infers the Equals matcher
    // from it The more general overload, that takes any string matcher, is in
    // catch_capture_matchers.cpp
    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  std::string const& str,
                                  StringRef const& matcherString) {
        handleExceptionMatchExpr(handler, Matchers::Equals(str), matcherString);
    }

} // namespace Catch
// end catch_assertionhandler.cpp
// start catch_assertionresult.cpp

namespace Catch {
    AssertionResultData::AssertionResultData(ResultWas::OfType _resultType,
                                             LazyExpression const& _lazyExpression) :
        lazyExpression(_lazyExpression), resultType(_resultType) {}

    std::string AssertionResultData::reconstructExpression() const {

        if (reconstructedExpression.empty()) {
            if (lazyExpression) {
                ReusableStringStream rss;
                rss << lazyExpression;
                reconstructedExpression = rss.str();
            }
        }
        return reconstructedExpression;
    }

    AssertionResult::AssertionResult(AssertionInfo const& info, AssertionResultData const& data) :
        m_info(info), m_resultData(data) {}

    // Result was a success
    bool AssertionResult::succeeded() const { return Catch::isOk(m_resultData.resultType); }

    // Result was a success, or failure is suppressed
    bool AssertionResult::isOk() const {
        return Catch::isOk(m_resultData.resultType) ||
               shouldSuppressFailure(m_info.resultDisposition);
    }

    ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; }

    bool AssertionResult::hasExpression() const { return !m_info.capturedExpression.empty(); }

    bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); }

    std::string AssertionResult::getExpression() const {
        // Possibly overallocating by 3 characters should be basically free
        std::string expr;
        expr.reserve(m_info.capturedExpression.size() + 3);
        if (isFalseTest(m_info.resultDisposition)) {
            expr += "!(";
        }
        expr += m_info.capturedExpression;
        if (isFalseTest(m_info.resultDisposition)) {
            expr += ')';
        }
        return expr;
    }

    std::string AssertionResult::getExpressionInMacro() const {
        std::string expr;
        if (m_info.macroName.empty())
            expr = static_cast<std::string>(m_info.capturedExpression);
        else {
            expr.reserve(m_info.macroName.size() + m_info.capturedExpression.size() + 4);
            expr += m_info.macroName;
            expr += "( ";
            expr += m_info.capturedExpression;
            expr += " )";
        }
        return expr;
    }

    bool AssertionResult::hasExpandedExpression() const {
        return hasExpression() && getExpandedExpression() != getExpression();
    }

    std::string AssertionResult::getExpandedExpression() const {
        std::string expr = m_resultData.reconstructExpression();
        return expr.empty() ? getExpression() : expr;
    }

    std::string AssertionResult::getMessage() const { return m_resultData.message; }
    SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; }

    StringRef AssertionResult::getTestMacroName() const { return m_info.macroName; }

} // end namespace Catch
// end catch_assertionresult.cpp
// start catch_capture_matchers.cpp

namespace Catch {

    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;

    // This is the general overload that takes a any string matcher
    // There is another overload, in catch_assertionhandler.h/.cpp, that only
    // takes a string and infers the Equals matcher (so the header does not
    // mention matchers)
    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  StringMatcher const& matcher,
                                  StringRef const& matcherString) {
        std::string exceptionMessage = Catch::translateActiveException();
        MatchExpr<std::string, StringMatcher const&> expr(exceptionMessage, matcher, matcherString);
        handler.handleExpr(expr);
    }

} // namespace Catch
// end catch_capture_matchers.cpp
// start catch_commandline.cpp

// start catch_commandline.h

// start catch_clara.h

// Use Catch's value for console width (store Clara's off to the side, if
// present)
#ifdef CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#endif
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - 1

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#pragma clang diagnostic ignored "-Wshadow"
#endif

// start clara.hpp
// Copyright 2017 Two Blue Cubes Ltd. All rights reserved.
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See https://github.com/philsquared/Clara for more details

// Clara v1.1.5

#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80
#endif

#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH
#endif

#ifndef CLARA_CONFIG_OPTIONAL_TYPE
#ifdef __has_include
#if __has_include(<optional>) && __cplusplus >= 201703L
#include <optional>
#define CLARA_CONFIG_OPTIONAL_TYPE std::optional
#endif
#endif
#endif

// ----------- #included from clara_textflow.hpp -----------

// TextFlowCpp
//
// A single-header library for wrapping and laying out basic text, by Phil Nash
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// This project is hosted at https://github.com/philsquared/textflowcpp

#include <cassert>
#include <ostream>
#include <sstream>
#include <vector>

#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80
#endif

namespace Catch {
    namespace clara {
        namespace TextFlow {

            inline auto isWhitespace(char c) -> bool {
                static std::string chars = " \t\n\r";
                return chars.find(c) != std::string::npos;
            }
            inline auto isBreakableBefore(char c) -> bool {
                static std::string chars = "[({<|";
                return chars.find(c) != std::string::npos;
            }
            inline auto isBreakableAfter(char c) -> bool {
                static std::string chars = "])}>.,:;*+-=&/\\";
                return chars.find(c) != std::string::npos;
            }

            class Columns;

            class Column {
                std::vector<std::string> m_strings;
                size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
                size_t m_indent = 0;
                size_t m_initialIndent = std::string::npos;

            public:
                class iterator {
                    friend Column;

                    Column const& m_column;
                    size_t m_stringIndex = 0;
                    size_t m_pos = 0;

                    size_t m_len = 0;
                    size_t m_end = 0;
                    bool m_suffix = false;

                    iterator(Column const& column, size_t stringIndex) :
                        m_column(column), m_stringIndex(stringIndex) {}

                    auto line() const -> std::string const& {
                        return m_column.m_strings[m_stringIndex];
                    }

                    auto isBoundary(size_t at) const -> bool {
                        assert(at > 0);
                        assert(at <= line().size());

                        return at == line().size() ||
                               (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||
                               isBreakableBefore(line()[at]) || isBreakableAfter(line()[at - 1]);
                    }

                    void calcLength() {
                        assert(m_stringIndex < m_column.m_strings.size());

                        m_suffix = false;
                        auto width = m_column.m_width - indent();
                        m_end = m_pos;
                        if (line()[m_pos] == '\n') {
                            ++m_end;
                        }
                        while (m_end < line().size() && line()[m_end] != '\n')
                            ++m_end;

                        if (m_end < m_pos + width) {
                            m_len = m_end - m_pos;
                        } else {
                            size_t len = width;
                            while (len > 0 && !isBoundary(m_pos + len))
                                --len;
                            while (len > 0 && isWhitespace(line()[m_pos + len - 1]))
                                --len;

                            if (len > 0) {
                                m_len = len;
                            } else {
                                m_suffix = true;
                                m_len = width - 1;
                            }
                        }
                    }

                    auto indent() const -> size_t {
                        auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent
                                                                        : std::string::npos;
                        return initial == std::string::npos ? m_column.m_indent : initial;
                    }

                    auto addIndentAndSuffix(std::string const& plain) const -> std::string {
                        return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain);
                    }

                public:
                    using difference_type = std::ptrdiff_t;
                    using value_type = std::string;
                    using pointer = value_type*;
                    using reference = value_type&;
                    using iterator_category = std::forward_iterator_tag;

                    explicit iterator(Column const& column) : m_column(column) {
                        assert(m_column.m_width > m_column.m_indent);
                        assert(m_column.m_initialIndent == std::string::npos ||
                               m_column.m_width > m_column.m_initialIndent);
                        calcLength();
                        if (m_len == 0)
                            m_stringIndex++; // Empty string
                    }

                    auto operator*() const -> std::string {
                        assert(m_stringIndex < m_column.m_strings.size());
                        assert(m_pos <= m_end);
                        return addIndentAndSuffix(line().substr(m_pos, m_len));
                    }

                    auto operator++() -> iterator& {
                        m_pos += m_len;
                        if (m_pos < line().size() && line()[m_pos] == '\n')
                            m_pos += 1;
                        else
                            while (m_pos < line().size() && isWhitespace(line()[m_pos]))
                                ++m_pos;

                        if (m_pos == line().size()) {
                            m_pos = 0;
                            ++m_stringIndex;
                        }
                        if (m_stringIndex < m_column.m_strings.size())
                            calcLength();
                        return *this;
                    }
                    auto operator++(int) -> iterator {
                        iterator prev(*this);
                        operator++();
                        return prev;
                    }

                    auto operator==(iterator const& other) const -> bool {
                        return m_pos == other.m_pos && m_stringIndex == other.m_stringIndex &&
                               &m_column == &other.m_column;
                    }
                    auto operator!=(iterator const& other) const -> bool {
                        return !operator==(other);
                    }
                };
                using const_iterator = iterator;

                explicit Column(std::string const& text) { m_strings.push_back(text); }

                auto width(size_t newWidth) -> Column& {
                    assert(newWidth > 0);
                    m_width = newWidth;
                    return *this;
                }
                auto indent(size_t newIndent) -> Column& {
                    m_indent = newIndent;
                    return *this;
                }
                auto initialIndent(size_t newIndent) -> Column& {
                    m_initialIndent = newIndent;
                    return *this;
                }

                auto width() const -> size_t { return m_width; }
                auto begin() const -> iterator { return iterator(*this); }
                auto end() const -> iterator { return {*this, m_strings.size()}; }

                inline friend std::ostream& operator<<(std::ostream& os, Column const& col) {
                    bool first = true;
                    for (auto line : col) {
                        if (first)
                            first = false;
                        else
                            os << "\n";
                        os << line;
                    }
                    return os;
                }

                auto operator+(Column const& other) -> Columns;

                auto toString() const -> std::string {
                    std::ostringstream oss;
                    oss << *this;
                    return oss.str();
                }
            };

            class Spacer : public Column {

            public:
                explicit Spacer(size_t spaceWidth) : Column("") { width(spaceWidth); }
            };

            class Columns {
                std::vector<Column> m_columns;

            public:
                class iterator {
                    friend Columns;
                    struct EndTag {};

                    std::vector<Column> const& m_columns;
                    std::vector<Column::iterator> m_iterators;
                    size_t m_activeIterators;

                    iterator(Columns const& columns, EndTag) :
                        m_columns(columns.m_columns), m_activeIterators(0) {
                        m_iterators.reserve(m_columns.size());

                        for (auto const& col : m_columns)
                            m_iterators.push_back(col.end());
                    }

                public:
                    using difference_type = std::ptrdiff_t;
                    using value_type = std::string;
                    using pointer = value_type*;
                    using reference = value_type&;
                    using iterator_category = std::forward_iterator_tag;

                    explicit iterator(Columns const& columns) :
                        m_columns(columns.m_columns), m_activeIterators(m_columns.size()) {
                        m_iterators.reserve(m_columns.size());

                        for (auto const& col : m_columns)
                            m_iterators.push_back(col.begin());
                    }

                    auto operator==(iterator const& other) const -> bool {
                        return m_iterators == other.m_iterators;
                    }
                    auto operator!=(iterator const& other) const -> bool {
                        return m_iterators != other.m_iterators;
                    }
                    auto operator*() const -> std::string {
                        std::string row, padding;

                        for (size_t i = 0; i < m_columns.size(); ++i) {
                            auto width = m_columns[i].width();
                            if (m_iterators[i] != m_columns[i].end()) {
                                std::string col = *m_iterators[i];
                                row += padding + col;
                                if (col.size() < width)
                                    padding = std::string(width - col.size(), ' ');
                                else
                                    padding = "";
                            } else {
                                padding += std::string(width, ' ');
                            }
                        }
                        return row;
                    }
                    auto operator++() -> iterator& {
                        for (size_t i = 0; i < m_columns.size(); ++i) {
                            if (m_iterators[i] != m_columns[i].end())
                                ++m_iterators[i];
                        }
                        return *this;
                    }
                    auto operator++(int) -> iterator {
                        iterator prev(*this);
                        operator++();
                        return prev;
                    }
                };
                using const_iterator = iterator;

                auto begin() const -> iterator { return iterator(*this); }
                auto end() const -> iterator { return {*this, iterator::EndTag()}; }

                auto operator+=(Column const& col) -> Columns& {
                    m_columns.push_back(col);
                    return *this;
                }
                auto operator+(Column const& col) -> Columns {
                    Columns combined = *this;
                    combined += col;
                    return combined;
                }

                inline friend std::ostream& operator<<(std::ostream& os, Columns const& cols) {

                    bool first = true;
                    for (auto line : cols) {
                        if (first)
                            first = false;
                        else
                            os << "\n";
                        os << line;
                    }
                    return os;
                }

                auto toString() const -> std::string {
                    std::ostringstream oss;
                    oss << *this;
                    return oss.str();
                }
            };

            inline auto Column::operator+(Column const& other) -> Columns {
                Columns cols;
                cols += *this;
                cols += other;
                return cols;
            }
        } // namespace TextFlow

    } // namespace clara
} // namespace Catch

// ----------- end of #include from clara_textflow.hpp -----------
// ........... back in clara.hpp

#include <cctype>
#include <string>
#include <memory>
#include <set>
#include <algorithm>

#if !defined(CATCH_PLATFORM_WINDOWS) &&                                                            \
    (defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER))
#define CATCH_PLATFORM_WINDOWS
#endif

namespace Catch {
    namespace clara {
        namespace detail {

            // Traits for extracting arg and return type of lambdas (for single
            // argument lambdas)
            template <typename L>
            struct UnaryLambdaTraits : UnaryLambdaTraits<decltype(&L::operator())> {};

            template <typename ClassT, typename ReturnT, typename... Args>
            struct UnaryLambdaTraits<ReturnT (ClassT::*)(Args...) const> {
                static const bool isValid = false;
            };

            template <typename ClassT, typename ReturnT, typename ArgT>
            struct UnaryLambdaTraits<ReturnT (ClassT::*)(ArgT) const> {
                static const bool isValid = true;
                using ArgType =
                    typename std::remove_const<typename std::remove_reference<ArgT>::type>::type;
                using ReturnType = ReturnT;
            };

            class TokenStream;

            // Transport for raw args (copied from main args, or supplied via
            // init list for testing)
            class Args {
                friend TokenStream;
                std::string m_exeName;
                std::vector<std::string> m_args;

            public:
                Args(int argc, char const* const* argv) :
                    m_exeName(argv[0]), m_args(argv + 1, argv + argc) {}

                Args(std::initializer_list<std::string> args) :
                    m_exeName(*args.begin()), m_args(args.begin() + 1, args.end()) {}

                auto exeName() const -> std::string { return m_exeName; }
            };

            // Wraps a token coming from a token stream. These may not directly
            // correspond to strings as a single string may encode an option +
            // its argument if the : or = form is used
            enum class TokenType { Option, Argument };
            struct Token {
                TokenType type;
                std::string token;
            };

            inline auto isOptPrefix(char c) -> bool {
                return c == '-'
#ifdef CATCH_PLATFORM_WINDOWS
                       || c == '/'
#endif
                    ;
            }

            // Abstracts iterators into args as a stream of tokens, with option
            // arguments uniformly handled
            class TokenStream {
                using Iterator = std::vector<std::string>::const_iterator;
                Iterator it;
                Iterator itEnd;
                std::vector<Token> m_tokenBuffer;

                void loadBuffer() {
                    m_tokenBuffer.resize(0);

                    // Skip any empty strings
                    while (it != itEnd && it->empty())
                        ++it;

                    if (it != itEnd) {
                        auto const& next = *it;
                        if (isOptPrefix(next[0])) {
                            auto delimiterPos = next.find_first_of(" :=");
                            if (delimiterPos != std::string::npos) {
                                m_tokenBuffer.push_back(
                                    {TokenType::Option, next.substr(0, delimiterPos)});
                                m_tokenBuffer.push_back(
                                    {TokenType::Argument, next.substr(delimiterPos + 1)});
                            } else {
                                if (next[1] != '-' && next.size() > 2) {
                                    std::string opt = "- ";
                                    for (size_t i = 1; i < next.size(); ++i) {
                                        opt[1] = next[i];
                                        m_tokenBuffer.push_back({TokenType::Option, opt});
                                    }
                                } else {
                                    m_tokenBuffer.push_back({TokenType::Option, next});
                                }
                            }
                        } else {
                            m_tokenBuffer.push_back({TokenType::Argument, next});
                        }
                    }
                }

            public:
                explicit TokenStream(Args const& args) :
                    TokenStream(args.m_args.begin(), args.m_args.end()) {}

                TokenStream(Iterator it, Iterator itEnd) : it(it), itEnd(itEnd) { loadBuffer(); }

                explicit operator bool() const { return !m_tokenBuffer.empty() || it != itEnd; }

                auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); }

                auto operator*() const -> Token {
                    assert(!m_tokenBuffer.empty());
                    return m_tokenBuffer.front();
                }

                auto operator->() const -> Token const* {
                    assert(!m_tokenBuffer.empty());
                    return &m_tokenBuffer.front();
                }

                auto operator++() -> TokenStream& {
                    if (m_tokenBuffer.size() >= 2) {
                        m_tokenBuffer.erase(m_tokenBuffer.begin());
                    } else {
                        if (it != itEnd)
                            ++it;
                        loadBuffer();
                    }
                    return *this;
                }
            };

            class ResultBase {
            public:
                enum Type { Ok, LogicError, RuntimeError };

            protected:
                ResultBase(Type type) : m_type(type) {}
                virtual ~ResultBase() = default;

                virtual void enforceOk() const = 0;

                Type m_type;
            };

            template <typename T> class ResultValueBase : public ResultBase {
            public:
                auto value() const -> T const& {
                    enforceOk();
                    return m_value;
                }

            protected:
                ResultValueBase(Type type) : ResultBase(type) {}

                ResultValueBase(ResultValueBase const& other) : ResultBase(other) {
                    if (m_type == ResultBase::Ok)
                        new (&m_value) T(other.m_value);
                }

                ResultValueBase(Type, T const& value) : ResultBase(Ok) { new (&m_value) T(value); }

                auto operator=(ResultValueBase const& other) -> ResultValueBase& {
                    if (m_type == ResultBase::Ok)
                        m_value.~T();
                    ResultBase::operator=(other);
                    if (m_type == ResultBase::Ok)
                        new (&m_value) T(other.m_value);
                    return *this;
                }

                ~ResultValueBase() override {
                    if (m_type == Ok)
                        m_value.~T();
                }

                union {
                    T m_value;
                };
            };

            template <> class ResultValueBase<void> : public ResultBase {
            protected:
                using ResultBase::ResultBase;
            };

            template <typename T = void> class BasicResult : public ResultValueBase<T> {
            public:
                template <typename U>
                explicit BasicResult(BasicResult<U> const& other) :
                    ResultValueBase<T>(other.type()), m_errorMessage(other.errorMessage()) {
                    assert(type() != ResultBase::Ok);
                }

                template <typename U> static auto ok(U const& value) -> BasicResult {
                    return {ResultBase::Ok, value};
                }
                static auto ok() -> BasicResult { return {ResultBase::Ok}; }
                static auto logicError(std::string const& message) -> BasicResult {
                    return {ResultBase::LogicError, message};
                }
                static auto runtimeError(std::string const& message) -> BasicResult {
                    return {ResultBase::RuntimeError, message};
                }

                explicit operator bool() const { return m_type == ResultBase::Ok; }
                auto type() const -> ResultBase::Type { return m_type; }
                auto errorMessage() const -> std::string { return m_errorMessage; }

            protected:
                void enforceOk() const override {

                    // Errors shouldn't reach this point, but if they do
                    // the actual error message will be in m_errorMessage
                    assert(m_type != ResultBase::LogicError);
                    assert(m_type != ResultBase::RuntimeError);
                    if (m_type != ResultBase::Ok)
                        std::abort();
                }

                std::string m_errorMessage; // Only populated if resultType is an error

                BasicResult(ResultBase::Type type, std::string const& message) :
                    ResultValueBase<T>(type), m_errorMessage(message) {
                    assert(m_type != ResultBase::Ok);
                }

                using ResultValueBase<T>::ResultValueBase;
                using ResultBase::m_type;
            };

            enum class ParseResultType { Matched, NoMatch, ShortCircuitAll, ShortCircuitSame };

            class ParseState {
            public:
                ParseState(ParseResultType type, TokenStream const& remainingTokens) :
                    m_type(type), m_remainingTokens(remainingTokens) {}

                auto type() const -> ParseResultType { return m_type; }
                auto remainingTokens() const -> TokenStream { return m_remainingTokens; }

            private:
                ParseResultType m_type;
                TokenStream m_remainingTokens;
            };

            using Result = BasicResult<void>;
            using ParserResult = BasicResult<ParseResultType>;
            using InternalParseResult = BasicResult<ParseState>;

            struct HelpColumns {
                std::string left;
                std::string right;
            };

            template <typename T>
            inline auto convertInto(std::string const& source, T& target) -> ParserResult {
                std::stringstream ss;
                ss << source;
                ss >> target;
                if (ss.fail())
                    return ParserResult::runtimeError("Unable to convert '" + source +
                                                      "' to destination type");
                else
                    return ParserResult::ok(ParseResultType::Matched);
            }
            inline auto convertInto(std::string const& source, std::string& target)
                -> ParserResult {
                target = source;
                return ParserResult::ok(ParseResultType::Matched);
            }
            inline auto convertInto(std::string const& source, bool& target) -> ParserResult {
                std::string srcLC = source;
                std::transform(srcLC.begin(), srcLC.end(), srcLC.begin(), [](unsigned char c) {
                    return static_cast<char>(std::tolower(c));
                });
                if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" ||
                    srcLC == "on")
                    target = true;
                else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" ||
                         srcLC == "off")
                    target = false;
                else
                    return ParserResult::runtimeError(
                        "Expected a boolean value but did not recognise: '" + source + "'");
                return ParserResult::ok(ParseResultType::Matched);
            }
#ifdef CLARA_CONFIG_OPTIONAL_TYPE
            template <typename T>
            inline auto convertInto(std::string const& source,
                                    CLARA_CONFIG_OPTIONAL_TYPE<T>& target) -> ParserResult {
                T temp;
                auto result = convertInto(source, temp);
                if (result)
                    target = std::move(temp);
                return result;
            }
#endif // CLARA_CONFIG_OPTIONAL_TYPE

            struct NonCopyable {
                NonCopyable() = default;
                NonCopyable(NonCopyable const&) = delete;
                NonCopyable(NonCopyable&&) = delete;
                NonCopyable& operator=(NonCopyable const&) = delete;
                NonCopyable& operator=(NonCopyable&&) = delete;
            };

            struct BoundRef : NonCopyable {
                virtual ~BoundRef() = default;
                virtual auto isContainer() const -> bool { return false; }
                virtual auto isFlag() const -> bool { return false; }
            };
            struct BoundValueRefBase : BoundRef {
                virtual auto setValue(std::string const& arg) -> ParserResult = 0;
            };
            struct BoundFlagRefBase : BoundRef {
                virtual auto setFlag(bool flag) -> ParserResult = 0;
                virtual auto isFlag() const -> bool { return true; }
            };

            template <typename T> struct BoundValueRef : BoundValueRefBase {
                T& m_ref;

                explicit BoundValueRef(T& ref) : m_ref(ref) {}

                auto setValue(std::string const& arg) -> ParserResult override {
                    return convertInto(arg, m_ref);
                }
            };

            template <typename T> struct BoundValueRef<std::vector<T>> : BoundValueRefBase {
                std::vector<T>& m_ref;

                explicit BoundValueRef(std::vector<T>& ref) : m_ref(ref) {}

                auto isContainer() const -> bool override { return true; }

                auto setValue(std::string const& arg) -> ParserResult override {
                    T temp;
                    auto result = convertInto(arg, temp);
                    if (result)
                        m_ref.push_back(temp);
                    return result;
                }
            };

            struct BoundFlagRef : BoundFlagRefBase {
                bool& m_ref;

                explicit BoundFlagRef(bool& ref) : m_ref(ref) {}

                auto setFlag(bool flag) -> ParserResult override {
                    m_ref = flag;
                    return ParserResult::ok(ParseResultType::Matched);
                }
            };

            template <typename ReturnType> struct LambdaInvoker {
                static_assert(std::is_same<ReturnType, ParserResult>::value,
                              "Lambda must return void or clara::ParserResult");

                template <typename L, typename ArgType>
                static auto invoke(L const& lambda, ArgType const& arg) -> ParserResult {
                    return lambda(arg);
                }
            };

            template <> struct LambdaInvoker<void> {
                template <typename L, typename ArgType>
                static auto invoke(L const& lambda, ArgType const& arg) -> ParserResult {
                    lambda(arg);
                    return ParserResult::ok(ParseResultType::Matched);
                }
            };

            template <typename ArgType, typename L>
            inline auto invokeLambda(L const& lambda, std::string const& arg) -> ParserResult {
                ArgType temp{};
                auto result = convertInto(arg, temp);
                return !result ? result
                               : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke(
                                     lambda, temp);
            }

            template <typename L> struct BoundLambda : BoundValueRefBase {
                L m_lambda;

                static_assert(UnaryLambdaTraits<L>::isValid,
                              "Supplied lambda must take exactly one argument");
                explicit BoundLambda(L const& lambda) : m_lambda(lambda) {}

                auto setValue(std::string const& arg) -> ParserResult override {
                    return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>(m_lambda, arg);
                }
            };

            template <typename L> struct BoundFlagLambda : BoundFlagRefBase {
                L m_lambda;

                static_assert(UnaryLambdaTraits<L>::isValid,
                              "Supplied lambda must take exactly one argument");
                static_assert(std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value,
                              "flags must be boolean");

                explicit BoundFlagLambda(L const& lambda) : m_lambda(lambda) {}

                auto setFlag(bool flag) -> ParserResult override {
                    return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke(
                        m_lambda, flag);
                }
            };

            enum class Optionality { Optional, Required };

            struct Parser;

            class ParserBase {
            public:
                virtual ~ParserBase() = default;
                virtual auto validate() const -> Result { return Result::ok(); }
                virtual auto parse(std::string const& exeName, TokenStream const& tokens) const
                    -> InternalParseResult = 0;
                virtual auto cardinality() const -> size_t { return 1; }

                auto parse(Args const& args) const -> InternalParseResult {
                    return parse(args.exeName(), TokenStream(args));
                }
            };

            template <typename DerivedT> class ComposableParserImpl : public ParserBase {
            public:
                template <typename T> auto operator|(T const& other) const -> Parser;

                template <typename T> auto operator+(T const& other) const -> Parser;
            };

            // Common code and state for Args and Opts
            template <typename DerivedT>
            class ParserRefImpl : public ComposableParserImpl<DerivedT> {
            protected:
                Optionality m_optionality = Optionality::Optional;
                std::shared_ptr<BoundRef> m_ref;
                std::string m_hint;
                std::string m_description;

                explicit ParserRefImpl(std::shared_ptr<BoundRef> const& ref) : m_ref(ref) {}

            public:
                template <typename T>
                ParserRefImpl(T& ref, std::string const& hint) :
                    m_ref(std::make_shared<BoundValueRef<T>>(ref)), m_hint(hint) {}

                template <typename LambdaT>
                ParserRefImpl(LambdaT const& ref, std::string const& hint) :
                    m_ref(std::make_shared<BoundLambda<LambdaT>>(ref)), m_hint(hint) {}

                auto operator()(std::string const& description) -> DerivedT& {
                    m_description = description;
                    return static_cast<DerivedT&>(*this);
                }

                auto optional() -> DerivedT& {
                    m_optionality = Optionality::Optional;
                    return static_cast<DerivedT&>(*this);
                };

                auto required() -> DerivedT& {
                    m_optionality = Optionality::Required;
                    return static_cast<DerivedT&>(*this);
                };

                auto isOptional() const -> bool { return m_optionality == Optionality::Optional; }

                auto cardinality() const -> size_t override {
                    if (m_ref->isContainer())
                        return 0;
                    else
                        return 1;
                }

                auto hint() const -> std::string { return m_hint; }
            };

            class ExeName : public ComposableParserImpl<ExeName> {
                std::shared_ptr<std::string> m_name;
                std::shared_ptr<BoundValueRefBase> m_ref;

                template <typename LambdaT>
                static auto makeRef(LambdaT const& lambda) -> std::shared_ptr<BoundValueRefBase> {
                    return std::make_shared<BoundLambda<LambdaT>>(lambda);
                }

            public:
                ExeName() : m_name(std::make_shared<std::string>("<executable>")) {}

                explicit ExeName(std::string& ref) : ExeName() {
                    m_ref = std::make_shared<BoundValueRef<std::string>>(ref);
                }

                template <typename LambdaT> explicit ExeName(LambdaT const& lambda) : ExeName() {
                    m_ref = std::make_shared<BoundLambda<LambdaT>>(lambda);
                }

                // The exe name is not parsed out of the normal tokens, but is
                // handled specially
                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    return InternalParseResult::ok(ParseState(ParseResultType::NoMatch, tokens));
                }

                auto name() const -> std::string { return *m_name; }
                auto set(std::string const& newName) -> ParserResult {

                    auto lastSlash = newName.find_last_of("\\/");
                    auto filename =
                        (lastSlash == std::string::npos) ? newName : newName.substr(lastSlash + 1);

                    *m_name = filename;
                    if (m_ref)
                        return m_ref->setValue(filename);
                    else
                        return ParserResult::ok(ParseResultType::Matched);
                }
            };

            class Arg : public ParserRefImpl<Arg> {
            public:
                using ParserRefImpl::ParserRefImpl;

                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    auto validationResult = validate();
                    if (!validationResult)
                        return InternalParseResult(validationResult);

                    auto remainingTokens = tokens;
                    auto const& token = *remainingTokens;
                    if (token.type != TokenType::Argument)
                        return InternalParseResult::ok(
                            ParseState(ParseResultType::NoMatch, remainingTokens));

                    assert(!m_ref->isFlag());
                    auto valueRef = static_cast<detail::BoundValueRefBase*>(m_ref.get());

                    auto result = valueRef->setValue(remainingTokens->token);
                    if (!result)
                        return InternalParseResult(result);
                    else
                        return InternalParseResult::ok(
                            ParseState(ParseResultType::Matched, ++remainingTokens));
                }
            };

            inline auto normaliseOpt(std::string const& optName) -> std::string {
#ifdef CATCH_PLATFORM_WINDOWS
                if (optName[0] == '/')
                    return "-" + optName.substr(1);
                else
#endif
                    return optName;
            }

            class Opt : public ParserRefImpl<Opt> {
            protected:
                std::vector<std::string> m_optNames;

            public:
                template <typename LambdaT>
                explicit Opt(LambdaT const& ref) :
                    ParserRefImpl(std::make_shared<BoundFlagLambda<LambdaT>>(ref)) {}

                explicit Opt(bool& ref) : ParserRefImpl(std::make_shared<BoundFlagRef>(ref)) {}

                template <typename LambdaT>
                Opt(LambdaT const& ref, std::string const& hint) : ParserRefImpl(ref, hint) {}

                template <typename T>
                Opt(T& ref, std::string const& hint) : ParserRefImpl(ref, hint) {}

                auto operator[](std::string const& optName) -> Opt& {
                    m_optNames.push_back(optName);
                    return *this;
                }

                auto getHelpColumns() const -> std::vector<HelpColumns> {
                    std::ostringstream oss;
                    bool first = true;
                    for (auto const& opt : m_optNames) {
                        if (first)
                            first = false;
                        else
                            oss << ", ";
                        oss << opt;
                    }
                    if (!m_hint.empty())
                        oss << " <" << m_hint << ">";
                    return {{oss.str(), m_description}};
                }

                auto isMatch(std::string const& optToken) const -> bool {
                    auto normalisedToken = normaliseOpt(optToken);
                    for (auto const& name : m_optNames) {
                        if (normaliseOpt(name) == normalisedToken)
                            return true;
                    }
                    return false;
                }

                using ParserBase::parse;

                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    auto validationResult = validate();
                    if (!validationResult)
                        return InternalParseResult(validationResult);

                    auto remainingTokens = tokens;
                    if (remainingTokens && remainingTokens->type == TokenType::Option) {
                        auto const& token = *remainingTokens;
                        if (isMatch(token.token)) {
                            if (m_ref->isFlag()) {
                                auto flagRef = static_cast<detail::BoundFlagRefBase*>(m_ref.get());
                                auto result = flagRef->setFlag(true);
                                if (!result)
                                    return InternalParseResult(result);
                                if (result.value() == ParseResultType::ShortCircuitAll)
                                    return InternalParseResult::ok(
                                        ParseState(result.value(), remainingTokens));
                            } else {
                                auto valueRef =
                                    static_cast<detail::BoundValueRefBase*>(m_ref.get());
                                ++remainingTokens;
                                if (!remainingTokens)
                                    return InternalParseResult::runtimeError(
                                        "Expected argument following " + token.token);
                                auto const& argToken = *remainingTokens;
                                if (argToken.type != TokenType::Argument)
                                    return InternalParseResult::runtimeError(
                                        "Expected argument following " + token.token);
                                auto result = valueRef->setValue(argToken.token);
                                if (!result)
                                    return InternalParseResult(result);
                                if (result.value() == ParseResultType::ShortCircuitAll)
                                    return InternalParseResult::ok(
                                        ParseState(result.value(), remainingTokens));
                            }
                            return InternalParseResult::ok(
                                ParseState(ParseResultType::Matched, ++remainingTokens));
                        }
                    }
                    return InternalParseResult::ok(
                        ParseState(ParseResultType::NoMatch, remainingTokens));
                }

                auto validate() const -> Result override {
                    if (m_optNames.empty())
                        return Result::logicError("No options supplied to Opt");
                    for (auto const& name : m_optNames) {
                        if (name.empty())
                            return Result::logicError("Option name cannot be empty");
#ifdef CATCH_PLATFORM_WINDOWS
                        if (name[0] != '-' && name[0] != '/')
                            return Result::logicError("Option name must begin with '-' or '/'");
#else
                        if (name[0] != '-')
                            return Result::logicError("Option name must begin with '-'");
#endif
                    }
                    return ParserRefImpl::validate();
                }
            };

            struct Help : Opt {
                Help(bool& showHelpFlag) :
                    Opt([&](bool flag) {
                        showHelpFlag = flag;
                        return ParserResult::ok(ParseResultType::ShortCircuitAll);
                    }) {
                    static_cast<Opt&> (*this)("display usage information")["-?"]["-h"]["--help"]
                        .optional();
                }
            };

            struct Parser : ParserBase {

                mutable ExeName m_exeName;
                std::vector<Opt> m_options;
                std::vector<Arg> m_args;

                auto operator|=(ExeName const& exeName) -> Parser& {
                    m_exeName = exeName;
                    return *this;
                }

                auto operator|=(Arg const& arg) -> Parser& {
                    m_args.push_back(arg);
                    return *this;
                }

                auto operator|=(Opt const& opt) -> Parser& {
                    m_options.push_back(opt);
                    return *this;
                }

                auto operator|=(Parser const& other) -> Parser& {
                    m_options.insert(
                        m_options.end(), other.m_options.begin(), other.m_options.end());
                    m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end());
                    return *this;
                }

                template <typename T> auto operator|(T const& other) const -> Parser {
                    return Parser(*this) |= other;
                }

                // Forward deprecated interface with '+' instead of '|'
                template <typename T> auto operator+=(T const& other) -> Parser& {
                    return operator|=(other);
                }
                template <typename T> auto operator+(T const& other) const -> Parser {
                    return operator|(other);
                }

                auto getHelpColumns() const -> std::vector<HelpColumns> {
                    std::vector<HelpColumns> cols;
                    for (auto const& o : m_options) {
                        auto childCols = o.getHelpColumns();
                        cols.insert(cols.end(), childCols.begin(), childCols.end());
                    }
                    return cols;
                }

                void writeToStream(std::ostream& os) const {
                    if (!m_exeName.name().empty()) {
                        os << "usage:\n"
                           << "  " << m_exeName.name() << " ";
                        bool required = true, first = true;
                        for (auto const& arg : m_args) {
                            if (first)
                                first = false;
                            else
                                os << " ";
                            if (arg.isOptional() && required) {
                                os << "[";
                                required = false;
                            }
                            os << "<" << arg.hint() << ">";
                            if (arg.cardinality() == 0)
                                os << " ... ";
                        }
                        if (!required)
                            os << "]";
                        if (!m_options.empty())
                            os << " options";
                        os << "\n\nwhere options are:" << std::endl;
                    }

                    auto rows = getHelpColumns();
                    size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH;
                    size_t optWidth = 0;
                    for (auto const& cols : rows)
                        optWidth = (std::max)(optWidth, cols.left.size() + 2);

                    optWidth = (std::min)(optWidth, consoleWidth / 2);

                    for (auto const& cols : rows) {
                        auto row = TextFlow::Column(cols.left).width(optWidth).indent(2) +
                                   TextFlow::Spacer(4) +
                                   TextFlow::Column(cols.right).width(consoleWidth - 7 - optWidth);
                        os << row << std::endl;
                    }
                }

                friend auto operator<<(std::ostream& os, Parser const& parser) -> std::ostream& {
                    parser.writeToStream(os);
                    return os;
                }

                auto validate() const -> Result override {
                    for (auto const& opt : m_options) {
                        auto result = opt.validate();
                        if (!result)
                            return result;
                    }
                    for (auto const& arg : m_args) {
                        auto result = arg.validate();
                        if (!result)
                            return result;
                    }
                    return Result::ok();
                }

                using ParserBase::parse;

                auto parse(std::string const& exeName, TokenStream const& tokens) const
                    -> InternalParseResult override {

                    struct ParserInfo {
                        ParserBase const* parser = nullptr;
                        size_t count = 0;
                    };
                    const size_t totalParsers = m_options.size() + m_args.size();
                    assert(totalParsers < 512);
                    // ParserInfo parseInfos[totalParsers]; // <-- this is what
                    // we really want to do
                    ParserInfo parseInfos[512];

                    {
                        size_t i = 0;
                        for (auto const& opt : m_options)
                            parseInfos[i++].parser = &opt;
                        for (auto const& arg : m_args)
                            parseInfos[i++].parser = &arg;
                    }

                    m_exeName.set(exeName);

                    auto result =
                        InternalParseResult::ok(ParseState(ParseResultType::NoMatch, tokens));
                    while (result.value().remainingTokens()) {
                        bool tokenParsed = false;

                        for (size_t i = 0; i < totalParsers; ++i) {
                            auto& parseInfo = parseInfos[i];
                            if (parseInfo.parser->cardinality() == 0 ||
                                parseInfo.count < parseInfo.parser->cardinality()) {
                                result = parseInfo.parser->parse(exeName,
                                                                 result.value().remainingTokens());
                                if (!result)
                                    return result;
                                if (result.value().type() != ParseResultType::NoMatch) {
                                    tokenParsed = true;
                                    ++parseInfo.count;
                                    break;
                                }
                            }
                        }

                        if (result.value().type() == ParseResultType::ShortCircuitAll)
                            return result;
                        if (!tokenParsed)
                            return InternalParseResult::runtimeError(
                                "Unrecognised token: " + result.value().remainingTokens()->token);
                    }
                    // !TBD Check missing required options
                    return result;
                }
            };

            template <typename DerivedT>
            template <typename T>
            auto ComposableParserImpl<DerivedT>::operator|(T const& other) const -> Parser {
                return Parser() | static_cast<DerivedT const&>(*this) | other;
            }
        } // namespace detail

        // A Combined parser
        using detail::Parser;

        // A parser for options
        using detail::Opt;

        // A parser for arguments
        using detail::Arg;

        // Wrapper for argc, argv from main()
        using detail::Args;

        // Specifies the name of the executable
        using detail::ExeName;

        // Convenience wrapper for option parser that specifies the help option
        using detail::Help;

        // enum of result types from a parse
        using detail::ParseResultType;

        // Result type for parser operation
        using detail::ParserResult;

    } // namespace clara
} // namespace Catch

// end clara.hpp
#ifdef __clang__
#pragma clang diagnostic pop
#endif

// Restore Clara's value for console width, if present
#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#endif

// end catch_clara.h
namespace Catch {

    clara::Parser makeCommandLineParser(ConfigData& config);

} // end namespace Catch

// end catch_commandline.h
#include <fstream>
#include <ctime>

namespace Catch {

    clara::Parser makeCommandLineParser(ConfigData& config) {

        using namespace clara;

        auto const setWarning = [&](std::string const& warning) {
            auto warningSet = [&]() {
                if (warning == "NoAssertions")
                    return WarnAbout::NoAssertions;

                if (warning == "NoTests")
                    return WarnAbout::NoTests;

                return WarnAbout::Nothing;
            }();

            if (warningSet == WarnAbout::Nothing)
                return ParserResult::runtimeError("Unrecognised warning: '" + warning + "'");
            config.warnings = static_cast<WarnAbout::What>(config.warnings | warningSet);
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const loadTestNamesFromFile = [&](std::string const& filename) {
            std::ifstream f(filename.c_str());
            if (!f.is_open())
                return ParserResult::runtimeError("Unable to load input file: '" + filename + "'");

            std::string line;
            while (std::getline(f, line)) {
                line = trim(line);
                if (!line.empty() && !startsWith(line, '#')) {
                    if (!startsWith(line, '"'))
                        line = '"' + line + '"';
                    config.testsOrTags.push_back(line);
                    config.testsOrTags.emplace_back(",");
                }
            }
            // Remove comma in the end
            if (!config.testsOrTags.empty())
                config.testsOrTags.erase(config.testsOrTags.end() - 1);

            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setTestOrder = [&](std::string const& order) {
            if (startsWith("declared", order))
                config.runOrder = RunTests::InDeclarationOrder;
            else if (startsWith("lexical", order))
                config.runOrder = RunTests::InLexicographicalOrder;
            else if (startsWith("random", order))
                config.runOrder = RunTests::InRandomOrder;
            else
                return clara::ParserResult::runtimeError("Unrecognised ordering: '" + order + "'");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setRngSeed = [&](std::string const& seed) {
            if (seed != "time")
                return clara::detail::convertInto(seed, config.rngSeed);
            config.rngSeed = static_cast<unsigned int>(std::time(nullptr));
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setColourUsage = [&](std::string const& useColour) {
            auto mode = toLower(useColour);

            if (mode == "yes")
                config.useColour = UseColour::Yes;
            else if (mode == "no")
                config.useColour = UseColour::No;
            else if (mode == "auto")
                config.useColour = UseColour::Auto;
            else
                return ParserResult::runtimeError("colour mode must be one of: auto, yes or no. '" +
                                                  useColour + "' not recognised");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setWaitForKeypress = [&](std::string const& keypress) {
            auto keypressLc = toLower(keypress);
            if (keypressLc == "never")
                config.waitForKeypress = WaitForKeypress::Never;
            else if (keypressLc == "start")
                config.waitForKeypress = WaitForKeypress::BeforeStart;
            else if (keypressLc == "exit")
                config.waitForKeypress = WaitForKeypress::BeforeExit;
            else if (keypressLc == "both")
                config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;
            else
                return ParserResult::runtimeError(
                    "keypress argument must be one of: never, start, exit or "
                    "both. '" +
                    keypress + "' not recognised");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setVerbosity = [&](std::string const& verbosity) {
            auto lcVerbosity = toLower(verbosity);
            if (lcVerbosity == "quiet")
                config.verbosity = Verbosity::Quiet;
            else if (lcVerbosity == "normal")
                config.verbosity = Verbosity::Normal;
            else if (lcVerbosity == "high")
                config.verbosity = Verbosity::High;
            else
                return ParserResult::runtimeError("Unrecognised verbosity, '" + verbosity + "'");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setReporter = [&](std::string const& reporter) {
            IReporterRegistry::FactoryMap const& factories =
                getRegistryHub().getReporterRegistry().getFactories();

            auto lcReporter = toLower(reporter);
            auto result = factories.find(lcReporter);

            if (factories.end() != result)
                config.reporterName = lcReporter;
            else
                return ParserResult::runtimeError("Unrecognized reporter, '" + reporter +
                                                  "'. Check available with --list-reporters");
            return ParserResult::ok(ParseResultType::Matched);
        };

        auto cli =
            ExeName(config.processName) | Help(config.showHelp) |
            Opt(config.listTests)["-l"]["--list-tests"]("list all/matching test cases") |
            Opt(config.listTags)["-t"]["--list-tags"]("list all/matching tags") |
            Opt(config.showSuccessfulTests)["-s"]["--success"](
                "include successful tests in output") |
            Opt(config.shouldDebugBreak)["-b"]["--break"]("break into debugger on failure") |
            Opt(config.noThrow)["-e"]["--nothrow"]("skip exception tests") |
            Opt(config.showInvisibles)["-i"]["--invisibles"]("show invisibles (tabs, newlines)") |
            Opt(config.outputFilename, "filename")["-o"]["--out"]("output filename") |
            Opt(setReporter, "name")["-r"]["--reporter"]("reporter to use (defaults to console)") |
            Opt(config.name, "name")["-n"]["--name"]("suite name") |
            Opt([&](bool) { config.abortAfter = 1; })["-a"]["--abort"]("abort at first failure") |
            Opt([&](int x) { config.abortAfter = x; },
                "no. failures")["-x"]["--abortx"]("abort after x failures") |
            Opt(setWarning, "warning name")["-w"]["--warn"]("enable warnings") |
            Opt(
                [&](bool flag) {
                    config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never;
                },
                "yes|no")["-d"]["--durations"]("show test durations") |
            Opt(config.minDuration, "seconds")["-D"]["--min-duration"](
                "show test durations for tests taking at least the given "
                "number of seconds") |
            Opt(loadTestNamesFromFile,
                "filename")["-f"]["--input-file"]("load test names to run from a file") |
            Opt(config.filenamesAsTags)["-#"]["--filenames-as-tags"](
                "adds a tag for the filename") |
            Opt(config.sectionsToRun, "section name")["-c"]["--section"]("specify section to run") |
            Opt(setVerbosity, "quiet|normal|high")["-v"]["--verbosity"]("set output verbosity") |
            Opt(config.listTestNamesOnly)["--list-test-names-only"](
                "list all/matching test cases names only") |
            Opt(config.listReporters)["--list-reporters"]("list all reporters") |
            Opt(setTestOrder, "decl|lex|rand")["--order"]("test case order (defaults to decl)") |
            Opt(setRngSeed,
                "'time'|number")["--rng-seed"]("set a specific seed for random numbers") |
            Opt(setColourUsage, "yes|no")["--use-colour"]("should output be colourised") |
            Opt(config.libIdentify)["--libidentify"](
                "report name and version according to libidentify standard") |
            Opt(setWaitForKeypress, "never|start|exit|both")["--wait-for-keypress"](
                "waits for a keypress before exiting") |
            Opt(config.benchmarkSamples,
                "samples")["--benchmark-samples"]("number of samples to collect (default: 100)") |
            Opt(config.benchmarkResamples, "resamples")["--benchmark-resamples"](
                "number of resamples for the bootstrap (default: 100000)") |
            Opt(config.benchmarkConfidenceInterval,
                "confidence interval")["--benchmark-confidence-interval"](
                "confidence interval for the bootstrap (between 0 and 1, "
                "default: 0.95)") |
            Opt(config.benchmarkNoAnalysis)["--benchmark-no-analysis"](
                "perform only measurements; do not perform any analysis") |
            Opt(config.benchmarkWarmupTime, "benchmarkWarmupTime")["--benchmark-warmup-time"](
                "amount of time in milliseconds spent on warming up each test "
                "(default: 100)") |
            Arg(config.testsOrTags, "test name|pattern|tags")("which test or tests to use");

        return cli;
    }

} // end namespace Catch
// end catch_commandline.cpp
// start catch_common.cpp

#include <cstring>
#include <ostream>

namespace Catch {

    bool SourceLineInfo::operator==(SourceLineInfo const& other) const noexcept {
        return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);
    }
    bool SourceLineInfo::operator<(SourceLineInfo const& other) const noexcept {
        // We can assume that the same file will usually have the same pointer.
        // Thus, if the pointers are the same, there is no point in calling the
        // strcmp
        return line < other.line ||
               (line == other.line && file != other.file && (std::strcmp(file, other.file) < 0));
    }

    std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info) {
#ifndef __GNUG__
        os << info.file << '(' << info.line << ')';
#else
        os << info.file << ':' << info.line;
#endif
        return os;
    }

    std::string StreamEndStop::operator+() const { return std::string(); }

    NonCopyable::NonCopyable() = default;
    NonCopyable::~NonCopyable() = default;

} // namespace Catch
// end catch_common.cpp
// start catch_config.cpp

namespace Catch {

    Config::Config(ConfigData const& data) : m_data(data), m_stream(openStream()) {
        // We need to trim filter specs to avoid trouble with superfluous
        // whitespace (esp. important for bdd macros, as those are manually
        // aligned with whitespace).

        for (auto& elem : m_data.testsOrTags) {
            elem = trim(elem);
        }
        for (auto& elem : m_data.sectionsToRun) {
            elem = trim(elem);
        }

        TestSpecParser parser(ITagAliasRegistry::get());
        if (!m_data.testsOrTags.empty()) {
            m_hasTestFilters = true;
            for (auto const& testOrTags : m_data.testsOrTags) {
                parser.parse(testOrTags);
            }
        }
        m_testSpec = parser.testSpec();
    }

    std::string const& Config::getFilename() const { return m_data.outputFilename; }

    bool Config::listTests() const { return m_data.listTests; }
    bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; }
    bool Config::listTags() const { return m_data.listTags; }
    bool Config::listReporters() const { return m_data.listReporters; }

    std::string Config::getProcessName() const { return m_data.processName; }
    std::string const& Config::getReporterName() const { return m_data.reporterName; }

    std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; }
    std::vector<std::string> const& Config::getSectionsToRun() const {
        return m_data.sectionsToRun;
    }

    TestSpec const& Config::testSpec() const { return m_testSpec; }
    bool Config::hasTestFilters() const { return m_hasTestFilters; }

    bool Config::showHelp() const { return m_data.showHelp; }

    // IConfig interface
    bool Config::allowThrows() const { return !m_data.noThrow; }
    std::ostream& Config::stream() const { return m_stream->stream(); }
    std::string Config::name() const {
        return m_data.name.empty() ? m_data.processName : m_data.name;
    }
    bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
    bool Config::warnAboutMissingAssertions() const {
        return !!(m_data.warnings & WarnAbout::NoAssertions);
    }
    bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); }
    ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }
    double Config::minDuration() const { return m_data.minDuration; }
    RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; }
    unsigned int Config::rngSeed() const { return m_data.rngSeed; }
    UseColour::YesOrNo Config::useColour() const { return m_data.useColour; }
    bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; }
    int Config::abortAfter() const { return m_data.abortAfter; }
    bool Config::showInvisibles() const { return m_data.showInvisibles; }
    Verbosity Config::verbosity() const { return m_data.verbosity; }

    bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; }
    int Config::benchmarkSamples() const { return m_data.benchmarkSamples; }
    double Config::benchmarkConfidenceInterval() const {
        return m_data.benchmarkConfidenceInterval;
    }
    unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; }
    std::chrono::milliseconds Config::benchmarkWarmupTime() const {
        return std::chrono::milliseconds(m_data.benchmarkWarmupTime);
    }

    IStream const* Config::openStream() { return Catch::makeStream(m_data.outputFilename); }

} // end namespace Catch
// end catch_config.cpp
// start catch_console_colour.cpp

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#endif

// start catch_errno_guard.h

namespace Catch {

    class ErrnoGuard {
    public:
        ErrnoGuard();
        ~ErrnoGuard();

    private:
        int m_oldErrno;
    };

} // namespace Catch

// end catch_errno_guard.h
// start catch_windows_h_proxy.h

#if defined(CATCH_PLATFORM_WINDOWS)

#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)
#define CATCH_DEFINED_NOMINMAX
#define NOMINMAX
#endif
#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)
#define CATCH_DEFINED_WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#ifdef __AFXDLL
#include <AfxWin.h>
#else
#include <windows.h>
#endif

#ifdef CATCH_DEFINED_NOMINMAX
#undef NOMINMAX
#endif
#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN
#undef WIN32_LEAN_AND_MEAN
#endif

#endif // defined(CATCH_PLATFORM_WINDOWS)

// end catch_windows_h_proxy.h
#include <sstream>

namespace Catch {
    namespace {

        struct IColourImpl {
            virtual ~IColourImpl() = default;
            virtual void use(Colour::Code _colourCode) = 0;
        };

        struct NoColourImpl : IColourImpl {
            void use(Colour::Code) override {}

            static IColourImpl* instance() {
                static NoColourImpl s_instance;
                return &s_instance;
            }
        };

    } // namespace
} // namespace Catch

#if !defined(CATCH_CONFIG_COLOUR_NONE) && !defined(CATCH_CONFIG_COLOUR_WINDOWS) &&                 \
    !defined(CATCH_CONFIG_COLOUR_ANSI)
#ifdef CATCH_PLATFORM_WINDOWS
#define CATCH_CONFIG_COLOUR_WINDOWS
#else
#define CATCH_CONFIG_COLOUR_ANSI
#endif
#endif

#if defined(CATCH_CONFIG_COLOUR_WINDOWS) /////////////////////////////////////////

namespace Catch {
    namespace {

        class Win32ColourImpl : public IColourImpl {
        public:
            Win32ColourImpl() : stdoutHandle(GetStdHandle(STD_OUTPUT_HANDLE)) {
                CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
                GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
                originalForegroundAttributes =
                    csbiInfo.wAttributes &
                    ~(BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
                originalBackgroundAttributes =
                    csbiInfo.wAttributes &
                    ~(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            }

            void use(Colour::Code _colourCode) override {
                switch (_colourCode) {
                    case Colour::None:
                        return setTextAttribute(originalForegroundAttributes);
                    case Colour::White:
                        return setTextAttribute(FOREGROUND_GREEN | FOREGROUND_RED |
                                                FOREGROUND_BLUE);
                    case Colour::Red:
                        return setTextAttribute(FOREGROUND_RED);
                    case Colour::Green:
                        return setTextAttribute(FOREGROUND_GREEN);
                    case Colour::Blue:
                        return setTextAttribute(FOREGROUND_BLUE);
                    case Colour::Cyan:
                        return setTextAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN);
                    case Colour::Yellow:
                        return setTextAttribute(FOREGROUND_RED | FOREGROUND_GREEN);
                    case Colour::Grey:
                        return setTextAttribute(0);

                    case Colour::LightGrey:
                        return setTextAttribute(FOREGROUND_INTENSITY);
                    case Colour::BrightRed:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_RED);
                    case Colour::BrightGreen:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN);
                    case Colour::BrightWhite:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN |
                                                FOREGROUND_RED | FOREGROUND_BLUE);
                    case Colour::BrightYellow:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_RED |
                                                FOREGROUND_GREEN);

                    case Colour::Bright:
                        CATCH_INTERNAL_ERROR("not a colour");

                    default:
                        CATCH_ERROR("Unknown colour requested");
                }
            }

        private:
            void setTextAttribute(WORD _textAttribute) {
                SetConsoleTextAttribute(stdoutHandle,
                                        _textAttribute | originalBackgroundAttributes);
            }
            HANDLE stdoutHandle;
            WORD originalForegroundAttributes;
            WORD originalBackgroundAttributes;
        };

        IColourImpl* platformColourInstance() {
            static Win32ColourImpl s_instance;

            IConfigPtr config = getCurrentContext().getConfig();
            UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto;
            if (colourMode == UseColour::Auto)
                colourMode = UseColour::Yes;
            return colourMode == UseColour::Yes ? &s_instance : NoColourImpl::instance();
        }

    } // namespace
} // end namespace Catch

#elif defined(CATCH_CONFIG_COLOUR_ANSI) //////////////////////////////////////

#include <unistd.h>

namespace Catch {
    namespace {

        // use POSIX/ ANSI console terminal codes
        // Thanks to Adam Strzelecki for original contribution
        // (http://github.com/nanoant)
        // https://github.com/philsquared/Catch/pull/131
        class PosixColourImpl : public IColourImpl {
        public:
            void use(Colour::Code _colourCode) override {
                switch (_colourCode) {
                    case Colour::None:
                    case Colour::White:
                        return setColour("[0m");
                    case Colour::Red:
                        return setColour("[0;31m");
                    case Colour::Green:
                        return setColour("[0;32m");
                    case Colour::Blue:
                        return setColour("[0;34m");
                    case Colour::Cyan:
                        return setColour("[0;36m");
                    case Colour::Yellow:
                        return setColour("[0;33m");
                    case Colour::Grey:
                        return setColour("[1;30m");

                    case Colour::LightGrey:
                        return setColour("[0;37m");
                    case Colour::BrightRed:
                        return setColour("[1;31m");
                    case Colour::BrightGreen:
                        return setColour("[1;32m");
                    case Colour::BrightWhite:
                        return setColour("[1;37m");
                    case Colour::BrightYellow:
                        return setColour("[1;33m");

                    case Colour::Bright:
                        CATCH_INTERNAL_ERROR("not a colour");
                    default:
                        CATCH_INTERNAL_ERROR("Unknown colour requested");
                }
            }
            static IColourImpl* instance() {
                static PosixColourImpl s_instance;
                return &s_instance;
            }

        private:
            void setColour(const char* _escapeCode) {
                getCurrentContext().getConfig()->stream() << '\033' << _escapeCode;
            }
        };

        bool useColourOnPlatform() {
            return
#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
                !isDebuggerActive() &&
#endif
#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))
                isatty(STDOUT_FILENO)
#else
                false
#endif
                    ;
        }
        IColourImpl* platformColourInstance() {
            ErrnoGuard guard;
            IConfigPtr config = getCurrentContext().getConfig();
            UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto;
            if (colourMode == UseColour::Auto)
                colourMode = useColourOnPlatform() ? UseColour::Yes : UseColour::No;
            return colourMode == UseColour::Yes ? PosixColourImpl::instance()
                                                : NoColourImpl::instance();
        }

    } // namespace
} // end namespace Catch

#else // not Windows or ANSI ///////////////////////////////////////////////

namespace Catch {

    static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }

} // end namespace Catch

#endif // Windows/ ANSI/ None

namespace Catch {

    Colour::Colour(Code _colourCode) { use(_colourCode); }
    Colour::Colour(Colour&& other) noexcept {
        m_moved = other.m_moved;
        other.m_moved = true;
    }
    Colour& Colour::operator=(Colour&& other) noexcept {
        m_moved = other.m_moved;
        other.m_moved = true;
        return *this;
    }

    Colour::~Colour() {
        if (!m_moved)
            use(None);
    }

    void Colour::use(Code _colourCode) {
        static IColourImpl* impl = platformColourInstance();
        // Strictly speaking, this cannot possibly happen.
        // However, under some conditions it does happen (see #1626),
        // and this change is small enough that we can let practicality
        // triumph over purity in this case.
        if (impl != nullptr) {
            impl->use(_colourCode);
        }
    }

    std::ostream& operator<<(std::ostream& os, Colour const&) { return os; }

} // end namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

// end catch_console_colour.cpp
// start catch_context.cpp

namespace Catch {

    class Context : public IMutableContext, NonCopyable {

    public: // IContext
        IResultCapture* getResultCapture() override { return m_resultCapture; }
        IRunner* getRunner() override { return m_runner; }

        IConfigPtr const& getConfig() const override { return m_config; }

        ~Context() override;

    public: // IMutableContext
        void setResultCapture(IResultCapture* resultCapture) override {
            m_resultCapture = resultCapture;
        }
        void setRunner(IRunner* runner) override { m_runner = runner; }
        void setConfig(IConfigPtr const& config) override { m_config = config; }

        friend IMutableContext& getCurrentMutableContext();

    private:
        IConfigPtr m_config;
        IRunner* m_runner = nullptr;
        IResultCapture* m_resultCapture = nullptr;
    };

    IMutableContext* IMutableContext::currentContext = nullptr;

    void IMutableContext::createContext() { currentContext = new Context(); }

    void cleanUpContext() {
        delete IMutableContext::currentContext;
        IMutableContext::currentContext = nullptr;
    }
    IContext::~IContext() = default;
    IMutableContext::~IMutableContext() = default;
    Context::~Context() = default;

    SimplePcg32& rng() {
        static SimplePcg32 s_rng;
        return s_rng;
    }

} // namespace Catch
// end catch_context.cpp
// start catch_debug_console.cpp

// start catch_debug_console.h

#include <string>

namespace Catch {
    void writeToDebugConsole(std::string const& text);
}

// end catch_debug_console.h
#if defined(CATCH_CONFIG_ANDROID_LOGWRITE)
#include <android/log.h>

namespace Catch {
    void writeToDebugConsole(std::string const& text) {
        __android_log_write(ANDROID_LOG_DEBUG, "Catch", text.c_str());
    }
} // namespace Catch

#elif defined(CATCH_PLATFORM_WINDOWS)

namespace Catch {
    void writeToDebugConsole(std::string const& text) { ::OutputDebugStringA(text.c_str()); }
} // namespace Catch

#else

namespace Catch {
    void writeToDebugConsole(std::string const& text) {
        // !TBD: Need a version for Mac/ XCode and other IDEs
        Catch::cout() << text;
    }
} // namespace Catch

#endif // Platform
// end catch_debug_console.cpp
// start catch_debugger.cpp

#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)

#include <cassert>
#include <sys/types.h>
#include <unistd.h>
#include <cstddef>
#include <ostream>

#ifdef __apple_build_version__
// These headers will only compile with AppleClang (XCode)
// For other compilers (Clang, GCC, ... ) we need to exclude them
#include <sys/sysctl.h>
#endif

namespace Catch {
#ifdef __apple_build_version__
    // The following function is taken directly from the following technical
    // note: https://developer.apple.com/library/archive/qa/qa1361/_index.html

    // Returns true if the current process is being debugged (either
    // running under the debugger or has a debugger attached post facto).
    bool isDebuggerActive() {
        int mib[4];
        struct kinfo_proc info;
        std::size_t size;

        // Initialize the flags so that, if sysctl fails for some bizarre
        // reason, we get a predictable result.

        info.kp_proc.p_flag = 0;

        // Initialize mib, which tells sysctl the info we want, in this case
        // we're looking for information about a specific process ID.

        mib[0] = CTL_KERN;
        mib[1] = KERN_PROC;
        mib[2] = KERN_PROC_PID;
        mib[3] = getpid();

        // Call sysctl.

        size = sizeof(info);
        if (sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0) {
            Catch::cerr() << "\n** Call to sysctl failed - unable to determine "
                             "if debugger is active **\n"
                          << std::endl;
            return false;
        }

        // We're being debugged if the P_TRACED flag is set.

        return ((info.kp_proc.p_flag & P_TRACED) != 0);
    }
#else
    bool isDebuggerActive() {
        // We need to find another way to determine this for non-appleclang
        // compilers on macOS
        return false;
    }
#endif
} // namespace Catch

#elif defined(CATCH_PLATFORM_LINUX)
#include <fstream>
#include <string>

namespace Catch {
    // The standard POSIX way of detecting a debugger is to attempt to
    // ptrace() the process, but this needs to be done from a child and not
    // this process itself to still allow attaching to this process later
    // if wanted, so is rather heavy. Under Linux we have the PID of the
    // "debugger" (which doesn't need to be gdb, of course, it could also
    // be strace, for example) in /proc/$PID/status, so just get it from
    // there instead.
    bool isDebuggerActive() {
        // Libstdc++ has a bug, where std::ifstream sets errno to 0
        // This way our users can properly assert over errno values
        ErrnoGuard guard;
        std::ifstream in("/proc/self/status");
        for (std::string line; std::getline(in, line);) {
            static const int PREFIX_LEN = 11;
            if (line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0) {
                // We're traced if the PID is not 0 and no other PID starts
                // with 0 digit, so it's enough to check for just a single
                // character.
                return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
            }
        }

        return false;
    }
} // namespace Catch
#elif defined(_MSC_VER)
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
namespace Catch {
    bool isDebuggerActive() { return IsDebuggerPresent() != 0; }
} // namespace Catch
#elif defined(__MINGW32__)
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
namespace Catch {
    bool isDebuggerActive() { return IsDebuggerPresent() != 0; }
} // namespace Catch
#else
namespace Catch {
    bool isDebuggerActive() { return false; }
} // namespace Catch
#endif // Platform
// end catch_debugger.cpp
// start catch_decomposer.cpp

namespace Catch {

    ITransientExpression::~ITransientExpression() = default;

    void formatReconstructedExpression(std::ostream& os,
                                       std::string const& lhs,
                                       StringRef op,
                                       std::string const& rhs) {
        if (lhs.size() + rhs.size() < 40 && lhs.find('\n') == std::string::npos &&
            rhs.find('\n') == std::string::npos)
            os << lhs << " " << op << " " << rhs;
        else
            os << lhs << "\n" << op << "\n" << rhs;
    }
} // namespace Catch
// end catch_decomposer.cpp
// start catch_enforce.cpp

#include <stdexcept>

namespace Catch {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) &&                                                    \
    !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER)
    [[noreturn]] void throw_exception(std::exception const& e) {
        Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n"
                      << "The message was: " << e.what() << '\n';
        std::terminate();
    }
#endif

    [[noreturn]] void throw_logic_error(std::string const& msg) {
        throw_exception(std::logic_error(msg));
    }

    [[noreturn]] void throw_domain_error(std::string const& msg) {
        throw_exception(std::domain_error(msg));
    }

    [[noreturn]] void throw_runtime_error(std::string const& msg) {
        throw_exception(std::runtime_error(msg));
    }

} // namespace Catch
// end catch_enforce.cpp
// start catch_enum_values_registry.cpp
// start catch_enum_values_registry.h

#include <vector>
#include <memory>

namespace Catch {

    namespace Detail {

        std::unique_ptr<EnumInfo>
        makeEnumInfo(StringRef enumName, StringRef allValueNames, std::vector<int> const& values);

        class EnumValuesRegistry : public IMutableEnumValuesRegistry {

            std::vector<std::unique_ptr<EnumInfo>> m_enumInfos;

            EnumInfo const& registerEnum(StringRef enumName,
                                         StringRef allEnums,
                                         std::vector<int> const& values) override;
        };

        std::vector<StringRef> parseEnums(StringRef enums);

    } // namespace Detail

} // namespace Catch

// end catch_enum_values_registry.h

#include <map>
#include <cassert>

namespace Catch {

    IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}

    namespace Detail {

        namespace {
            // Extracts the actual name part of an enum instance
            // In other words, it returns the Blue part of
            // Bikeshed::Colour::Blue
            StringRef extractInstanceName(StringRef enumInstance) {
                // Find last occurrence of ":"
                size_t name_start = enumInstance.size();
                while (name_start > 0 && enumInstance[name_start - 1] != ':') {
                    --name_start;
                }
                return enumInstance.substr(name_start, enumInstance.size() - name_start);
            }
        } // namespace

        std::vector<StringRef> parseEnums(StringRef enums) {
            auto enumValues = splitStringRef(enums, ',');
            std::vector<StringRef> parsed;
            parsed.reserve(enumValues.size());
            for (auto const& enumValue : enumValues) {
                parsed.push_back(trim(extractInstanceName(enumValue)));
            }
            return parsed;
        }

        EnumInfo::~EnumInfo() {}

        StringRef EnumInfo::lookup(int value) const {
            for (auto const& valueToName : m_values) {
                if (valueToName.first == value)
                    return valueToName.second;
            }
            return "{** unexpected enum value **}"_sr;
        }

        std::unique_ptr<EnumInfo>
        makeEnumInfo(StringRef enumName, StringRef allValueNames, std::vector<int> const& values) {
            std::unique_ptr<EnumInfo> enumInfo(new EnumInfo);
            enumInfo->m_name = enumName;
            enumInfo->m_values.reserve(values.size());

            const auto valueNames = Catch::Detail::parseEnums(allValueNames);
            assert(valueNames.size() == values.size());
            std::size_t i = 0;
            for (auto value : values)
                enumInfo->m_values.emplace_back(value, valueNames[i++]);

            return enumInfo;
        }

        EnumInfo const& EnumValuesRegistry::registerEnum(StringRef enumName,
                                                         StringRef allValueNames,
                                                         std::vector<int> const& values) {
            m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));
            return *m_enumInfos.back();
        }

    } // namespace Detail
} // namespace Catch

// end catch_enum_values_registry.cpp
// start catch_errno_guard.cpp

#include <cerrno>

namespace Catch {
    ErrnoGuard::ErrnoGuard() : m_oldErrno(errno) {}
    ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; }
} // namespace Catch
// end catch_errno_guard.cpp
// start catch_exception_translator_registry.cpp

// start catch_exception_translator_registry.h

#include <vector>
#include <string>
#include <memory>

namespace Catch {

    class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
    public:
        ~ExceptionTranslatorRegistry();
        virtual void registerTranslator(const IExceptionTranslator* translator);
        std::string translateActiveException() const override;
        std::string tryTranslators() const;

    private:
        std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators;
    };
} // namespace Catch

// end catch_exception_translator_registry.h
#ifdef __OBJC__
#import "Foundation/Foundation.h"
#endif

namespace Catch {

    ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {}

    void ExceptionTranslatorRegistry::registerTranslator(const IExceptionTranslator* translator) {
        m_translators.push_back(std::unique_ptr<const IExceptionTranslator>(translator));
    }

#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    std::string ExceptionTranslatorRegistry::translateActiveException() const {
        try {
#ifdef __OBJC__
            // In Objective-C try objective-c exceptions first
            @try
            {
                return tryTranslators();
            } @catch (NSException* exception)
            {
                return Catch::Detail::stringify([exception description]);
            }
#else
            // Compiling a mixed mode project with MSVC means that CLR
            // exceptions will be caught in (...) as well. However, these
            // do not fill-in std::current_exception and thus lead to crash
            // when attempting rethrow.
            // /EHa switch also causes structured exceptions to be caught
            // here, but they fill-in current_exception properly, so
            // at worst the output should be a little weird, instead of
            // causing a crash.
            if (std::current_exception() == nullptr) {
                return "Non C++ exception. Possibly a CLR exception.";
            }
            return tryTranslators();
#endif
        } catch (TestFailureException&) {
            std::rethrow_exception(std::current_exception());
        } catch (std::exception& ex) {
            return ex.what();
        } catch (std::string& msg) {
            return msg;
        } catch (const char* msg) {
            return msg;
        } catch (...) {
            return "Unknown exception";
        }
    }

    std::string ExceptionTranslatorRegistry::tryTranslators() const {
        if (m_translators.empty()) {
            std::rethrow_exception(std::current_exception());
        } else {
            return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());
        }
    }

#else // ^^ Exceptions are enabled // Exceptions are disabled vv
    std::string ExceptionTranslatorRegistry::translateActiveException() const {
        CATCH_INTERNAL_ERROR("Attempted to translate active exception under "
                             "CATCH_CONFIG_DISABLE_EXCEPTIONS!");
    }

    std::string ExceptionTranslatorRegistry::tryTranslators() const {
        CATCH_INTERNAL_ERROR("Attempted to use exception translators under "
                             "CATCH_CONFIG_DISABLE_EXCEPTIONS!");
    }
#endif

} // namespace Catch
// end catch_exception_translator_registry.cpp
// start catch_fatal_condition.cpp

#include <algorithm>

#if !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_POSIX_SIGNALS)

namespace Catch {

    // If neither SEH nor signal handling is required, the handler impls
    // do not have to do anything, and can be empty.
    void FatalConditionHandler::engage_platform() {}
    void FatalConditionHandler::disengage_platform() {}
    FatalConditionHandler::FatalConditionHandler() = default;
    FatalConditionHandler::~FatalConditionHandler() = default;

} // end namespace Catch

#endif // !CATCH_CONFIG_WINDOWS_SEH && !CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH) && defined(CATCH_CONFIG_POSIX_SIGNALS)
#error                                                                                             \
    "Inconsistent configuration: Windows' SEH handling and POSIX signals cannot be enabled at the same time"
#endif // CATCH_CONFIG_WINDOWS_SEH && CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH) || defined(CATCH_CONFIG_POSIX_SIGNALS)

namespace {
    //! Signals fatal error message to the run context
    void reportFatal(char const* const message) {
        Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition(message);
    }

    //! Minimal size Catch2 needs for its own fatal error handling.
    //! Picked anecdotally, so it might not be sufficient on all
    //! platforms, and for all configurations.
    constexpr std::size_t minStackSizeForErrors = 32 * 1024;
} // end unnamed namespace

#endif // CATCH_CONFIG_WINDOWS_SEH || CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH)

namespace Catch {

    struct SignalDefs {
        DWORD id;
        const char* name;
    };

    // There is no 1-1 mapping between signals and windows exceptions.
    // Windows can easily distinguish between SO and SigSegV,
    // but SigInt, SigTerm, etc are handled differently.
    static SignalDefs signalDefs[] = {
        {static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal"},
        {static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow"},
        {static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal"},
        {static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error"},
    };

    static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
        for (auto const& def : signalDefs) {
            if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {
                reportFatal(def.name);
            }
        }
        // If its not an exception we care about, pass it along.
        // This stops us from eating debugger breaks etc.
        return EXCEPTION_CONTINUE_SEARCH;
    }

    // Since we do not support multiple instantiations, we put these
    // into global variables and rely on cleaning them up in outlined
    // constructors/destructors
    static PVOID exceptionHandlerHandle = nullptr;

    // For MSVC, we reserve part of the stack memory for handling
    // memory overflow structured exception.
    FatalConditionHandler::FatalConditionHandler() {
        ULONG guaranteeSize = static_cast<ULONG>(minStackSizeForErrors);
        if (!SetThreadStackGuarantee(&guaranteeSize)) {
            // We do not want to fully error out, because needing
            // the stack reserve should be rare enough anyway.
            Catch::cerr() << "Failed to reserve piece of stack."
                          << " Stack overflows will not be reported successfully.";
        }
    }

    // We do not attempt to unset the stack guarantee, because
    // Windows does not support lowering the stack size guarantee.
    FatalConditionHandler::~FatalConditionHandler() = default;

    void FatalConditionHandler::engage_platform() {
        // Register as first handler in current chain
        exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
        if (!exceptionHandlerHandle) {
            CATCH_RUNTIME_ERROR("Could not register vectored exception handler");
        }
    }

    void FatalConditionHandler::disengage_platform() {
        if (!RemoveVectoredExceptionHandler(exceptionHandlerHandle)) {
            CATCH_RUNTIME_ERROR("Could not unregister vectored exception handler");
        }
        exceptionHandlerHandle = nullptr;
    }

} // end namespace Catch

#endif // CATCH_CONFIG_WINDOWS_SEH

#if defined(CATCH_CONFIG_POSIX_SIGNALS)

#include <signal.h>

namespace Catch {

    struct SignalDefs {
        int id;
        const char* name;
    };

    static SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
                                      {SIGILL, "SIGILL - Illegal instruction signal"},
                                      {SIGFPE, "SIGFPE - Floating point error signal"},
                                      {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
                                      {SIGTERM, "SIGTERM - Termination request signal"},
                                      {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};

// Older GCCs trigger -Wmissing-field-initializers for T foo = {}
// which is zero initialization, but not explicit. We want to avoid
// that.
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif

    static char* altStackMem = nullptr;
    static std::size_t altStackSize = 0;
    static stack_t oldSigStack{};
    static struct sigaction oldSigActions[sizeof(signalDefs) / sizeof(SignalDefs)]{};

    static void restorePreviousSignalHandlers() {
        // We set signal handlers back to the previous ones. Hopefully
        // nobody overwrote them in the meantime, and doesn't expect
        // their signal handlers to live past ours given that they
        // installed them after ours..
        for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
            sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
        }
        // Return the old stack
        sigaltstack(&oldSigStack, nullptr);
    }

    static void handleSignal(int sig) {
        char const* name = "<unknown signal>";
        for (auto const& def : signalDefs) {
            if (sig == def.id) {
                name = def.name;
                break;
            }
        }
        // We need to restore previous signal handlers and let them do
        // their thing, so that the users can have the debugger break
        // when a signal is raised, and so on.
        restorePreviousSignalHandlers();
        reportFatal(name);
        raise(sig);
    }

    FatalConditionHandler::FatalConditionHandler() {
        assert(!altStackMem && "Cannot initialize POSIX signal handler when one already exists");
        if (altStackSize == 0) {
            altStackSize = std::max(static_cast<size_t>(SIGSTKSZ), minStackSizeForErrors);
        }
        altStackMem = new char[altStackSize]();
    }

    FatalConditionHandler::~FatalConditionHandler() {
        delete[] altStackMem;
        // We signal that another instance can be constructed by zeroing
        // out the pointer.
        altStackMem = nullptr;
    }

    void FatalConditionHandler::engage_platform() {
        stack_t sigStack;
        sigStack.ss_sp = altStackMem;
        sigStack.ss_size = altStackSize;
        sigStack.ss_flags = 0;
        sigaltstack(&sigStack, &oldSigStack);
        struct sigaction sa = {};

        sa.sa_handler = handleSignal;
        sa.sa_flags = SA_ONSTACK;
        for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
            sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
        }
    }

#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif

    void FatalConditionHandler::disengage_platform() { restorePreviousSignalHandlers(); }

} // end namespace Catch

#endif // CATCH_CONFIG_POSIX_SIGNALS
// end catch_fatal_condition.cpp
// start catch_generators.cpp

#include <limits>
#include <set>

namespace Catch {

    IGeneratorTracker::~IGeneratorTracker() {}

    const char* GeneratorException::what() const noexcept { return m_msg; }

    namespace Generators {

        GeneratorUntypedBase::~GeneratorUntypedBase() {}

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& {
            return getResultCapture().acquireGeneratorTracker(generatorName, lineInfo);
        }

    } // namespace Generators
} // namespace Catch
// end catch_generators.cpp
// start catch_interfaces_capture.cpp

namespace Catch {
    IResultCapture::~IResultCapture() = default;
}
// end catch_interfaces_capture.cpp
// start catch_interfaces_config.cpp

namespace Catch {
    IConfig::~IConfig() = default;
}
// end catch_interfaces_config.cpp
// start catch_interfaces_exception.cpp

namespace Catch {
    IExceptionTranslator::~IExceptionTranslator() = default;
    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default;
} // namespace Catch
// end catch_interfaces_exception.cpp
// start catch_interfaces_registry_hub.cpp

namespace Catch {
    IRegistryHub::~IRegistryHub() = default;
    IMutableRegistryHub::~IMutableRegistryHub() = default;
} // namespace Catch
// end catch_interfaces_registry_hub.cpp
// start catch_interfaces_reporter.cpp

// start catch_reporter_listening.h

namespace Catch {

    class ListeningReporter : public IStreamingReporter {
        using Reporters = std::vector<IStreamingReporterPtr>;
        Reporters m_listeners;
        IStreamingReporterPtr m_reporter = nullptr;
        ReporterPreferences m_preferences;

    public:
        ListeningReporter();

        void addListener(IStreamingReporterPtr&& listener);
        void addReporter(IStreamingReporterPtr&& reporter);

    public: // IStreamingReporter
        ReporterPreferences getPreferences() const override;

        void noMatchingTestCases(std::string const& spec) override;

        void reportInvalidArguments(std::string const& arg) override;

        static std::set<Verbosity> getSupportedVerbosities();

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& benchmarkInfo) override;
        void benchmarkEnded(BenchmarkStats<> const& benchmarkStats) override;
        void benchmarkFailed(std::string const&) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void testRunStarting(TestRunInfo const& testRunInfo) override;
        void testGroupStarting(GroupInfo const& groupInfo) override;
        void testCaseStarting(TestCaseInfo const& testInfo) override;
        void sectionStarting(SectionInfo const& sectionInfo) override;
        void assertionStarting(AssertionInfo const& assertionInfo) override;

        // The return value indicates if the messages buffer should be cleared:
        bool assertionEnded(AssertionStats const& assertionStats) override;
        void sectionEnded(SectionStats const& sectionStats) override;
        void testCaseEnded(TestCaseStats const& testCaseStats) override;
        void testGroupEnded(TestGroupStats const& testGroupStats) override;
        void testRunEnded(TestRunStats const& testRunStats) override;

        void skipTest(TestCaseInfo const& testInfo) override;
        bool isMulti() const override;
    };

} // end namespace Catch

// end catch_reporter_listening.h
namespace Catch {

    ReporterConfig::ReporterConfig(IConfigPtr const& _fullConfig) :
        m_stream(&_fullConfig->stream()), m_fullConfig(_fullConfig) {}

    ReporterConfig::ReporterConfig(IConfigPtr const& _fullConfig, std::ostream& _stream) :
        m_stream(&_stream), m_fullConfig(_fullConfig) {}

    std::ostream& ReporterConfig::stream() const { return *m_stream; }
    IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; }

    TestRunInfo::TestRunInfo(std::string const& _name) : name(_name) {}

    GroupInfo::GroupInfo(std::string const& _name,
                         std::size_t _groupIndex,
                         std::size_t _groupsCount) :
        name(_name), groupIndex(_groupIndex), groupsCounts(_groupsCount) {}

    AssertionStats::AssertionStats(AssertionResult const& _assertionResult,
                                   std::vector<MessageInfo> const& _infoMessages,
                                   Totals const& _totals) :
        assertionResult(_assertionResult), infoMessages(_infoMessages), totals(_totals) {
        assertionResult.m_resultData.lazyExpression.m_transientExpression =
            _assertionResult.m_resultData.lazyExpression.m_transientExpression;

        if (assertionResult.hasMessage()) {
            // Copy message into messages list.
            // !TBD This should have been done earlier, somewhere
            MessageBuilder builder(assertionResult.getTestMacroName(),
                                   assertionResult.getSourceInfo(),
                                   assertionResult.getResultType());
            builder << assertionResult.getMessage();
            builder.m_info.message = builder.m_stream.str();

            infoMessages.push_back(builder.m_info);
        }
    }

    AssertionStats::~AssertionStats() = default;

    SectionStats::SectionStats(SectionInfo const& _sectionInfo,
                               Counts const& _assertions,
                               double _durationInSeconds,
                               bool _missingAssertions) :
        sectionInfo(_sectionInfo),
        assertions(_assertions),
        durationInSeconds(_durationInSeconds),
        missingAssertions(_missingAssertions) {}

    SectionStats::~SectionStats() = default;

    TestCaseStats::TestCaseStats(TestCaseInfo const& _testInfo,
                                 Totals const& _totals,
                                 std::string const& _stdOut,
                                 std::string const& _stdErr,
                                 bool _aborting) :
        testInfo(_testInfo),
        totals(_totals),
        stdOut(_stdOut),
        stdErr(_stdErr),
        aborting(_aborting) {}

    TestCaseStats::~TestCaseStats() = default;

    TestGroupStats::TestGroupStats(GroupInfo const& _groupInfo,
                                   Totals const& _totals,
                                   bool _aborting) :
        groupInfo(_groupInfo), totals(_totals), aborting(_aborting) {}

    TestGroupStats::TestGroupStats(GroupInfo const& _groupInfo) :
        groupInfo(_groupInfo), aborting(false) {}

    TestGroupStats::~TestGroupStats() = default;

    TestRunStats::TestRunStats(TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting) :
        runInfo(_runInfo), totals(_totals), aborting(_aborting) {}

    TestRunStats::~TestRunStats() = default;

    void IStreamingReporter::fatalErrorEncountered(StringRef) {}
    bool IStreamingReporter::isMulti() const { return false; }

    IReporterFactory::~IReporterFactory() = default;
    IReporterRegistry::~IReporterRegistry() = default;

} // end namespace Catch
// end catch_interfaces_reporter.cpp
// start catch_interfaces_runner.cpp

namespace Catch {
    IRunner::~IRunner() = default;
}
// end catch_interfaces_runner.cpp
// start catch_interfaces_testcase.cpp

namespace Catch {
    ITestInvoker::~ITestInvoker() = default;
    ITestCaseRegistry::~ITestCaseRegistry() = default;
} // namespace Catch
// end catch_interfaces_testcase.cpp
// start catch_leak_detector.cpp

#ifdef CATCH_CONFIG_WINDOWS_CRTDBG
#include <crtdbg.h>

namespace Catch {

    LeakDetector::LeakDetector() {
        int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
        flag |= _CRTDBG_LEAK_CHECK_DF;
        flag |= _CRTDBG_ALLOC_MEM_DF;
        _CrtSetDbgFlag(flag);
        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
        _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
        // Change this to leaking allocation's number to break there
        _CrtSetBreakAlloc(-1);
    }
} // namespace Catch

#else

Catch::LeakDetector::LeakDetector() {}

#endif

Catch::LeakDetector::~LeakDetector() { Catch::cleanUp(); }
// end catch_leak_detector.cpp
// start catch_list.cpp

// start catch_list.h

#include <set>

namespace Catch {

    std::size_t listTests(Config const& config);

    std::size_t listTestsNamesOnly(Config const& config);

    struct TagInfo {
        void add(std::string const& spelling);
        std::string all() const;

        std::set<std::string> spellings;
        std::size_t count = 0;
    };

    std::size_t listTags(Config const& config);

    std::size_t listReporters();

    Option<std::size_t> list(std::shared_ptr<Config> const& config);

} // end namespace Catch

// end catch_list.h
// start catch_text.h

namespace Catch {
    using namespace clara::TextFlow;
}

// end catch_text.h
#include <limits>
#include <algorithm>
#include <iomanip>

namespace Catch {

    std::size_t listTests(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        if (config.hasTestFilters())
            Catch::cout() << "Matching test cases:\n";
        else {
            Catch::cout() << "All available test cases:\n";
        }

        auto matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCaseInfo : matchedTestCases) {
            Colour::Code colour = testCaseInfo.isHidden() ? Colour::SecondaryText : Colour::None;
            Colour colourGuard(colour);

            Catch::cout() << Column(testCaseInfo.name).initialIndent(2).indent(4) << "\n";
            if (config.verbosity() >= Verbosity::High) {
                Catch::cout() << Column(Catch::Detail::stringify(testCaseInfo.lineInfo)).indent(4)
                              << std::endl;
                std::string description = testCaseInfo.description;
                if (description.empty())
                    description = "(NO DESCRIPTION)";
                Catch::cout() << Column(description).indent(4) << std::endl;
            }
            if (!testCaseInfo.tags.empty())
                Catch::cout() << Column(testCaseInfo.tagsAsString()).indent(6) << "\n";
        }

        if (!config.hasTestFilters())
            Catch::cout() << pluralise(matchedTestCases.size(), "test case") << '\n' << std::endl;
        else
            Catch::cout() << pluralise(matchedTestCases.size(), "matching test case") << '\n'
                          << std::endl;
        return matchedTestCases.size();
    }

    std::size_t listTestsNamesOnly(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        std::size_t matchedTests = 0;
        std::vector<TestCase> matchedTestCases =
            filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCaseInfo : matchedTestCases) {
            matchedTests++;
            if (startsWith(testCaseInfo.name, '#'))
                Catch::cout() << '"' << testCaseInfo.name << '"';
            else
                Catch::cout() << testCaseInfo.name;
            if (config.verbosity() >= Verbosity::High)
                Catch::cout() << "\t@" << testCaseInfo.lineInfo;
            Catch::cout() << std::endl;
        }
        return matchedTests;
    }

    void TagInfo::add(std::string const& spelling) {
        ++count;
        spellings.insert(spelling);
    }

    std::string TagInfo::all() const {
        size_t size = 0;
        for (auto const& spelling : spellings) {
            // Add 2 for the brackes
            size += spelling.size() + 2;
        }

        std::string out;
        out.reserve(size);
        for (auto const& spelling : spellings) {
            out += '[';
            out += spelling;
            out += ']';
        }
        return out;
    }

    std::size_t listTags(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        if (config.hasTestFilters())
            Catch::cout() << "Tags for matching test cases:\n";
        else {
            Catch::cout() << "All available tags:\n";
        }

        std::map<std::string, TagInfo> tagCounts;

        std::vector<TestCase> matchedTestCases =
            filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCase : matchedTestCases) {
            for (auto const& tagName : testCase.getTestCaseInfo().tags) {
                std::string lcaseTagName = toLower(tagName);
                auto countIt = tagCounts.find(lcaseTagName);
                if (countIt == tagCounts.end())
                    countIt = tagCounts.insert(std::make_pair(lcaseTagName, TagInfo())).first;
                countIt->second.add(tagName);
            }
        }

        for (auto const& tagCount : tagCounts) {
            ReusableStringStream rss;
            rss << "  " << std::setw(2) << tagCount.second.count << "  ";
            auto str = rss.str();
            auto wrapper = Column(tagCount.second.all())
                               .initialIndent(0)
                               .indent(str.size())
                               .width(CATCH_CONFIG_CONSOLE_WIDTH - 10);
            Catch::cout() << str << wrapper << '\n';
        }
        Catch::cout() << pluralise(tagCounts.size(), "tag") << '\n' << std::endl;
        return tagCounts.size();
    }

    std::size_t listReporters() {
        Catch::cout() << "Available reporters:\n";
        IReporterRegistry::FactoryMap const& factories =
            getRegistryHub().getReporterRegistry().getFactories();
        std::size_t maxNameLen = 0;
        for (auto const& factoryKvp : factories)
            maxNameLen = (std::max)(maxNameLen, factoryKvp.first.size());

        for (auto const& factoryKvp : factories) {
            Catch::cout() << Column(factoryKvp.first + ":").indent(2).width(5 + maxNameLen) +
                                 Column(factoryKvp.second->getDescription())
                                     .initialIndent(0)
                                     .indent(2)
                                     .width(CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen - 8)
                          << "\n";
        }
        Catch::cout() << std::endl;
        return factories.size();
    }

    Option<std::size_t> list(std::shared_ptr<Config> const& config) {
        Option<std::size_t> listedCount;
        getCurrentMutableContext().setConfig(config);
        if (config->listTests())
            listedCount = listedCount.valueOr(0) + listTests(*config);
        if (config->listTestNamesOnly())
            listedCount = listedCount.valueOr(0) + listTestsNamesOnly(*config);
        if (config->listTags())
            listedCount = listedCount.valueOr(0) + listTags(*config);
        if (config->listReporters())
            listedCount = listedCount.valueOr(0) + listReporters();
        return listedCount;
    }

} // end namespace Catch
// end catch_list.cpp
// start catch_matchers.cpp

namespace Catch {
    namespace Matchers {
        namespace Impl {

            std::string MatcherUntypedBase::toString() const {
                if (m_cachedToString.empty())
                    m_cachedToString = describe();
                return m_cachedToString;
            }

            MatcherUntypedBase::~MatcherUntypedBase() = default;

        } // namespace Impl
    }     // namespace Matchers

    using namespace Matchers;
    using Matchers::Impl::MatcherBase;

} // namespace Catch
// end catch_matchers.cpp
// start catch_matchers_exception.cpp

namespace Catch {
    namespace Matchers {
        namespace Exception {

            bool ExceptionMessageMatcher::match(std::exception const& ex) const {
                return ex.what() == m_message;
            }

            std::string ExceptionMessageMatcher::describe() const {
                return "exception message matches \"" + m_message + "\"";
            }

        } // namespace Exception
        Exception::ExceptionMessageMatcher Message(std::string const& message) {
            return Exception::ExceptionMessageMatcher(message);
        }

        // namespace Exception
    } // namespace Matchers
} // namespace Catch
// end catch_matchers_exception.cpp
// start catch_matchers_floating.cpp

// start catch_polyfills.hpp

namespace Catch {
    bool isnan(float f);
    bool isnan(double d);
} // namespace Catch

// end catch_polyfills.hpp
// start catch_to_string.hpp

#include <string>

namespace Catch {
    template <typename T> std::string to_string(T const& t) {
#if defined(CATCH_CONFIG_CPP11_TO_STRING)
        return std::to_string(t);
#else
        ReusableStringStream rss;
        rss << t;
        return rss.str();
#endif
    }
} // end namespace Catch

// end catch_to_string.hpp
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <sstream>
#include <type_traits>
#include <iomanip>
#include <limits>

namespace Catch {
    namespace {

        int32_t convert(float f) {
            static_assert(sizeof(float) == sizeof(int32_t),
                          "Important ULP matcher assumption violated");
            int32_t i;
            std::memcpy(&i, &f, sizeof(f));
            return i;
        }

        int64_t convert(double d) {
            static_assert(sizeof(double) == sizeof(int64_t),
                          "Important ULP matcher assumption violated");
            int64_t i;
            std::memcpy(&i, &d, sizeof(d));
            return i;
        }

        template <typename FP> bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) {
            // Comparison with NaN should always be false.
            // This way we can rule it out before getting into the ugly details
            if (Catch::isnan(lhs) || Catch::isnan(rhs)) {
                return false;
            }

            auto lc = convert(lhs);
            auto rc = convert(rhs);

            if ((lc < 0) != (rc < 0)) {
                // Potentially we can have +0 and -0
                return lhs == rhs;
            }

            // static cast as a workaround for IBM XLC
            auto ulpDiff = std::abs(static_cast<FP>(lc - rc));
            return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff;
        }

#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)

        float nextafter(float x, float y) { return ::nextafterf(x, y); }

        double nextafter(double x, double y) { return ::nextafter(x, y); }

#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^

        template <typename FP> FP step(FP start, FP direction, uint64_t steps) {
            for (uint64_t i = 0; i < steps; ++i) {
#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
                start = Catch::nextafter(start, direction);
#else
                start = std::nextafter(start, direction);
#endif
            }
            return start;
        }

        // Performs equivalent check of std::fabs(lhs - rhs) <= margin
        // But without the subtraction to allow for INFINITY in comparison
        bool marginComparison(double lhs, double rhs, double margin) {
            return (lhs + margin >= rhs) && (rhs + margin >= lhs);
        }

        template <typename FloatingPoint> void write(std::ostream& out, FloatingPoint num) {
            out << std::scientific
                << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1) << num;
        }

    } // end anonymous namespace

    namespace Matchers {
        namespace Floating {

            enum class FloatingPointKind : uint8_t { Float, Double };

            WithinAbsMatcher::WithinAbsMatcher(double target, double margin) :
                m_target{target}, m_margin{margin} {
                CATCH_ENFORCE(margin >= 0,
                              "Invalid margin: " << margin << '.'
                                                 << " Margin has to be non-negative.");
            }

            // Performs equivalent check of std::fabs(lhs - rhs) <= margin
            // But without the subtraction to allow for INFINITY in comparison
            bool WithinAbsMatcher::match(double const& matchee) const {
                return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee);
            }

            std::string WithinAbsMatcher::describe() const {
                return "is within " + ::Catch::Detail::stringify(m_margin) + " of " +
                       ::Catch::Detail::stringify(m_target);
            }

            WithinUlpsMatcher::WithinUlpsMatcher(double target,
                                                 uint64_t ulps,
                                                 FloatingPointKind baseType) :
                m_target{target}, m_ulps{ulps}, m_type{baseType} {
                CATCH_ENFORCE(m_type == FloatingPointKind::Double ||
                                  m_ulps < (std::numeric_limits<uint32_t>::max)(),
                              "Provided ULP is impossibly large for a float comparison.");
            }

#if defined(__clang__)
#pragma clang diagnostic push
// Clang <3.5 reports on the default branch in the switch below
#pragma clang diagnostic ignored "-Wunreachable-code"
#endif

            bool WithinUlpsMatcher::match(double const& matchee) const {
                switch (m_type) {
                    case FloatingPointKind::Float:
                        return almostEqualUlps<float>(
                            static_cast<float>(matchee), static_cast<float>(m_target), m_ulps);
                    case FloatingPointKind::Double:
                        return almostEqualUlps<double>(matchee, m_target, m_ulps);
                    default:
                        CATCH_INTERNAL_ERROR("Unknown FloatingPointKind value");
                }
            }

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

            std::string WithinUlpsMatcher::describe() const {
                std::stringstream ret;

                ret << "is within " << m_ulps << " ULPs of ";

                if (m_type == FloatingPointKind::Float) {
                    write(ret, static_cast<float>(m_target));
                    ret << 'f';
                } else {
                    write(ret, m_target);
                }

                ret << " ([";
                if (m_type == FloatingPointKind::Double) {
                    write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps));
                    ret << ", ";
                    write(ret, step(m_target, static_cast<double>(INFINITY), m_ulps));
                } else {
                    // We have to cast INFINITY to float because of MinGW, see
                    // #1782
                    write(
                        ret,
                        step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps));
                    ret << ", ";
                    write(ret,
                          step(static_cast<float>(m_target), static_cast<float>(INFINITY), m_ulps));
                }
                ret << "])";

                return ret.str();
            }

            WithinRelMatcher::WithinRelMatcher(double target, double epsilon) :
                m_target(target), m_epsilon(epsilon) {
                CATCH_ENFORCE(m_epsilon >= 0.,
                              "Relative comparison with epsilon <  0 does not "
                              "make sense.");
                CATCH_ENFORCE(m_epsilon < 1.,
                              "Relative comparison with epsilon >= 1 does not "
                              "make sense.");
            }

            bool WithinRelMatcher::match(double const& matchee) const {
                const auto relMargin =
                    m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target));
                return marginComparison(matchee, m_target, std::isinf(relMargin) ? 0 : relMargin);
            }

            std::string WithinRelMatcher::describe() const {
                Catch::ReusableStringStream sstr;
                sstr << "and " << m_target << " are within " << m_epsilon * 100.
                     << "% of each other";
                return sstr.str();
            }

        } // namespace Floating

        Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) {
            return Floating::WithinUlpsMatcher(
                target, maxUlpDiff, Floating::FloatingPointKind::Double);
        }

        Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) {
            return Floating::WithinUlpsMatcher(
                target, maxUlpDiff, Floating::FloatingPointKind::Float);
        }

        Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
            return Floating::WithinAbsMatcher(target, margin);
        }

        Floating::WithinRelMatcher WithinRel(double target, double eps) {
            return Floating::WithinRelMatcher(target, eps);
        }

        Floating::WithinRelMatcher WithinRel(double target) {
            return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100);
        }

        Floating::WithinRelMatcher WithinRel(float target, float eps) {
            return Floating::WithinRelMatcher(target, eps);
        }

        Floating::WithinRelMatcher WithinRel(float target) {
            return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100);
        }

    } // namespace Matchers
} // namespace Catch
// end catch_matchers_floating.cpp
// start catch_matchers_generic.cpp

std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) {
    if (desc.empty()) {
        return "matches undescribed predicate";
    } else {
        return "matches predicate: \"" + desc + '"';
    }
}
// end catch_matchers_generic.cpp
// start catch_matchers_string.cpp

#include <regex>

namespace Catch {
    namespace Matchers {

        namespace StdString {

            CasedString::CasedString(std::string const& str,
                                     CaseSensitive::Choice caseSensitivity) :
                m_caseSensitivity(caseSensitivity), m_str(adjustString(str)) {}
            std::string CasedString::adjustString(std::string const& str) const {
                return m_caseSensitivity == CaseSensitive::No ? toLower(str) : str;
            }
            std::string CasedString::caseSensitivitySuffix() const {
                return m_caseSensitivity == CaseSensitive::No ? " (case insensitive)"
                                                              : std::string();
            }

            StringMatcherBase::StringMatcherBase(std::string const& operation,
                                                 CasedString const& comparator) :
                m_comparator(comparator), m_operation(operation) {}

            std::string StringMatcherBase::describe() const {
                std::string description;
                description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +
                                    m_comparator.caseSensitivitySuffix().size());
                description += m_operation;
                description += ": \"";
                description += m_comparator.m_str;
                description += "\"";
                description += m_comparator.caseSensitivitySuffix();
                return description;
            }

            EqualsMatcher::EqualsMatcher(CasedString const& comparator) :
                StringMatcherBase("equals", comparator) {}

            bool EqualsMatcher::match(std::string const& source) const {
                return m_comparator.adjustString(source) == m_comparator.m_str;
            }

            ContainsMatcher::ContainsMatcher(CasedString const& comparator) :
                StringMatcherBase("contains", comparator) {}

            bool ContainsMatcher::match(std::string const& source) const {
                return contains(m_comparator.adjustString(source), m_comparator.m_str);
            }

            StartsWithMatcher::StartsWithMatcher(CasedString const& comparator) :
                StringMatcherBase("starts with", comparator) {}

            bool StartsWithMatcher::match(std::string const& source) const {
                return startsWith(m_comparator.adjustString(source), m_comparator.m_str);
            }

            EndsWithMatcher::EndsWithMatcher(CasedString const& comparator) :
                StringMatcherBase("ends with", comparator) {}

            bool EndsWithMatcher::match(std::string const& source) const {
                return endsWith(m_comparator.adjustString(source), m_comparator.m_str);
            }

            RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity) :
                m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {}

            bool RegexMatcher::match(std::string const& matchee) const {
                auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax
                                                     // option anyway
                if (m_caseSensitivity == CaseSensitive::Choice::No) {
                    flags |= std::regex::icase;
                }
                auto reg = std::regex(m_regex, flags);
                return std::regex_match(matchee, reg);
            }

            std::string RegexMatcher::describe() const {
                return "matches " + ::Catch::Detail::stringify(m_regex) +
                       ((m_caseSensitivity == CaseSensitive::Choice::Yes) ? " case sensitively"
                                                                          : " case insensitively");
            }

        } // namespace StdString

        StdString::EqualsMatcher Equals(std::string const& str,
                                        CaseSensitive::Choice caseSensitivity) {
            return StdString::EqualsMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::ContainsMatcher Contains(std::string const& str,
                                            CaseSensitive::Choice caseSensitivity) {
            return StdString::ContainsMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::EndsWithMatcher EndsWith(std::string const& str,
                                            CaseSensitive::Choice caseSensitivity) {
            return StdString::EndsWithMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::StartsWithMatcher StartsWith(std::string const& str,
                                                CaseSensitive::Choice caseSensitivity) {
            return StdString::StartsWithMatcher(StdString::CasedString(str, caseSensitivity));
        }

        StdString::RegexMatcher Matches(std::string const& regex,
                                        CaseSensitive::Choice caseSensitivity) {
            return StdString::RegexMatcher(regex, caseSensitivity);
        }

    } // namespace Matchers
} // namespace Catch
// end catch_matchers_string.cpp
// start catch_message.cpp

// start catch_uncaught_exceptions.h

namespace Catch {
    bool uncaught_exceptions();
} // end namespace Catch

// end catch_uncaught_exceptions.h
#include <cassert>
#include <stack>

namespace Catch {

    MessageInfo::MessageInfo(StringRef const& _macroName,
                             SourceLineInfo const& _lineInfo,
                             ResultWas::OfType _type) :
        macroName(_macroName), lineInfo(_lineInfo), type(_type), sequence(++globalCount) {}

    bool MessageInfo::operator==(MessageInfo const& other) const {
        return sequence == other.sequence;
    }

    bool MessageInfo::operator<(MessageInfo const& other) const {
        return sequence < other.sequence;
    }

    // This may need protecting if threading support is added
    unsigned int MessageInfo::globalCount = 0;

    ////////////////////////////////////////////////////////////////////////////

    Catch::MessageBuilder::MessageBuilder(StringRef const& macroName,
                                          SourceLineInfo const& lineInfo,
                                          ResultWas::OfType type) :
        m_info(macroName, lineInfo, type) {}

    ////////////////////////////////////////////////////////////////////////////

    ScopedMessage::ScopedMessage(MessageBuilder const& builder) :
        m_info(builder.m_info), m_moved() {
        m_info.message = builder.m_stream.str();
        getResultCapture().pushScopedMessage(m_info);
    }

    ScopedMessage::ScopedMessage(ScopedMessage&& old) : m_info(old.m_info), m_moved() {
        old.m_moved = true;
    }

    ScopedMessage::~ScopedMessage() {
        if (!uncaught_exceptions() && !m_moved) {
            getResultCapture().popScopedMessage(m_info);
        }
    }

    Capturer::Capturer(StringRef macroName,
                       SourceLineInfo const& lineInfo,
                       ResultWas::OfType resultType,
                       StringRef names) {
        auto trimmed = [&](size_t start, size_t end) {
            while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
                ++start;
            }
            while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {
                --end;
            }
            return names.substr(start, end - start + 1);
        };
        auto skipq = [&](size_t start, char quote) {
            for (auto i = start + 1; i < names.size(); ++i) {
                if (names[i] == quote)
                    return i;
                if (names[i] == '\\')
                    ++i;
            }
            CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote");
        };

        size_t start = 0;
        std::stack<char> openings;
        for (size_t pos = 0; pos < names.size(); ++pos) {
            char c = names[pos];
            switch (c) {
                case '[':
                case '{':
                case '(':
                    // It is basically impossible to disambiguate between
                    // comparison and start of template args in this context
                    //            case '<':
                    openings.push(c);
                    break;
                case ']':
                case '}':
                case ')':
                    //           case '>':
                    openings.pop();
                    break;
                case '"':
                case '\'':
                    pos = skipq(pos, c);
                    break;
                case ',':
                    if (start != pos && openings.empty()) {
                        m_messages.emplace_back(macroName, lineInfo, resultType);
                        m_messages.back().message = static_cast<std::string>(trimmed(start, pos));
                        m_messages.back().message += " := ";
                        start = pos;
                    }
            }
        }
        assert(openings.empty() && "Mismatched openings");
        m_messages.emplace_back(macroName, lineInfo, resultType);
        m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
        m_messages.back().message += " := ";
    }
    Capturer::~Capturer() {
        if (!uncaught_exceptions()) {
            assert(m_captured == m_messages.size());
            for (size_t i = 0; i < m_captured; ++i)
                m_resultCapture.popScopedMessage(m_messages[i]);
        }
    }

    void Capturer::captureValue(size_t index, std::string const& value) {
        assert(index < m_messages.size());
        m_messages[index].message += value;
        m_resultCapture.pushScopedMessage(m_messages[index]);
        m_captured++;
    }

} // end namespace Catch
// end catch_message.cpp
// start catch_output_redirect.cpp

// start catch_output_redirect.h
#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H

#include <cstdio>
#include <iosfwd>
#include <string>

namespace Catch {

    class RedirectedStream {
        std::ostream& m_originalStream;
        std::ostream& m_redirectionStream;
        std::streambuf* m_prevBuf;

    public:
        RedirectedStream(std::ostream& originalStream, std::ostream& redirectionStream);
        ~RedirectedStream();
    };

    class RedirectedStdOut {
        ReusableStringStream m_rss;
        RedirectedStream m_cout;

    public:
        RedirectedStdOut();
        auto str() const -> std::string;
    };

    // StdErr has two constituent streams in C++, std::cerr and std::clog
    // This means that we need to redirect 2 streams into 1 to keep proper
    // order of writes
    class RedirectedStdErr {
        ReusableStringStream m_rss;
        RedirectedStream m_cerr;
        RedirectedStream m_clog;

    public:
        RedirectedStdErr();
        auto str() const -> std::string;
    };

    class RedirectedStreams {
    public:
        RedirectedStreams(RedirectedStreams const&) = delete;
        RedirectedStreams& operator=(RedirectedStreams const&) = delete;
        RedirectedStreams(RedirectedStreams&&) = delete;
        RedirectedStreams& operator=(RedirectedStreams&&) = delete;

        RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr);
        ~RedirectedStreams();

    private:
        std::string& m_redirectedCout;
        std::string& m_redirectedCerr;
        RedirectedStdOut m_redirectedStdOut;
        RedirectedStdErr m_redirectedStdErr;
    };

#if defined(CATCH_CONFIG_NEW_CAPTURE)

    // Windows's implementation of std::tmpfile is terrible (it tries
    // to create a file inside system folder, thus requiring elevated
    // privileges for the binary), so we have to use tmpnam(_s) and
    // create the file ourselves there.
    class TempFile {
    public:
        TempFile(TempFile const&) = delete;
        TempFile& operator=(TempFile const&) = delete;
        TempFile(TempFile&&) = delete;
        TempFile& operator=(TempFile&&) = delete;

        TempFile();
        ~TempFile();

        std::FILE* getFile();
        std::string getContents();

    private:
        std::FILE* m_file = nullptr;
#if defined(_MSC_VER)
        char m_buffer[L_tmpnam] = {0};
#endif
    };

    class OutputRedirect {
    public:
        OutputRedirect(OutputRedirect const&) = delete;
        OutputRedirect& operator=(OutputRedirect const&) = delete;
        OutputRedirect(OutputRedirect&&) = delete;
        OutputRedirect& operator=(OutputRedirect&&) = delete;

        OutputRedirect(std::string& stdout_dest, std::string& stderr_dest);
        ~OutputRedirect();

    private:
        int m_originalStdout = -1;
        int m_originalStderr = -1;
        TempFile m_stdoutFile;
        TempFile m_stderrFile;
        std::string& m_stdoutDest;
        std::string& m_stderrDest;
    };

#endif

} // end namespace Catch

#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
// end catch_output_redirect.h
#include <cstdio>
#include <cstring>
#include <fstream>
#include <sstream>
#include <stdexcept>

#if defined(CATCH_CONFIG_NEW_CAPTURE)
#if defined(_MSC_VER)
#include <io.h> //_dup and _dup2
#define dup _dup
#define dup2 _dup2
#define fileno _fileno
#else
#include <unistd.h> // dup and dup2
#endif
#endif

namespace Catch {

    RedirectedStream::RedirectedStream(std::ostream& originalStream,
                                       std::ostream& redirectionStream) :
        m_originalStream(originalStream),
        m_redirectionStream(redirectionStream),
        m_prevBuf(m_originalStream.rdbuf()) {
        m_originalStream.rdbuf(m_redirectionStream.rdbuf());
    }

    RedirectedStream::~RedirectedStream() { m_originalStream.rdbuf(m_prevBuf); }

    RedirectedStdOut::RedirectedStdOut() : m_cout(Catch::cout(), m_rss.get()) {}
    auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); }

    RedirectedStdErr::RedirectedStdErr() :
        m_cerr(Catch::cerr(), m_rss.get()), m_clog(Catch::clog(), m_rss.get()) {}
    auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); }

    RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr) :
        m_redirectedCout(redirectedCout), m_redirectedCerr(redirectedCerr) {}

    RedirectedStreams::~RedirectedStreams() {
        m_redirectedCout += m_redirectedStdOut.str();
        m_redirectedCerr += m_redirectedStdErr.str();
    }

#if defined(CATCH_CONFIG_NEW_CAPTURE)

#if defined(_MSC_VER)
    TempFile::TempFile() {
        if (tmpnam_s(m_buffer)) {
            CATCH_RUNTIME_ERROR("Could not get a temp filename");
        }
        if (fopen_s(&m_file, m_buffer, "w+")) {
            char buffer[100];
            if (strerror_s(buffer, errno)) {
                CATCH_RUNTIME_ERROR("Could not translate errno to a string");
            }
            CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer
                                                                  << "' because: " << buffer);
        }
    }
#else
    TempFile::TempFile() {
        m_file = std::tmpfile();
        if (!m_file) {
            CATCH_RUNTIME_ERROR("Could not create a temp file.");
        }
    }

#endif

    TempFile::~TempFile() {
        // TBD: What to do about errors here?
        std::fclose(m_file);
        // We manually create the file on Windows only, on Linux
        // it will be autodeleted
#if defined(_MSC_VER)
        std::remove(m_buffer);
#endif
    }

    FILE* TempFile::getFile() { return m_file; }

    std::string TempFile::getContents() {
        std::stringstream sstr;
        char buffer[100] = {};
        std::rewind(m_file);
        while (std::fgets(buffer, sizeof(buffer), m_file)) {
            sstr << buffer;
        }
        return sstr.str();
    }

    OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) :
        m_originalStdout(dup(1)),
        m_originalStderr(dup(2)),
        m_stdoutDest(stdout_dest),
        m_stderrDest(stderr_dest) {
        dup2(fileno(m_stdoutFile.getFile()), 1);
        dup2(fileno(m_stderrFile.getFile()), 2);
    }

    OutputRedirect::~OutputRedirect() {
        Catch::cout() << std::flush;
        fflush(stdout);
        // Since we support overriding these streams, we flush cerr
        // even though std::cerr is unbuffered
        Catch::cerr() << std::flush;
        Catch::clog() << std::flush;
        fflush(stderr);

        dup2(m_originalStdout, 1);
        dup2(m_originalStderr, 2);

        m_stdoutDest += m_stdoutFile.getContents();
        m_stderrDest += m_stderrFile.getContents();
    }

#endif // CATCH_CONFIG_NEW_CAPTURE

} // namespace Catch

#if defined(CATCH_CONFIG_NEW_CAPTURE)
#if defined(_MSC_VER)
#undef dup
#undef dup2
#undef fileno
#endif
#endif
// end catch_output_redirect.cpp
// start catch_polyfills.cpp

#include <cmath>

namespace Catch {

#if !defined(CATCH_CONFIG_POLYFILL_ISNAN)
    bool isnan(float f) { return std::isnan(f); }
    bool isnan(double d) { return std::isnan(d); }
#else
    // For now we only use this for embarcadero
    bool isnan(float f) { return std::_isnan(f); }
    bool isnan(double d) { return std::_isnan(d); }
#endif

} // end namespace Catch
// end catch_polyfills.cpp
// start catch_random_number_generator.cpp

namespace Catch {

    namespace {

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4146) // we negate uint32 during the rotate
#endif
        // Safe rotr implementation thanks to John Regehr
        uint32_t rotate_right(uint32_t val, uint32_t count) {
            const uint32_t mask = 31;
            count &= mask;
            return (val >> count) | (val << (-count & mask));
        }

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

    } // namespace

    SimplePcg32::SimplePcg32(result_type seed_) { seed(seed_); }

    void SimplePcg32::seed(result_type seed_) {
        m_state = 0;
        (*this)();
        m_state += seed_;
        (*this)();
    }

    void SimplePcg32::discard(uint64_t skip) {
        // We could implement this to run in O(log n) steps, but this
        // should suffice for our use case.
        for (uint64_t s = 0; s < skip; ++s) {
            static_cast<void>((*this)());
        }
    }

    SimplePcg32::result_type SimplePcg32::operator()() {
        // prepare the output value
        const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
        const auto output = rotate_right(xorshifted, m_state >> 59u);

        // advance state
        m_state = m_state * 6364136223846793005ULL + s_inc;

        return output;
    }

    bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
        return lhs.m_state == rhs.m_state;
    }

    bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
        return lhs.m_state != rhs.m_state;
    }
} // namespace Catch
// end catch_random_number_generator.cpp
// start catch_registry_hub.cpp

// start catch_test_case_registry_impl.h

#include <vector>
#include <set>
#include <algorithm>
#include <ios>

namespace Catch {

    class TestCase;
    struct IConfig;

    std::vector<TestCase> sortTests(IConfig const& config,
                                    std::vector<TestCase> const& unsortedTestCases);

    bool isThrowSafe(TestCase const& testCase, IConfig const& config);
    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config);

    void enforceNoDuplicateTestCases(std::vector<TestCase> const& functions);

    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config);
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config);

    class TestRegistry : public ITestCaseRegistry {
    public:
        virtual ~TestRegistry() = default;

        virtual void registerTest(TestCase const& testCase);

        std::vector<TestCase> const& getAllTests() const override;
        std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const override;

    private:
        std::vector<TestCase> m_functions;
        mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;
        mutable std::vector<TestCase> m_sortedFunctions;
        std::size_t m_unnamedCount = 0;
        std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
    };

    ///////////////////////////////////////////////////////////////////////////

    class TestInvokerAsFunction : public ITestInvoker {
        void (*m_testAsFunction)();

    public:
        TestInvokerAsFunction(void (*testAsFunction)()) noexcept;

        void invoke() const override;
    };

    std::string extractClassName(StringRef const& classOrQualifiedMethodName);

    ///////////////////////////////////////////////////////////////////////////

} // end namespace Catch

// end catch_test_case_registry_impl.h
// start catch_reporter_registry.h

#include <map>

namespace Catch {

    class ReporterRegistry : public IReporterRegistry {

    public:
        ~ReporterRegistry() override;

        IStreamingReporterPtr create(std::string const& name,
                                     IConfigPtr const& config) const override;

        void registerReporter(std::string const& name, IReporterFactoryPtr const& factory);
        void registerListener(IReporterFactoryPtr const& factory);

        FactoryMap const& getFactories() const override;
        Listeners const& getListeners() const override;

    private:
        FactoryMap m_factories;
        Listeners m_listeners;
    };
} // namespace Catch

// end catch_reporter_registry.h
// start catch_tag_alias_registry.h

// start catch_tag_alias.h

#include <string>

namespace Catch {

    struct TagAlias {
        TagAlias(std::string const& _tag, SourceLineInfo _lineInfo);

        std::string tag;
        SourceLineInfo lineInfo;
    };

} // end namespace Catch

// end catch_tag_alias.h
#include <map>

namespace Catch {

    class TagAliasRegistry : public ITagAliasRegistry {
    public:
        ~TagAliasRegistry() override;
        TagAlias const* find(std::string const& alias) const override;
        std::string expandAliases(std::string const& unexpandedTestSpec) const override;
        void add(std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo);

    private:
        std::map<std::string, TagAlias> m_registry;
    };

} // end namespace Catch

// end catch_tag_alias_registry.h
// start catch_startup_exception_registry.h

#include <vector>
#include <exception>

namespace Catch {

    class StartupExceptionRegistry {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    public:
        void add(std::exception_ptr const& exception) noexcept;
        std::vector<std::exception_ptr> const& getExceptions() const noexcept;

    private:
        std::vector<std::exception_ptr> m_exceptions;
#endif
    };

} // end namespace Catch

// end catch_startup_exception_registry.h
// start catch_singletons.hpp

namespace Catch {

    struct ISingleton {
        virtual ~ISingleton();
    };

    void addSingleton(ISingleton* singleton);
    void cleanupSingletons();

    template <typename SingletonImplT,
              typename InterfaceT = SingletonImplT,
              typename MutableInterfaceT = InterfaceT>
    class Singleton : SingletonImplT, public ISingleton {

        static auto getInternal() -> Singleton* {
            static Singleton* s_instance = nullptr;
            if (!s_instance) {
                s_instance = new Singleton;
                addSingleton(s_instance);
            }
            return s_instance;
        }

    public:
        static auto get() -> InterfaceT const& { return *getInternal(); }
        static auto getMutable() -> MutableInterfaceT& { return *getInternal(); }
    };

} // namespace Catch

// end catch_singletons.hpp
namespace Catch {

    namespace {

        class RegistryHub : public IRegistryHub, public IMutableRegistryHub, private NonCopyable {

        public: // IRegistryHub
            RegistryHub() = default;
            IReporterRegistry const& getReporterRegistry() const override {
                return m_reporterRegistry;
            }
            ITestCaseRegistry const& getTestCaseRegistry() const override {
                return m_testCaseRegistry;
            }
            IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override {
                return m_exceptionTranslatorRegistry;
            }
            ITagAliasRegistry const& getTagAliasRegistry() const override {
                return m_tagAliasRegistry;
            }
            StartupExceptionRegistry const& getStartupExceptionRegistry() const override {
                return m_exceptionRegistry;
            }

        public: // IMutableRegistryHub
            void registerReporter(std::string const& name,
                                  IReporterFactoryPtr const& factory) override {
                m_reporterRegistry.registerReporter(name, factory);
            }
            void registerListener(IReporterFactoryPtr const& factory) override {
                m_reporterRegistry.registerListener(factory);
            }
            void registerTest(TestCase const& testInfo) override {
                m_testCaseRegistry.registerTest(testInfo);
            }
            void registerTranslator(const IExceptionTranslator* translator) override {
                m_exceptionTranslatorRegistry.registerTranslator(translator);
            }
            void registerTagAlias(std::string const& alias,
                                  std::string const& tag,
                                  SourceLineInfo const& lineInfo) override {
                m_tagAliasRegistry.add(alias, tag, lineInfo);
            }
            void registerStartupException() noexcept override {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
                m_exceptionRegistry.add(std::current_exception());
#else
                CATCH_INTERNAL_ERROR("Attempted to register active exception "
                                     "under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
#endif
            }
            IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {
                return m_enumValuesRegistry;
            }

        private:
            TestRegistry m_testCaseRegistry;
            ReporterRegistry m_reporterRegistry;
            ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
            TagAliasRegistry m_tagAliasRegistry;
            StartupExceptionRegistry m_exceptionRegistry;
            Detail::EnumValuesRegistry m_enumValuesRegistry;
        };
    } // namespace

    using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>;

    IRegistryHub const& getRegistryHub() { return RegistryHubSingleton::get(); }
    IMutableRegistryHub& getMutableRegistryHub() { return RegistryHubSingleton::getMutable(); }
    void cleanUp() {
        cleanupSingletons();
        cleanUpContext();
    }
    std::string translateActiveException() {
        return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
    }

} // end namespace Catch
// end catch_registry_hub.cpp
// start catch_reporter_registry.cpp

namespace Catch {

    ReporterRegistry::~ReporterRegistry() = default;

    IStreamingReporterPtr ReporterRegistry::create(std::string const& name,
                                                   IConfigPtr const& config) const {
        auto it = m_factories.find(name);
        if (it == m_factories.end())
            return nullptr;
        return it->second->create(ReporterConfig(config));
    }

    void ReporterRegistry::registerReporter(std::string const& name,
                                            IReporterFactoryPtr const& factory) {
        m_factories.emplace(name, factory);
    }
    void ReporterRegistry::registerListener(IReporterFactoryPtr const& factory) {
        m_listeners.push_back(factory);
    }

    IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {
        return m_factories;
    }
    IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const {
        return m_listeners;
    }

} // namespace Catch
// end catch_reporter_registry.cpp
// start catch_result_type.cpp

namespace Catch {

    bool isOk(ResultWas::OfType resultType) { return (resultType & ResultWas::FailureBit) == 0; }
    bool isJustInfo(int flags) { return flags == ResultWas::Info; }

    ResultDisposition::Flags operator|(ResultDisposition::Flags lhs, ResultDisposition::Flags rhs) {
        return static_cast<ResultDisposition::Flags>(static_cast<int>(lhs) | static_cast<int>(rhs));
    }

    bool shouldContinueOnFailure(int flags) {
        return (flags & ResultDisposition::ContinueOnFailure) != 0;
    }
    bool shouldSuppressFailure(int flags) { return (flags & ResultDisposition::SuppressFail) != 0; }

} // end namespace Catch
// end catch_result_type.cpp
// start catch_run_context.cpp

#include <cassert>
#include <algorithm>
#include <sstream>

namespace Catch {

    namespace Generators {
        struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker {
            GeneratorBasePtr m_generator;

            GeneratorTracker(TestCaseTracking::NameAndLocation const& nameAndLocation,
                             TrackerContext& ctx,
                             ITracker* parent) :
                TrackerBase(nameAndLocation, ctx, parent) {}
            ~GeneratorTracker();

            static GeneratorTracker&
            acquire(TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation) {
                std::shared_ptr<GeneratorTracker> tracker;

                ITracker& currentTracker = ctx.currentTracker();
                // Under specific circumstances, the generator we want
                // to acquire is also the current tracker. If this is
                // the case, we have to avoid looking through current
                // tracker's children, and instead return the current
                // tracker.
                // A case where this check is important is e.g.
                //     for (int i = 0; i < 5; ++i) {
                //         int n = GENERATE(1, 2);
                //     }
                //
                // without it, the code above creates 5 nested generators.
                if (currentTracker.nameAndLocation() == nameAndLocation) {
                    auto thisTracker = currentTracker.parent().findChild(nameAndLocation);
                    assert(thisTracker);
                    assert(thisTracker->isGeneratorTracker());
                    tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker);
                } else if (TestCaseTracking::ITrackerPtr childTracker =
                               currentTracker.findChild(nameAndLocation)) {
                    assert(childTracker);
                    assert(childTracker->isGeneratorTracker());
                    tracker = std::static_pointer_cast<GeneratorTracker>(childTracker);
                } else {
                    tracker =
                        std::make_shared<GeneratorTracker>(nameAndLocation, ctx, &currentTracker);
                    currentTracker.addChild(tracker);
                }

                if (!tracker->isComplete()) {
                    tracker->open();
                }

                return *tracker;
            }

            // TrackerBase interface
            bool isGeneratorTracker() const override { return true; }
            auto hasGenerator() const -> bool override { return !!m_generator; }
            void close() override {
                TrackerBase::close();
                // If a generator has a child (it is followed by a section)
                // and none of its children have started, then we must wait
                // until later to start consuming its values.
                // This catches cases where `GENERATE` is placed between two
                // `SECTION`s.
                // **The check for m_children.empty cannot be removed**.
                // doing so would break `GENERATE` _not_ followed by `SECTION`s.
                const bool should_wait_for_child = [&]() {
                    // No children -> nobody to wait for
                    if (m_children.empty()) {
                        return false;
                    }
                    // If at least one child started executing, don't wait
                    if (std::find_if(m_children.begin(),
                                     m_children.end(),
                                     [](TestCaseTracking::ITrackerPtr tracker) {
                                         return tracker->hasStarted();
                                     }) != m_children.end())
                    {
                        return false;
                    }

                    // No children have started. We need to check if they _can_
                    // start, and thus we should wait for them, or they cannot
                    // start (due to filters), and we shouldn't wait for them
                    auto* parent = m_parent;
                    // This is safe: there is always at least one section
                    // tracker in a test case tracking tree
                    while (!parent->isSectionTracker()) {
                        parent = &(parent->parent());
                    }
                    assert(parent && "Missing root (test case) level section");

                    auto const& parentSection = static_cast<SectionTracker&>(*parent);
                    auto const& filters = parentSection.getFilters();
                    // No filters -> no restrictions on running sections
                    if (filters.empty()) {
                        return true;
                    }

                    for (auto const& child : m_children) {
                        if (child->isSectionTracker() &&
                            std::find(filters.begin(),
                                      filters.end(),
                                      static_cast<SectionTracker&>(*child).trimmedName()) !=
                                filters.end())
                        {
                            return true;
                        }
                    }
                    return false;
                }();

                // This check is a bit tricky, because m_generator->next()
                // has a side-effect, where it consumes generator's current
                // value, but we do not want to invoke the side-effect if
                // this generator is still waiting for any child to start.
                if (should_wait_for_child ||
                    (m_runState == CompletedSuccessfully && m_generator->next())) {
                    m_children.clear();
                    m_runState = Executing;
                }
            }

            // IGeneratorTracker interface
            auto getGenerator() const -> GeneratorBasePtr const& override { return m_generator; }
            void setGenerator(GeneratorBasePtr&& generator) override {
                m_generator = std::move(generator);
            }
        };
        GeneratorTracker::~GeneratorTracker() {}
    } // namespace Generators

    RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) :
        m_runInfo(_config->name()),
        m_context(getCurrentMutableContext()),
        m_config(_config),
        m_reporter(std::move(reporter)),
        m_lastAssertionInfo{
            StringRef(), SourceLineInfo("", 0), StringRef(), ResultDisposition::Normal},
        m_includeSuccessfulResults(m_config->includeSuccessfulResults() ||
                                   m_reporter->getPreferences().shouldReportAllAssertions) {
        m_context.setRunner(this);
        m_context.setConfig(m_config);
        m_context.setResultCapture(this);
        m_reporter->testRunStarting(m_runInfo);
    }

    RunContext::~RunContext() {
        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));
    }

    void RunContext::testGroupStarting(std::string const& testSpec,
                                       std::size_t groupIndex,
                                       std::size_t groupsCount) {
        m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));
    }

    void RunContext::testGroupEnded(std::string const& testSpec,
                                    Totals const& totals,
                                    std::size_t groupIndex,
                                    std::size_t groupsCount) {
        m_reporter->testGroupEnded(
            TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));
    }

    Totals RunContext::runTest(TestCase const& testCase) {
        Totals prevTotals = m_totals;

        std::string redirectedCout;
        std::string redirectedCerr;

        auto const& testInfo = testCase.getTestCaseInfo();

        m_reporter->testCaseStarting(testInfo);

        m_activeTestCase = &testCase;

        ITracker& rootTracker = m_trackerContext.startRun();
        assert(rootTracker.isSectionTracker());
        static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun());
        do {
            m_trackerContext.startCycle();
            m_testCaseTracker = &SectionTracker::acquire(
                m_trackerContext,
                TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo));
            runCurrentTest(redirectedCout, redirectedCerr);
        } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());

        Totals deltaTotals = m_totals.delta(prevTotals);
        if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) {
            deltaTotals.assertions.failed++;
            deltaTotals.testCases.passed--;
            deltaTotals.testCases.failed++;
        }
        m_totals.testCases += deltaTotals.testCases;
        m_reporter->testCaseEnded(
            TestCaseStats(testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting()));

        m_activeTestCase = nullptr;
        m_testCaseTracker = nullptr;

        return deltaTotals;
    }

    IConfigPtr RunContext::config() const { return m_config; }

    IStreamingReporter& RunContext::reporter() const { return *m_reporter; }

    void RunContext::assertionEnded(AssertionResult const& result) {
        if (result.getResultType() == ResultWas::Ok) {
            m_totals.assertions.passed++;
            m_lastAssertionPassed = true;
        } else if (!result.isOk()) {
            m_lastAssertionPassed = false;
            if (m_activeTestCase->getTestCaseInfo().okToFail())
                m_totals.assertions.failedButOk++;
            else
                m_totals.assertions.failed++;
        } else {
            m_lastAssertionPassed = true;
        }

        // We have no use for the return value (whether messages should be
        // cleared), because messages were made scoped and should be let to
        // clear themselves out.
        static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));

        if (result.getResultType() != ResultWas::Warning)
            m_messageScopes.clear();

        // Reset working state
        resetAssertionInfo();
        m_lastResult = result;
    }
    void RunContext::resetAssertionInfo() {
        m_lastAssertionInfo.macroName = StringRef();
        m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr;
    }

    bool RunContext::sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) {
        ITracker& sectionTracker = SectionTracker::acquire(
            m_trackerContext,
            TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo));
        if (!sectionTracker.isOpen())
            return false;
        m_activeSections.push_back(&sectionTracker);

        m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;

        m_reporter->sectionStarting(sectionInfo);

        assertions = m_totals.assertions;

        return true;
    }
    auto RunContext::acquireGeneratorTracker(StringRef generatorName,
                                             SourceLineInfo const& lineInfo) -> IGeneratorTracker& {
        using namespace Generators;
        GeneratorTracker& tracker = GeneratorTracker::acquire(
            m_trackerContext,
            TestCaseTracking::NameAndLocation(static_cast<std::string>(generatorName), lineInfo));
        m_lastAssertionInfo.lineInfo = lineInfo;
        return tracker;
    }

    bool RunContext::testForMissingAssertions(Counts& assertions) {
        if (assertions.total() != 0)
            return false;
        if (!m_config->warnAboutMissingAssertions())
            return false;
        if (m_trackerContext.currentTracker().hasChildren())
            return false;
        m_totals.assertions.failed++;
        assertions.failed++;
        return true;
    }

    void RunContext::sectionEnded(SectionEndInfo const& endInfo) {
        Counts assertions = m_totals.assertions - endInfo.prevAssertions;
        bool missingAssertions = testForMissingAssertions(assertions);

        if (!m_activeSections.empty()) {
            m_activeSections.back()->close();
            m_activeSections.pop_back();
        }

        m_reporter->sectionEnded(SectionStats(
            endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));
        m_messages.clear();
        m_messageScopes.clear();
    }

    void RunContext::sectionEndedEarly(SectionEndInfo const& endInfo) {
        if (m_unfinishedSections.empty())
            m_activeSections.back()->fail();
        else
            m_activeSections.back()->close();
        m_activeSections.pop_back();

        m_unfinishedSections.push_back(endInfo);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void RunContext::benchmarkPreparing(std::string const& name) {
        m_reporter->benchmarkPreparing(name);
    }
    void RunContext::benchmarkStarting(BenchmarkInfo const& info) {
        m_reporter->benchmarkStarting(info);
    }
    void RunContext::benchmarkEnded(BenchmarkStats<> const& stats) {
        m_reporter->benchmarkEnded(stats);
    }
    void RunContext::benchmarkFailed(std::string const& error) {
        m_reporter->benchmarkFailed(error);
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void RunContext::pushScopedMessage(MessageInfo const& message) {
        m_messages.push_back(message);
    }

    void RunContext::popScopedMessage(MessageInfo const& message) {
        m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message),
                         m_messages.end());
    }

    void RunContext::emplaceUnscopedMessage(MessageBuilder const& builder) {
        m_messageScopes.emplace_back(builder);
    }

    std::string RunContext::getCurrentTestName() const {
        return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : std::string();
    }

    const AssertionResult* RunContext::getLastResult() const { return &(*m_lastResult); }

    void RunContext::exceptionEarlyReported() { m_shouldReportUnexpected = false; }

    void RunContext::handleFatalErrorCondition(StringRef message) {
        // First notify reporter that bad things happened
        m_reporter->fatalErrorEncountered(message);

        // Don't rebuild the result -- the stringification itself can cause more
        // fatal errors Instead, fake a result data.
        AssertionResultData tempResult(ResultWas::FatalErrorCondition, {false});
        tempResult.message = static_cast<std::string>(message);
        AssertionResult result(m_lastAssertionInfo, tempResult);

        assertionEnded(result);

        handleUnfinishedSections();

        // Recreate section for test case (as we will lose the one that was in
        // scope)
        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);

        Counts assertions;
        assertions.failed = 1;
        SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);
        m_reporter->sectionEnded(testCaseSectionStats);

        auto const& testInfo = m_activeTestCase->getTestCaseInfo();

        Totals deltaTotals;
        deltaTotals.testCases.failed = 1;
        deltaTotals.assertions.failed = 1;
        m_reporter->testCaseEnded(
            TestCaseStats(testInfo, deltaTotals, std::string(), std::string(), false));
        m_totals.testCases.failed++;
        testGroupEnded(std::string(), m_totals, 1, 1);
        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));
    }

    bool RunContext::lastAssertionPassed() { return m_lastAssertionPassed; }

    void RunContext::assertionPassed() {
        m_lastAssertionPassed = true;
        ++m_totals.assertions.passed;
        resetAssertionInfo();
        m_messageScopes.clear();
    }

    bool RunContext::aborting() const {
        return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter());
    }

    void RunContext::runCurrentTest(std::string& redirectedCout, std::string& redirectedCerr) {
        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);
        m_reporter->sectionStarting(testCaseSection);
        Counts prevAssertions = m_totals.assertions;
        double duration = 0;
        m_shouldReportUnexpected = true;
        m_lastAssertionInfo = {
            "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal};

        seedRng(*m_config);

        Timer timer;
        CATCH_TRY {
            if (m_reporter->getPreferences().shouldRedirectStdOut) {
#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
                RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr);

                timer.start();
                invokeActiveTestCase();
#else
                OutputRedirect r(redirectedCout, redirectedCerr);
                timer.start();
                invokeActiveTestCase();
#endif
            } else {
                timer.start();
                invokeActiveTestCase();
            }
            duration = timer.getElapsedSeconds();
        }
        CATCH_CATCH_ANON(TestFailureException&) {
            // This just means the test was aborted due to failure
        }
        CATCH_CATCH_ALL {
            // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under
            // REQUIRE assertions are reported without translation at the point
            // of origin.
            if (m_shouldReportUnexpected) {
                AssertionReaction dummyReaction;
                handleUnexpectedInflightException(
                    m_lastAssertionInfo, translateActiveException(), dummyReaction);
            }
        }
        Counts assertions = m_totals.assertions - prevAssertions;
        bool missingAssertions = testForMissingAssertions(assertions);

        m_testCaseTracker->close();
        handleUnfinishedSections();
        m_messages.clear();
        m_messageScopes.clear();

        SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);
        m_reporter->sectionEnded(testCaseSectionStats);
    }

    void RunContext::invokeActiveTestCase() {
        FatalConditionHandlerGuard _(&m_fatalConditionhandler);
        m_activeTestCase->invoke();
    }

    void RunContext::handleUnfinishedSections() {
        // If sections ended prematurely due to an exception we stored their
        // infos here so we can tear them down outside the unwind process.
        for (auto it = m_unfinishedSections.rbegin(), itEnd = m_unfinishedSections.rend();
             it != itEnd;
             ++it)
            sectionEnded(*it);
        m_unfinishedSections.clear();
    }

    void RunContext::handleExpr(AssertionInfo const& info,
                                ITransientExpression const& expr,
                                AssertionReaction& reaction) {
        m_reporter->assertionStarting(info);

        bool negated = isFalseTest(info.resultDisposition);
        bool result = expr.getResult() != negated;

        if (result) {
            if (!m_includeSuccessfulResults) {
                assertionPassed();
            } else {
                reportExpr(info, ResultWas::Ok, &expr, negated);
            }
        } else {
            reportExpr(info, ResultWas::ExpressionFailed, &expr, negated);
            populateReaction(reaction);
        }
    }
    void RunContext::reportExpr(AssertionInfo const& info,
                                ResultWas::OfType resultType,
                                ITransientExpression const* expr,
                                bool negated) {

        m_lastAssertionInfo = info;
        AssertionResultData data(resultType, LazyExpression(negated));

        AssertionResult assertionResult{info, data};
        assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;

        assertionEnded(assertionResult);
    }

    void RunContext::handleMessage(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   StringRef const& message,
                                   AssertionReaction& reaction) {
        m_reporter->assertionStarting(info);

        m_lastAssertionInfo = info;

        AssertionResultData data(resultType, LazyExpression(false));
        data.message = static_cast<std::string>(message);
        AssertionResult assertionResult{m_lastAssertionInfo, data};
        assertionEnded(assertionResult);
        if (!assertionResult.isOk())
            populateReaction(reaction);
    }
    void RunContext::handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                        AssertionReaction& reaction) {
        handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction);
    }

    void RunContext::handleUnexpectedInflightException(AssertionInfo const& info,
                                                       std::string const& message,
                                                       AssertionReaction& reaction) {
        m_lastAssertionInfo = info;

        AssertionResultData data(ResultWas::ThrewException, LazyExpression(false));
        data.message = message;
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);
        populateReaction(reaction);
    }

    void RunContext::populateReaction(AssertionReaction& reaction) {
        reaction.shouldDebugBreak = m_config->shouldDebugBreak();
        reaction.shouldThrow =
            aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal);
    }

    void RunContext::handleIncomplete(AssertionInfo const& info) {
        m_lastAssertionInfo = info;

        AssertionResultData data(ResultWas::ThrewException, LazyExpression(false));
        data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);
    }
    void RunContext::handleNonExpr(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   AssertionReaction& reaction) {
        m_lastAssertionInfo = info;

        AssertionResultData data(resultType, LazyExpression(false));
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);

        if (!assertionResult.isOk())
            populateReaction(reaction);
    }

    IResultCapture& getResultCapture() {
        if (auto* capture = getCurrentContext().getResultCapture())
            return *capture;
        else
            CATCH_INTERNAL_ERROR("No result capture instance");
    }

    void seedRng(IConfig const& config) {
        if (config.rngSeed() != 0) {
            std::srand(config.rngSeed());
            rng().seed(config.rngSeed());
        }
    }

    unsigned int rngSeed() { return getCurrentContext().getConfig()->rngSeed(); }

} // namespace Catch
// end catch_run_context.cpp
// start catch_section.cpp

namespace Catch {

    Section::Section(SectionInfo const& info) :
        m_info(info), m_sectionIncluded(getResultCapture().sectionStarted(m_info, m_assertions)) {
        m_timer.start();
    }

    Section::~Section() {
        if (m_sectionIncluded) {
            SectionEndInfo endInfo{m_info, m_assertions, m_timer.getElapsedSeconds()};
            if (uncaught_exceptions())
                getResultCapture().sectionEndedEarly(endInfo);
            else
                getResultCapture().sectionEnded(endInfo);
        }
    }

    // This indicates whether the section should be executed or not
    Section::operator bool() const { return m_sectionIncluded; }

} // end namespace Catch
// end catch_section.cpp
// start catch_section_info.cpp

namespace Catch {

    SectionInfo::SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name) :
        name(_name), lineInfo(_lineInfo) {}

} // end namespace Catch
// end catch_section_info.cpp
// start catch_session.cpp

// start catch_session.h

#include <memory>

namespace Catch {

    class Session : NonCopyable {
    public:
        Session();
        ~Session() override;

        void showHelp() const;
        void libIdentify();

        int applyCommandLine(int argc, char const* const* argv);
#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
        int applyCommandLine(int argc, wchar_t const* const* argv);
#endif

        void useConfigData(ConfigData const& configData);

        template <typename CharT> int run(int argc, CharT const* const argv[]) {
            if (m_startupExceptions)
                return 1;
            int returnCode = applyCommandLine(argc, argv);
            if (returnCode == 0)
                returnCode = run();
            return returnCode;
        }

        int run();

        clara::Parser const& cli() const;
        void cli(clara::Parser const& newParser);
        ConfigData& configData();
        Config& config();

    private:
        int runInternal();

        clara::Parser m_cli;
        ConfigData m_configData;
        std::shared_ptr<Config> m_config;
        bool m_startupExceptions = false;
    };

} // end namespace Catch

// end catch_session.h
// start catch_version.h

#include <iosfwd>

namespace Catch {

    // Versioning information
    struct Version {
        Version(Version const&) = delete;
        Version& operator=(Version const&) = delete;
        Version(unsigned int _majorVersion,
                unsigned int _minorVersion,
                unsigned int _patchNumber,
                char const* const _branchName,
                unsigned int _buildNumber);

        unsigned int const majorVersion;
        unsigned int const minorVersion;
        unsigned int const patchNumber;

        // buildNumber is only used if branchName is not null
        char const* const branchName;
        unsigned int const buildNumber;

        friend std::ostream& operator<<(std::ostream& os, Version const& version);
    };

    Version const& libraryVersion();
} // namespace Catch

// end catch_version.h
#include <cstdlib>
#include <iomanip>
#include <set>
#include <iterator>

namespace Catch {

    namespace {
        const int MaxExitCode = 255;

        IStreamingReporterPtr createReporter(std::string const& reporterName,
                                             IConfigPtr const& config) {
            auto reporter =
                Catch::getRegistryHub().getReporterRegistry().create(reporterName, config);
            CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'");

            return reporter;
        }

        IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) {
            if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) {
                return createReporter(config->getReporterName(), config);
            }

            // On older platforms, returning std::unique_ptr<ListeningReporter>
            // when the return type is std::unique_ptr<IStreamingReporter>
            // doesn't compile without a std::move call. However, this causes
            // a warning on newer platforms. Thus, we have to work around
            // it a bit and downcast the pointer manually.
            auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter);
            auto& multi = static_cast<ListeningReporter&>(*ret);
            auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners();
            for (auto const& listener : listeners) {
                multi.addListener(listener->create(Catch::ReporterConfig(config)));
            }
            multi.addReporter(createReporter(config->getReporterName(), config));
            return ret;
        }

        class TestGroup {
        public:
            explicit TestGroup(std::shared_ptr<Config> const& config) :
                m_config{config}, m_context{config, makeReporter(config)} {
                auto const& allTestCases = getAllTestCasesSorted(*m_config);
                m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config);
                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();

                if (m_matches.empty() && invalidArgs.empty()) {
                    for (auto const& test : allTestCases)
                        if (!test.isHidden())
                            m_tests.emplace(&test);
                } else {
                    for (auto const& match : m_matches)
                        m_tests.insert(match.tests.begin(), match.tests.end());
                }
            }

            Totals execute() {
                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
                Totals totals;
                m_context.testGroupStarting(m_config->name(), 1, 1);
                for (auto const& testCase : m_tests) {
                    if (!m_context.aborting())
                        totals += m_context.runTest(*testCase);
                    else
                        m_context.reporter().skipTest(*testCase);
                }

                for (auto const& match : m_matches) {
                    if (match.tests.empty()) {
                        m_context.reporter().noMatchingTestCases(match.name);
                        totals.error = -1;
                    }
                }

                if (!invalidArgs.empty()) {
                    for (auto const& invalidArg : invalidArgs)
                        m_context.reporter().reportInvalidArguments(invalidArg);
                }

                m_context.testGroupEnded(m_config->name(), totals, 1, 1);
                return totals;
            }

        private:
            using Tests = std::set<TestCase const*>;

            std::shared_ptr<Config> m_config;
            RunContext m_context;
            Tests m_tests;
            TestSpec::Matches m_matches;
        };

        void applyFilenamesAsTags(Catch::IConfig const& config) {
            auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config));
            for (auto& testCase : tests) {
                auto tags = testCase.tags;

                std::string filename = testCase.lineInfo.file;
                auto lastSlash = filename.find_last_of("\\/");
                if (lastSlash != std::string::npos) {
                    filename.erase(0, lastSlash);
                    filename[0] = '#';
                }

                auto lastDot = filename.find_last_of('.');
                if (lastDot != std::string::npos) {
                    filename.erase(lastDot);
                }

                tags.push_back(std::move(filename));
                setTags(testCase, tags);
            }
        }

    } // namespace

    Session::Session() {
        static bool alreadyInstantiated = false;
        if (alreadyInstantiated) {
            CATCH_TRY {
                CATCH_INTERNAL_ERROR("Only one instance of Catch::Session can ever be used");
            }
            CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); }
        }

        // There cannot be exceptions at startup in no-exception mode.
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions();
        if (!exceptions.empty()) {
            config();
            getCurrentMutableContext().setConfig(m_config);

            m_startupExceptions = true;
            Colour colourGuard(Colour::Red);
            Catch::cerr() << "Errors occurred during startup!" << '\n';
            // iterate over all exceptions and notify user
            for (const auto& ex_ptr : exceptions) {
                try {
                    std::rethrow_exception(ex_ptr);
                } catch (std::exception const& ex) {
                    Catch::cerr() << Column(ex.what()).indent(2) << '\n';
                }
            }
        }
#endif

        alreadyInstantiated = true;
        m_cli = makeCommandLineParser(m_configData);
    }
    Session::~Session() { Catch::cleanUp(); }

    void Session::showHelp() const {
        Catch::cout() << "\nCatch v" << libraryVersion() << "\n"
                      << m_cli << std::endl
                      << "For more detailed usage please see the project docs\n"
                      << std::endl;
    }
    void Session::libIdentify() {
        Catch::cout() << std::left << std::setw(16) << "description: "
                      << "A Catch2 test executable\n"
                      << std::left << std::setw(16) << "category: "
                      << "testframework\n"
                      << std::left << std::setw(16) << "framework: "
                      << "Catch Test\n"
                      << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl;
    }

    int Session::applyCommandLine(int argc, char const* const* argv) {
        if (m_startupExceptions)
            return 1;

        auto result = m_cli.parse(clara::Args(argc, argv));
        if (!result) {
            config();
            getCurrentMutableContext().setConfig(m_config);
            Catch::cerr() << Colour(Colour::Red) << "\nError(s) in input:\n"
                          << Column(result.errorMessage()).indent(2) << "\n\n";
            Catch::cerr() << "Run with -? for usage\n" << std::endl;
            return MaxExitCode;
        }

        if (m_configData.showHelp)
            showHelp();
        if (m_configData.libIdentify)
            libIdentify();
        m_config.reset();
        return 0;
    }

#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
    int Session::applyCommandLine(int argc, wchar_t const* const* argv) {

        char** utf8Argv = new char*[argc];

        for (int i = 0; i < argc; ++i) {
            int bufSize =
                WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr);

            utf8Argv[i] = new char[bufSize];

            WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr);
        }

        int returnCode = applyCommandLine(argc, utf8Argv);

        for (int i = 0; i < argc; ++i)
            delete[] utf8Argv[i];

        delete[] utf8Argv;

        return returnCode;
    }
#endif

    void Session::useConfigData(ConfigData const& configData) {
        m_configData = configData;
        m_config.reset();
    }

    int Session::run() {
        if ((m_configData.waitForKeypress & WaitForKeypress::BeforeStart) != 0) {
            Catch::cout() << "...waiting for enter/ return before starting" << std::endl;
            static_cast<void>(std::getchar());
        }
        int exitCode = runInternal();
        if ((m_configData.waitForKeypress & WaitForKeypress::BeforeExit) != 0) {
            Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode
                          << std::endl;
            static_cast<void>(std::getchar());
        }
        return exitCode;
    }

    clara::Parser const& Session::cli() const { return m_cli; }
    void Session::cli(clara::Parser const& newParser) { m_cli = newParser; }
    ConfigData& Session::configData() { return m_configData; }
    Config& Session::config() {
        if (!m_config)
            m_config = std::make_shared<Config>(m_configData);
        return *m_config;
    }

    int Session::runInternal() {
        if (m_startupExceptions)
            return 1;

        if (m_configData.showHelp || m_configData.libIdentify) {
            return 0;
        }

        CATCH_TRY {
            config(); // Force config to be constructed

            seedRng(*m_config);

            if (m_configData.filenamesAsTags)
                applyFilenamesAsTags(*m_config);

            // Handle list request
            if (Option<std::size_t> listed = list(m_config))
                return static_cast<int>(*listed);

            TestGroup tests{m_config};
            auto const totals = tests.execute();

            if (m_config->warnAboutNoTests() && totals.error == -1)
                return 2;

            // Note that on unices only the lower 8 bits are usually used,
            // clamping the return value to 255 prevents false negative when
            // some multiple of 256 tests has failed
            return (std::min)(MaxExitCode,
                              (std::max)(totals.error, static_cast<int>(totals.assertions.failed)));
        }
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        catch (std::exception& ex) {
            Catch::cerr() << ex.what() << std::endl;
            return MaxExitCode;
        }
#endif
    }

} // end namespace Catch
// end catch_session.cpp
// start catch_singletons.cpp

#include <vector>

namespace Catch {

    namespace {
        static auto getSingletons() -> std::vector<ISingleton*>*& {
            static std::vector<ISingleton*>* g_singletons = nullptr;
            if (!g_singletons)
                g_singletons = new std::vector<ISingleton*>();
            return g_singletons;
        }
    } // namespace

    ISingleton::~ISingleton() {}

    void addSingleton(ISingleton* singleton) { getSingletons()->push_back(singleton); }
    void cleanupSingletons() {
        auto& singletons = getSingletons();
        for (auto singleton : *singletons)
            delete singleton;
        delete singletons;
        singletons = nullptr;
    }

} // namespace Catch
// end catch_singletons.cpp
// start catch_startup_exception_registry.cpp

#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
namespace Catch {
    void StartupExceptionRegistry::add(std::exception_ptr const& exception) noexcept {
        CATCH_TRY { m_exceptions.push_back(exception); }
        CATCH_CATCH_ALL {
            // If we run out of memory during start-up there's really not a lot
            // more we can do about it
            std::terminate();
        }
    }

    std::vector<std::exception_ptr> const&
    StartupExceptionRegistry::getExceptions() const noexcept {
        return m_exceptions;
    }

} // end namespace Catch
#endif
// end catch_startup_exception_registry.cpp
// start catch_stream.cpp

#include <cstdio>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <memory>

namespace Catch {

    Catch::IStream::~IStream() = default;

    namespace Detail {
        namespace {
            template <typename WriterF, std::size_t bufferSize = 256>
            class StreamBufImpl : public std::streambuf {
                char data[bufferSize];
                WriterF m_writer;

            public:
                StreamBufImpl() { setp(data, data + sizeof(data)); }

                ~StreamBufImpl() noexcept { StreamBufImpl::sync(); }

            private:
                int overflow(int c) override {
                    sync();

                    if (c != EOF) {
                        if (pbase() == epptr())
                            m_writer(std::string(1, static_cast<char>(c)));
                        else
                            sputc(static_cast<char>(c));
                    }
                    return 0;
                }

                int sync() override {
                    if (pbase() != pptr()) {
                        m_writer(std::string(
                            pbase(), static_cast<std::string::size_type>(pptr() - pbase())));
                        setp(pbase(), epptr());
                    }
                    return 0;
                }
            };

            ///////////////////////////////////////////////////////////////////////////

            struct OutputDebugWriter {

                void operator()(std::string const& str) { writeToDebugConsole(str); }
            };

            ///////////////////////////////////////////////////////////////////////////

            class FileStream : public IStream {
                mutable std::ofstream m_ofs;

            public:
                FileStream(StringRef filename) {
                    m_ofs.open(filename.c_str());
                    CATCH_ENFORCE(!m_ofs.fail(), "Unable to open file: '" << filename << "'");
                }
                ~FileStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_ofs; }
            };

            ///////////////////////////////////////////////////////////////////////////

            class CoutStream : public IStream {
                mutable std::ostream m_os;

            public:
                // Store the streambuf from cout up-front because
                // cout may get redirected when running tests
                CoutStream() : m_os(Catch::cout().rdbuf()) {}
                ~CoutStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_os; }
            };

            ///////////////////////////////////////////////////////////////////////////

            class DebugOutStream : public IStream {
                std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;
                mutable std::ostream m_os;

            public:
                DebugOutStream() :
                    m_streamBuf(new StreamBufImpl<OutputDebugWriter>()), m_os(m_streamBuf.get()) {}

                ~DebugOutStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_os; }
            };

        } // namespace
    }     // namespace Detail

    ///////////////////////////////////////////////////////////////////////////

    auto makeStream(StringRef const& filename) -> IStream const* {
        if (filename.empty())
            return new Detail::CoutStream();
        else if (filename[0] == '%') {
            if (filename == "%debug")
                return new Detail::DebugOutStream();
            else
                CATCH_ERROR("Unrecognised stream: '" << filename << "'");
        } else
            return new Detail::FileStream(filename);
    }

    // This class encapsulates the idea of a pool of ostringstreams that can be
    // reused.
    struct StringStreams {
        std::vector<std::unique_ptr<std::ostringstream>> m_streams;
        std::vector<std::size_t> m_unused;
        std::ostringstream m_referenceStream; // Used for copy state/ flags from

        auto add() -> std::size_t {
            if (m_unused.empty()) {
                m_streams.push_back(std::unique_ptr<std::ostringstream>(new std::ostringstream));
                return m_streams.size() - 1;
            } else {
                auto index = m_unused.back();
                m_unused.pop_back();
                return index;
            }
        }

        void release(std::size_t index) {
            m_streams[index]->copyfmt(m_referenceStream); // Restore initial flags and other state
            m_unused.push_back(index);
        }
    };

    ReusableStringStream::ReusableStringStream() :
        m_index(Singleton<StringStreams>::getMutable().add()),
        m_oss(Singleton<StringStreams>::getMutable().m_streams[m_index].get()) {}

    ReusableStringStream::~ReusableStringStream() {
        static_cast<std::ostringstream*>(m_oss)->str("");
        m_oss->clear();
        Singleton<StringStreams>::getMutable().release(m_index);
    }

    auto ReusableStringStream::str() const -> std::string {
        return static_cast<std::ostringstream*>(m_oss)->str();
    }

    ///////////////////////////////////////////////////////////////////////////

#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these
                              // functions
    std::ostream& cout() { return std::cout; }
    std::ostream& cerr() { return std::cerr; }
    std::ostream& clog() { return std::clog; }
#endif
} // namespace Catch
// end catch_stream.cpp
// start catch_string_manip.cpp

#include <algorithm>
#include <ostream>
#include <cstring>
#include <cctype>
#include <vector>

namespace Catch {

    namespace {
        char toLowerCh(char c) {
            return static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
        }
    } // namespace

    bool startsWith(std::string const& s, std::string const& prefix) {
        return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
    }
    bool startsWith(std::string const& s, char prefix) { return !s.empty() && s[0] == prefix; }
    bool endsWith(std::string const& s, std::string const& suffix) {
        return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
    }
    bool endsWith(std::string const& s, char suffix) {
        return !s.empty() && s[s.size() - 1] == suffix;
    }
    bool contains(std::string const& s, std::string const& infix) {
        return s.find(infix) != std::string::npos;
    }
    void toLowerInPlace(std::string& s) {
        std::transform(s.begin(), s.end(), s.begin(), toLowerCh);
    }
    std::string toLower(std::string const& s) {
        std::string lc = s;
        toLowerInPlace(lc);
        return lc;
    }
    std::string trim(std::string const& str) {
        static char const* whitespaceChars = "\n\r\t ";
        std::string::size_type start = str.find_first_not_of(whitespaceChars);
        std::string::size_type end = str.find_last_not_of(whitespaceChars);

        return start != std::string::npos ? str.substr(start, 1 + end - start) : std::string();
    }

    StringRef trim(StringRef ref) {
        const auto is_ws = [](char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; };
        size_t real_begin = 0;
        while (real_begin < ref.size() && is_ws(ref[real_begin])) {
            ++real_begin;
        }
        size_t real_end = ref.size();
        while (real_end > real_begin && is_ws(ref[real_end - 1])) {
            --real_end;
        }

        return ref.substr(real_begin, real_end - real_begin);
    }

    bool
    replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis) {
        bool replaced = false;
        std::size_t i = str.find(replaceThis);
        while (i != std::string::npos) {
            replaced = true;
            str = str.substr(0, i) + withThis + str.substr(i + replaceThis.size());
            if (i < str.size() - withThis.size())
                i = str.find(replaceThis, i + withThis.size());
            else
                i = std::string::npos;
        }
        return replaced;
    }

    std::vector<StringRef> splitStringRef(StringRef str, char delimiter) {
        std::vector<StringRef> subStrings;
        std::size_t start = 0;
        for (std::size_t pos = 0; pos < str.size(); ++pos) {
            if (str[pos] == delimiter) {
                if (pos - start > 1)
                    subStrings.push_back(str.substr(start, pos - start));
                start = pos + 1;
            }
        }
        if (start < str.size())
            subStrings.push_back(str.substr(start, str.size() - start));
        return subStrings;
    }

    pluralise::pluralise(std::size_t count, std::string const& label) :
        m_count(count), m_label(label) {}

    std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser) {
        os << pluraliser.m_count << ' ' << pluraliser.m_label;
        if (pluraliser.m_count != 1)
            os << 's';
        return os;
    }

} // namespace Catch
// end catch_string_manip.cpp
// start catch_stringref.cpp

#include <algorithm>
#include <ostream>
#include <cstring>
#include <cstdint>

namespace Catch {
    StringRef::StringRef(char const* rawChars) noexcept :
        StringRef(rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars))) {}

    auto StringRef::c_str() const -> char const* {
        CATCH_ENFORCE(isNullTerminated(),
                      "Called StringRef::c_str() on a non-null-terminated instance");
        return m_start;
    }
    auto StringRef::data() const noexcept -> char const* { return m_start; }

    auto StringRef::substr(size_type start, size_type size) const noexcept -> StringRef {
        if (start < m_size) {
            return StringRef(m_start + start, (std::min)(m_size - start, size));
        } else {
            return StringRef();
        }
    }
    auto StringRef::operator==(StringRef const& other) const noexcept -> bool {
        return m_size == other.m_size && (std::memcmp(m_start, other.m_start, m_size) == 0);
    }

    auto operator<<(std::ostream& os, StringRef const& str) -> std::ostream& {
        return os.write(str.data(), str.size());
    }

    auto operator+=(std::string& lhs, StringRef const& rhs) -> std::string& {
        lhs.append(rhs.data(), rhs.size());
        return lhs;
    }

} // namespace Catch
// end catch_stringref.cpp
// start catch_tag_alias.cpp

namespace Catch {
    TagAlias::TagAlias(std::string const& _tag, SourceLineInfo _lineInfo) :
        tag(_tag), lineInfo(_lineInfo) {}
} // namespace Catch
// end catch_tag_alias.cpp
// start catch_tag_alias_autoregistrar.cpp

namespace Catch {

    RegistrarForTagAliases::RegistrarForTagAliases(char const* alias,
                                                   char const* tag,
                                                   SourceLineInfo const& lineInfo) {
        CATCH_TRY { getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); }
        CATCH_CATCH_ALL {
            // Do not throw when constructing global objects, instead register
            // the exception to be processed later
            getMutableRegistryHub().registerStartupException();
        }
    }

} // namespace Catch
// end catch_tag_alias_autoregistrar.cpp
// start catch_tag_alias_registry.cpp

#include <sstream>

namespace Catch {

    TagAliasRegistry::~TagAliasRegistry() {}

    TagAlias const* TagAliasRegistry::find(std::string const& alias) const {
        auto it = m_registry.find(alias);
        if (it != m_registry.end())
            return &(it->second);
        else
            return nullptr;
    }

    std::string TagAliasRegistry::expandAliases(std::string const& unexpandedTestSpec) const {
        std::string expandedTestSpec = unexpandedTestSpec;
        for (auto const& registryKvp : m_registry) {
            std::size_t pos = expandedTestSpec.find(registryKvp.first);
            if (pos != std::string::npos) {
                expandedTestSpec = expandedTestSpec.substr(0, pos) + registryKvp.second.tag +
                                   expandedTestSpec.substr(pos + registryKvp.first.size());
            }
        }
        return expandedTestSpec;
    }

    void TagAliasRegistry::add(std::string const& alias,
                               std::string const& tag,
                               SourceLineInfo const& lineInfo) {
        CATCH_ENFORCE(startsWith(alias, "[@") && endsWith(alias, ']'),
                      "error: tag alias, '" << alias << "' is not of the form [@alias name].\n"
                                            << lineInfo);

        CATCH_ENFORCE(m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second,
                      "error: tag alias, '" << alias << "' already registered.\n"
                                            << "\tFirst seen at: " << find(alias)->lineInfo << "\n"
                                            << "\tRedefined at: " << lineInfo);
    }

    ITagAliasRegistry::~ITagAliasRegistry() {}

    ITagAliasRegistry const& ITagAliasRegistry::get() {
        return getRegistryHub().getTagAliasRegistry();
    }

} // end namespace Catch
// end catch_tag_alias_registry.cpp
// start catch_test_case_info.cpp

#include <cctype>
#include <exception>
#include <algorithm>
#include <sstream>

namespace Catch {

    namespace {
        TestCaseInfo::SpecialProperties parseSpecialTag(std::string const& tag) {
            if (startsWith(tag, '.') || tag == "!hide")
                return TestCaseInfo::IsHidden;
            else if (tag == "!throws")
                return TestCaseInfo::Throws;
            else if (tag == "!shouldfail")
                return TestCaseInfo::ShouldFail;
            else if (tag == "!mayfail")
                return TestCaseInfo::MayFail;
            else if (tag == "!nonportable")
                return TestCaseInfo::NonPortable;
            else if (tag == "!benchmark")
                return static_cast<TestCaseInfo::SpecialProperties>(TestCaseInfo::Benchmark |
                                                                    TestCaseInfo::IsHidden);
            else
                return TestCaseInfo::None;
        }
        bool isReservedTag(std::string const& tag) {
            return parseSpecialTag(tag) == TestCaseInfo::None && tag.size() > 0 &&
                   !std::isalnum(static_cast<unsigned char>(tag[0]));
        }
        void enforceNotReservedTag(std::string const& tag, SourceLineInfo const& _lineInfo) {
            CATCH_ENFORCE(!isReservedTag(tag),
                          "Tag name: [" << tag << "] is not allowed.\n"
                                        << "Tag names starting with non alphanumeric "
                                           "characters are reserved\n"
                                        << _lineInfo);
        }
    } // namespace

    TestCase makeTestCase(ITestInvoker* _testCase,
                          std::string const& _className,
                          NameAndTags const& nameAndTags,
                          SourceLineInfo const& _lineInfo) {
        bool isHidden = false;

        // Parse out tags
        std::vector<std::string> tags;
        std::string desc, tag;
        bool inTag = false;
        for (char c : nameAndTags.tags) {
            if (!inTag) {
                if (c == '[')
                    inTag = true;
                else
                    desc += c;
            } else {
                if (c == ']') {
                    TestCaseInfo::SpecialProperties prop = parseSpecialTag(tag);
                    if ((prop & TestCaseInfo::IsHidden) != 0)
                        isHidden = true;
                    else if (prop == TestCaseInfo::None)
                        enforceNotReservedTag(tag, _lineInfo);

                    // Merged hide tags like `[.approvals]` should be added as
                    // `[.][approvals]`. The `[.]` is added at later point, so
                    // we only strip the prefix
                    if (startsWith(tag, '.') && tag.size() > 1) {
                        tag.erase(0, 1);
                    }
                    tags.push_back(tag);
                    tag.clear();
                    inTag = false;
                } else
                    tag += c;
            }
        }
        if (isHidden) {
            // Add all "hidden" tags to make them behave identically
            tags.insert(tags.end(), {".", "!hide"});
        }

        TestCaseInfo info(
            static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo);
        return TestCase(_testCase, std::move(info));
    }

    void setTags(TestCaseInfo& testCaseInfo, std::vector<std::string> tags) {
        std::sort(begin(tags), end(tags));
        tags.erase(std::unique(begin(tags), end(tags)), end(tags));
        testCaseInfo.lcaseTags.clear();

        for (auto const& tag : tags) {
            std::string lcaseTag = toLower(tag);
            testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>(
                testCaseInfo.properties | parseSpecialTag(lcaseTag));
            testCaseInfo.lcaseTags.push_back(lcaseTag);
        }
        testCaseInfo.tags = std::move(tags);
    }

    TestCaseInfo::TestCaseInfo(std::string const& _name,
                               std::string const& _className,
                               std::string const& _description,
                               std::vector<std::string> const& _tags,
                               SourceLineInfo const& _lineInfo) :
        name(_name),
        className(_className),
        description(_description),
        lineInfo(_lineInfo),
        properties(None) {
        setTags(*this, _tags);
    }

    bool TestCaseInfo::isHidden() const { return (properties & IsHidden) != 0; }
    bool TestCaseInfo::throws() const { return (properties & Throws) != 0; }
    bool TestCaseInfo::okToFail() const { return (properties & (ShouldFail | MayFail)) != 0; }
    bool TestCaseInfo::expectedToFail() const { return (properties & (ShouldFail)) != 0; }

    std::string TestCaseInfo::tagsAsString() const {
        std::string ret;
        // '[' and ']' per tag
        std::size_t full_size = 2 * tags.size();
        for (const auto& tag : tags) {
            full_size += tag.size();
        }
        ret.reserve(full_size);
        for (const auto& tag : tags) {
            ret.push_back('[');
            ret.append(tag);
            ret.push_back(']');
        }

        return ret;
    }

    TestCase::TestCase(ITestInvoker* testCase, TestCaseInfo&& info) :
        TestCaseInfo(std::move(info)), test(testCase) {}

    TestCase TestCase::withName(std::string const& _newName) const {
        TestCase other(*this);
        other.name = _newName;
        return other;
    }

    void TestCase::invoke() const { test->invoke(); }

    bool TestCase::operator==(TestCase const& other) const {
        return test.get() == other.test.get() && name == other.name && className == other.className;
    }

    bool TestCase::operator<(TestCase const& other) const { return name < other.name; }

    TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; }

} // end namespace Catch
// end catch_test_case_info.cpp
// start catch_test_case_registry_impl.cpp

#include <algorithm>
#include <sstream>

namespace Catch {

    namespace {
        struct TestHasher {
            using hash_t = uint64_t;

            explicit TestHasher(hash_t hashSuffix) : m_hashSuffix{hashSuffix} {}

            uint32_t operator()(TestCase const& t) const {
                // FNV-1a hash with multiplication fold.
                const hash_t prime = 1099511628211u;
                hash_t hash = 14695981039346656037u;
                for (const char c : t.name) {
                    hash ^= c;
                    hash *= prime;
                }
                hash ^= m_hashSuffix;
                hash *= prime;
                const uint32_t low{static_cast<uint32_t>(hash)};
                const uint32_t high{static_cast<uint32_t>(hash >> 32)};
                return low * high;
            }

        private:
            hash_t m_hashSuffix;
        };
    } // end unnamed namespace

    std::vector<TestCase> sortTests(IConfig const& config,
                                    std::vector<TestCase> const& unsortedTestCases) {
        switch (config.runOrder()) {
            case RunTests::InDeclarationOrder:
                // already in declaration order
                break;

            case RunTests::InLexicographicalOrder: {
                std::vector<TestCase> sorted = unsortedTestCases;
                std::sort(sorted.begin(), sorted.end());
                return sorted;
            }

            case RunTests::InRandomOrder: {
                seedRng(config);
                TestHasher h{config.rngSeed()};

                using hashedTest = std::pair<TestHasher::hash_t, TestCase const*>;
                std::vector<hashedTest> indexed_tests;
                indexed_tests.reserve(unsortedTestCases.size());

                for (auto const& testCase : unsortedTestCases) {
                    indexed_tests.emplace_back(h(testCase), &testCase);
                }

                std::sort(indexed_tests.begin(),
                          indexed_tests.end(),
                          [](hashedTest const& lhs, hashedTest const& rhs) {
                              if (lhs.first == rhs.first) {
                                  return lhs.second->name < rhs.second->name;
                              }
                              return lhs.first < rhs.first;
                          });

                std::vector<TestCase> sorted;
                sorted.reserve(indexed_tests.size());

                for (auto const& hashed : indexed_tests) {
                    sorted.emplace_back(*hashed.second);
                }

                return sorted;
            }
        }
        return unsortedTestCases;
    }

    bool isThrowSafe(TestCase const& testCase, IConfig const& config) {
        return !testCase.throws() || config.allowThrows();
    }

    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config) {
        return testSpec.matches(testCase) && isThrowSafe(testCase, config);
    }

    void enforceNoDuplicateTestCases(std::vector<TestCase> const& functions) {
        std::set<TestCase> seenFunctions;
        for (auto const& function : functions) {
            auto prev = seenFunctions.insert(function);
            CATCH_ENFORCE(prev.second,
                          "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n"
                                                 << "\tFirst seen at "
                                                 << prev.first->getTestCaseInfo().lineInfo << "\n"
                                                 << "\tRedefined at "
                                                 << function.getTestCaseInfo().lineInfo);
        }
    }

    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config) {
        std::vector<TestCase> filtered;
        filtered.reserve(testCases.size());
        for (auto const& testCase : testCases) {
            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||
                (testSpec.hasFilters() && matchTest(testCase, testSpec, config)))
            {
                filtered.push_back(testCase);
            }
        }
        return filtered;
    }
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config) {
        return getRegistryHub().getTestCaseRegistry().getAllTestsSorted(config);
    }

    void TestRegistry::registerTest(TestCase const& testCase) {
        std::string name = testCase.getTestCaseInfo().name;
        if (name.empty()) {
            ReusableStringStream rss;
            rss << "Anonymous test case " << ++m_unnamedCount;
            return registerTest(testCase.withName(rss.str()));
        }
        m_functions.push_back(testCase);
    }

    std::vector<TestCase> const& TestRegistry::getAllTests() const { return m_functions; }
    std::vector<TestCase> const& TestRegistry::getAllTestsSorted(IConfig const& config) const {
        if (m_sortedFunctions.empty())
            enforceNoDuplicateTestCases(m_functions);

        if (m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty()) {
            m_sortedFunctions = sortTests(config, m_functions);
            m_currentSortOrder = config.runOrder();
        }
        return m_sortedFunctions;
    }

    ///////////////////////////////////////////////////////////////////////////
    TestInvokerAsFunction::TestInvokerAsFunction(void (*testAsFunction)()) noexcept :
        m_testAsFunction(testAsFunction) {}

    void TestInvokerAsFunction::invoke() const { m_testAsFunction(); }

    std::string extractClassName(StringRef const& classOrQualifiedMethodName) {
        std::string className(classOrQualifiedMethodName);
        if (startsWith(className, '&')) {
            std::size_t lastColons = className.rfind("::");
            std::size_t penultimateColons = className.rfind("::", lastColons - 1);
            if (penultimateColons == std::string::npos)
                penultimateColons = 1;
            className = className.substr(penultimateColons, lastColons - penultimateColons);
        }
        return className;
    }

} // end namespace Catch
// end catch_test_case_registry_impl.cpp
// start catch_test_case_tracker.cpp

#include <algorithm>
#include <cassert>
#include <stdexcept>
#include <memory>
#include <sstream>

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#endif

namespace Catch {
    namespace TestCaseTracking {

        NameAndLocation::NameAndLocation(std::string const& _name,
                                         SourceLineInfo const& _location) :
            name(_name), location(_location) {}

        ITracker::~ITracker() = default;

        ITracker& TrackerContext::startRun() {
            m_rootTracker = std::make_shared<SectionTracker>(
                NameAndLocation("{root}", CATCH_INTERNAL_LINEINFO), *this, nullptr);
            m_currentTracker = nullptr;
            m_runState = Executing;
            return *m_rootTracker;
        }

        void TrackerContext::endRun() {
            m_rootTracker.reset();
            m_currentTracker = nullptr;
            m_runState = NotStarted;
        }

        void TrackerContext::startCycle() {
            m_currentTracker = m_rootTracker.get();
            m_runState = Executing;
        }
        void TrackerContext::completeCycle() { m_runState = CompletedCycle; }

        bool TrackerContext::completedCycle() const { return m_runState == CompletedCycle; }
        ITracker& TrackerContext::currentTracker() { return *m_currentTracker; }
        void TrackerContext::setCurrentTracker(ITracker* tracker) { m_currentTracker = tracker; }

        TrackerBase::TrackerBase(NameAndLocation const& nameAndLocation,
                                 TrackerContext& ctx,
                                 ITracker* parent) :
            ITracker(nameAndLocation), m_ctx(ctx), m_parent(parent) {}

        bool TrackerBase::isComplete() const {
            return m_runState == CompletedSuccessfully || m_runState == Failed;
        }
        bool TrackerBase::isSuccessfullyCompleted() const {
            return m_runState == CompletedSuccessfully;
        }
        bool TrackerBase::isOpen() const { return m_runState != NotStarted && !isComplete(); }
        bool TrackerBase::hasChildren() const { return !m_children.empty(); }

        void TrackerBase::addChild(ITrackerPtr const& child) { m_children.push_back(child); }

        ITrackerPtr TrackerBase::findChild(NameAndLocation const& nameAndLocation) {
            auto it = std::find_if(
                m_children.begin(),
                m_children.end(),
                [&nameAndLocation](ITrackerPtr const& tracker) {
                    return tracker->nameAndLocation().location == nameAndLocation.location &&
                           tracker->nameAndLocation().name == nameAndLocation.name;
                });
            return (it != m_children.end()) ? *it : nullptr;
        }
        ITracker& TrackerBase::parent() {
            assert(m_parent); // Should always be non-null except for root
            return *m_parent;
        }

        void TrackerBase::openChild() {
            if (m_runState != ExecutingChildren) {
                m_runState = ExecutingChildren;
                if (m_parent)
                    m_parent->openChild();
            }
        }

        bool TrackerBase::isSectionTracker() const { return false; }
        bool TrackerBase::isGeneratorTracker() const { return false; }

        void TrackerBase::open() {
            m_runState = Executing;
            moveToThis();
            if (m_parent)
                m_parent->openChild();
        }

        void TrackerBase::close() {

            // Close any still open children (e.g. generators)
            while (&m_ctx.currentTracker() != this)
                m_ctx.currentTracker().close();

            switch (m_runState) {
                case NeedsAnotherRun:
                    break;

                case Executing:
                    m_runState = CompletedSuccessfully;
                    break;
                case ExecutingChildren:
                    if (std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t) {
                            return t->isComplete();
                        }))
                        m_runState = CompletedSuccessfully;
                    break;

                case NotStarted:
                case CompletedSuccessfully:
                case Failed:
                    CATCH_INTERNAL_ERROR("Illogical state: " << m_runState);

                default:
                    CATCH_INTERNAL_ERROR("Unknown state: " << m_runState);
            }
            moveToParent();
            m_ctx.completeCycle();
        }
        void TrackerBase::fail() {
            m_runState = Failed;
            if (m_parent)
                m_parent->markAsNeedingAnotherRun();
            moveToParent();
            m_ctx.completeCycle();
        }
        void TrackerBase::markAsNeedingAnotherRun() { m_runState = NeedsAnotherRun; }

        void TrackerBase::moveToParent() {
            assert(m_parent);
            m_ctx.setCurrentTracker(m_parent);
        }
        void TrackerBase::moveToThis() { m_ctx.setCurrentTracker(this); }

        SectionTracker::SectionTracker(NameAndLocation const& nameAndLocation,
                                       TrackerContext& ctx,
                                       ITracker* parent) :
            TrackerBase(nameAndLocation, ctx, parent), m_trimmed_name(trim(nameAndLocation.name)) {
            if (parent) {
                while (!parent->isSectionTracker())
                    parent = &parent->parent();

                SectionTracker& parentSection = static_cast<SectionTracker&>(*parent);
                addNextFilters(parentSection.m_filters);
            }
        }

        bool SectionTracker::isComplete() const {
            bool complete = true;

            if (m_filters.empty() || m_filters[0] == "" ||
                std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end())
            {
                complete = TrackerBase::isComplete();
            }
            return complete;
        }

        bool SectionTracker::isSectionTracker() const { return true; }

        SectionTracker& SectionTracker::acquire(TrackerContext& ctx,
                                                NameAndLocation const& nameAndLocation) {
            std::shared_ptr<SectionTracker> section;

            ITracker& currentTracker = ctx.currentTracker();
            if (ITrackerPtr childTracker = currentTracker.findChild(nameAndLocation)) {
                assert(childTracker);
                assert(childTracker->isSectionTracker());
                section = std::static_pointer_cast<SectionTracker>(childTracker);
            } else {
                section = std::make_shared<SectionTracker>(nameAndLocation, ctx, &currentTracker);
                currentTracker.addChild(section);
            }
            if (!ctx.completedCycle())
                section->tryOpen();
            return *section;
        }

        void SectionTracker::tryOpen() {
            if (!isComplete())
                open();
        }

        void SectionTracker::addInitialFilters(std::vector<std::string> const& filters) {
            if (!filters.empty()) {
                m_filters.reserve(m_filters.size() + filters.size() + 2);
                m_filters.emplace_back(""); // Root - should never be consulted
                m_filters.emplace_back(""); // Test Case - not a section filter
                m_filters.insert(m_filters.end(), filters.begin(), filters.end());
            }
        }
        void SectionTracker::addNextFilters(std::vector<std::string> const& filters) {
            if (filters.size() > 1)
                m_filters.insert(m_filters.end(), filters.begin() + 1, filters.end());
        }

        std::vector<std::string> const& SectionTracker::getFilters() const { return m_filters; }

        std::string const& SectionTracker::trimmedName() const { return m_trimmed_name; }

    } // namespace TestCaseTracking

    using TestCaseTracking::ITracker;
    using TestCaseTracking::SectionTracker;
    using TestCaseTracking::TrackerContext;

} // namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif
// end catch_test_case_tracker.cpp
// start catch_test_registry.cpp

namespace Catch {

    auto makeTestInvoker(void (*testAsFunction)()) noexcept -> ITestInvoker* {
        return new (std::nothrow) TestInvokerAsFunction(testAsFunction);
    }

    NameAndTags::NameAndTags(StringRef const& name_, StringRef const& tags_) noexcept :
        name(name_), tags(tags_) {}

    AutoReg::AutoReg(ITestInvoker* invoker,
                     SourceLineInfo const& lineInfo,
                     StringRef const& classOrMethod,
                     NameAndTags const& nameAndTags) noexcept {
        CATCH_TRY {
            getMutableRegistryHub().registerTest(
                makeTestCase(invoker, extractClassName(classOrMethod), nameAndTags, lineInfo));
        }
        CATCH_CATCH_ALL {
            // Do not throw when constructing global objects, instead register
            // the exception to be processed later
            getMutableRegistryHub().registerStartupException();
        }
    }

    AutoReg::~AutoReg() = default;
} // namespace Catch
// end catch_test_registry.cpp
// start catch_test_spec.cpp

#include <algorithm>
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    TestSpec::Pattern::Pattern(std::string const& name) : m_name(name) {}

    TestSpec::Pattern::~Pattern() = default;

    std::string const& TestSpec::Pattern::name() const { return m_name; }

    TestSpec::NamePattern::NamePattern(std::string const& name, std::string const& filterString) :
        Pattern(filterString), m_wildcardPattern(toLower(name), CaseSensitive::No) {}

    bool TestSpec::NamePattern::matches(TestCaseInfo const& testCase) const {
        return m_wildcardPattern.matches(testCase.name);
    }

    TestSpec::TagPattern::TagPattern(std::string const& tag, std::string const& filterString) :
        Pattern(filterString), m_tag(toLower(tag)) {}

    bool TestSpec::TagPattern::matches(TestCaseInfo const& testCase) const {
        return std::find(begin(testCase.lcaseTags), end(testCase.lcaseTags), m_tag) !=
               end(testCase.lcaseTags);
    }

    TestSpec::ExcludedPattern::ExcludedPattern(PatternPtr const& underlyingPattern) :
        Pattern(underlyingPattern->name()), m_underlyingPattern(underlyingPattern) {}

    bool TestSpec::ExcludedPattern::matches(TestCaseInfo const& testCase) const {
        return !m_underlyingPattern->matches(testCase);
    }

    bool TestSpec::Filter::matches(TestCaseInfo const& testCase) const {
        return std::all_of(m_patterns.begin(), m_patterns.end(), [&](PatternPtr const& p) {
            return p->matches(testCase);
        });
    }

    std::string TestSpec::Filter::name() const {
        std::string name;
        for (auto const& p : m_patterns)
            name += p->name();
        return name;
    }

    bool TestSpec::hasFilters() const { return !m_filters.empty(); }

    bool TestSpec::matches(TestCaseInfo const& testCase) const {
        return std::any_of(m_filters.begin(), m_filters.end(), [&](Filter const& f) {
            return f.matches(testCase);
        });
    }

    TestSpec::Matches TestSpec::matchesByFilter(std::vector<TestCase> const& testCases,
                                                IConfig const& config) const {
        Matches matches(m_filters.size());
        std::transform(
            m_filters.begin(), m_filters.end(), matches.begin(), [&](Filter const& filter) {
                std::vector<TestCase const*> currentMatches;
                for (auto const& test : testCases)
                    if (isThrowSafe(test, config) && filter.matches(test))
                        currentMatches.emplace_back(&test);
                return FilterMatch{filter.name(), currentMatches};
            });
        return matches;
    }

    const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const { return (m_invalidArgs); }

} // namespace Catch
// end catch_test_spec.cpp
// start catch_test_spec_parser.cpp

namespace Catch {

    TestSpecParser::TestSpecParser(ITagAliasRegistry const& tagAliases) :
        m_tagAliases(&tagAliases) {}

    TestSpecParser& TestSpecParser::parse(std::string const& arg) {
        m_mode = None;
        m_exclusion = false;
        m_arg = m_tagAliases->expandAliases(arg);
        m_escapeChars.clear();
        m_substring.reserve(m_arg.size());
        m_patternName.reserve(m_arg.size());
        m_realPatternPos = 0;

        for (m_pos = 0; m_pos < m_arg.size(); ++m_pos)
            // if visitChar fails
            if (!visitChar(m_arg[m_pos])) {
                m_testSpec.m_invalidArgs.push_back(arg);
                break;
            }
        endMode();
        return *this;
    }
    TestSpec TestSpecParser::testSpec() {
        addFilter();
        return m_testSpec;
    }
    bool TestSpecParser::visitChar(char c) {
        if ((m_mode != EscapedName) && (c == '\\')) {
            escape();
            addCharToPattern(c);
            return true;
        } else if ((m_mode != EscapedName) && (c == ',')) {
            return separate();
        }

        switch (m_mode) {
            case None:
                if (processNoneChar(c))
                    return true;
                break;
            case Name:
                processNameChar(c);
                break;
            case EscapedName:
                endMode();
                addCharToPattern(c);
                return true;
            default:
            case Tag:
            case QuotedName:
                if (processOtherChar(c))
                    return true;
                break;
        }

        m_substring += c;
        if (!isControlChar(c)) {
            m_patternName += c;
            m_realPatternPos++;
        }
        return true;
    }
    // Two of the processing methods return true to signal the caller to return
    // without adding the given character to the current pattern strings
    bool TestSpecParser::processNoneChar(char c) {
        switch (c) {
            case ' ':
                return true;
            case '~':
                m_exclusion = true;
                return false;
            case '[':
                startNewMode(Tag);
                return false;
            case '"':
                startNewMode(QuotedName);
                return false;
            default:
                startNewMode(Name);
                return false;
        }
    }
    void TestSpecParser::processNameChar(char c) {
        if (c == '[') {
            if (m_substring == "exclude:")
                m_exclusion = true;
            else
                endMode();
            startNewMode(Tag);
        }
    }
    bool TestSpecParser::processOtherChar(char c) {
        if (!isControlChar(c))
            return false;
        m_substring += c;
        endMode();
        return true;
    }
    void TestSpecParser::startNewMode(Mode mode) { m_mode = mode; }
    void TestSpecParser::endMode() {
        switch (m_mode) {
            case Name:
            case QuotedName:
                return addNamePattern();
            case Tag:
                return addTagPattern();
            case EscapedName:
                revertBackToLastMode();
                return;
            case None:
            default:
                return startNewMode(None);
        }
    }
    void TestSpecParser::escape() {
        saveLastMode();
        m_mode = EscapedName;
        m_escapeChars.push_back(m_realPatternPos);
    }
    bool TestSpecParser::isControlChar(char c) const {
        switch (m_mode) {
            default:
                return false;
            case None:
                return c == '~';
            case Name:
                return c == '[';
            case EscapedName:
                return true;
            case QuotedName:
                return c == '"';
            case Tag:
                return c == '[' || c == ']';
        }
    }

    void TestSpecParser::addFilter() {
        if (!m_currentFilter.m_patterns.empty()) {
            m_testSpec.m_filters.push_back(m_currentFilter);
            m_currentFilter = TestSpec::Filter();
        }
    }

    void TestSpecParser::saveLastMode() { lastMode = m_mode; }

    void TestSpecParser::revertBackToLastMode() { m_mode = lastMode; }

    bool TestSpecParser::separate() {
        if ((m_mode == QuotedName) || (m_mode == Tag)) {
            // invalid argument, signal failure to previous scope.
            m_mode = None;
            m_pos = m_arg.size();
            m_substring.clear();
            m_patternName.clear();
            m_realPatternPos = 0;
            return false;
        }
        endMode();
        addFilter();
        return true; // success
    }

    std::string TestSpecParser::preprocessPattern() {
        std::string token = m_patternName;
        for (std::size_t i = 0; i < m_escapeChars.size(); ++i)
            token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1);
        m_escapeChars.clear();
        if (startsWith(token, "exclude:")) {
            m_exclusion = true;
            token = token.substr(8);
        }

        m_patternName.clear();
        m_realPatternPos = 0;

        return token;
    }

    void TestSpecParser::addNamePattern() {
        auto token = preprocessPattern();

        if (!token.empty()) {
            TestSpec::PatternPtr pattern =
                std::make_shared<TestSpec::NamePattern>(token, m_substring);
            if (m_exclusion)
                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
            m_currentFilter.m_patterns.push_back(pattern);
        }
        m_substring.clear();
        m_exclusion = false;
        m_mode = None;
    }

    void TestSpecParser::addTagPattern() {
        auto token = preprocessPattern();

        if (!token.empty()) {
            // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo])
            // we have to create a separate hide tag and shorten the real one
            if (token.size() > 1 && token[0] == '.') {
                token.erase(token.begin());
                TestSpec::PatternPtr pattern =
                    std::make_shared<TestSpec::TagPattern>(".", m_substring);
                if (m_exclusion) {
                    pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
                }
                m_currentFilter.m_patterns.push_back(pattern);
            }

            TestSpec::PatternPtr pattern =
                std::make_shared<TestSpec::TagPattern>(token, m_substring);

            if (m_exclusion) {
                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
            }
            m_currentFilter.m_patterns.push_back(pattern);
        }
        m_substring.clear();
        m_exclusion = false;
        m_mode = None;
    }

    TestSpec parseTestSpec(std::string const& arg) {
        return TestSpecParser(ITagAliasRegistry::get()).parse(arg).testSpec();
    }

} // namespace Catch
// end catch_test_spec_parser.cpp
// start catch_timer.cpp

#include <chrono>

static const uint64_t nanosecondsInSecond = 1000000000;

namespace Catch {

    auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
        return std::chrono::duration_cast<std::chrono::nanoseconds>(
                   std::chrono::high_resolution_clock::now().time_since_epoch())
            .count();
    }

    namespace {
        auto estimateClockResolution() -> uint64_t {
            uint64_t sum = 0;
            static const uint64_t iterations = 1000000;

            auto startTime = getCurrentNanosecondsSinceEpoch();

            for (std::size_t i = 0; i < iterations; ++i) {

                uint64_t ticks;
                uint64_t baseTicks = getCurrentNanosecondsSinceEpoch();
                do {
                    ticks = getCurrentNanosecondsSinceEpoch();
                } while (ticks == baseTicks);

                auto delta = ticks - baseTicks;
                sum += delta;

                // If we have been calibrating for over 3 seconds -- the clock
                // is terrible and we should move on.
                // TBD: How to signal that the measured resolution is probably
                // wrong?
                if (ticks > startTime + 3 * nanosecondsInSecond) {
                    return sum / (i + 1u);
                }
            }

            // We're just taking the mean, here. To do better we could take the
            // std. dev and exclude outliers
            // - and potentially do more iterations if there's a high variance.
            return sum / iterations;
        }
    } // namespace
    auto getEstimatedClockResolution() -> uint64_t {
        static auto s_resolution = estimateClockResolution();
        return s_resolution;
    }

    void Timer::start() { m_nanoseconds = getCurrentNanosecondsSinceEpoch(); }
    auto Timer::getElapsedNanoseconds() const -> uint64_t {
        return getCurrentNanosecondsSinceEpoch() - m_nanoseconds;
    }
    auto Timer::getElapsedMicroseconds() const -> uint64_t {
        return getElapsedNanoseconds() / 1000;
    }
    auto Timer::getElapsedMilliseconds() const -> unsigned int {
        return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
    }
    auto Timer::getElapsedSeconds() const -> double { return getElapsedMicroseconds() / 1000000.0; }

} // namespace Catch
// end catch_timer.cpp
// start catch_tostring.cpp

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#pragma clang diagnostic ignored "-Wglobal-constructors"
#endif

// Enable specific decls locally
#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#endif

#include <cmath>
#include <iomanip>

namespace Catch {

    namespace Detail {

        const std::string unprintableString = "{?}";

        namespace {
            const int hexThreshold = 255;

            struct Endianness {
                enum Arch { Big, Little };

                static Arch which() {
                    int one = 1;
                    // If the lowest byte we read is non-zero, we can assume
                    // that little endian format is used.
                    auto value = *reinterpret_cast<char*>(&one);
                    return value ? Little : Big;
                }
            };
        } // namespace

        std::string rawMemoryToString(const void* object, std::size_t size) {
            // Reverse order for little endian architectures
            int i = 0, end = static_cast<int>(size), inc = 1;
            if (Endianness::which() == Endianness::Little) {
                i = end - 1;
                end = inc = -1;
            }

            unsigned char const* bytes = static_cast<unsigned char const*>(object);
            ReusableStringStream rss;
            rss << "0x" << std::setfill('0') << std::hex;
            for (; i != end; i += inc)
                rss << std::setw(2) << static_cast<unsigned>(bytes[i]);
            return rss.str();
        }
    } // namespace Detail

    template <typename T> std::string fpToString(T value, int precision) {
        if (Catch::isnan(value)) {
            return "nan";
        }

        ReusableStringStream rss;
        rss << std::setprecision(precision) << std::fixed << value;
        std::string d = rss.str();
        std::size_t i = d.find_last_not_of('0');
        if (i != std::string::npos && i != d.size() - 1) {
            if (d[i] == '.')
                i++;
            d = d.substr(0, i + 1);
        }
        return d;
    }

    //// ======================================================= ////
    //
    //   Out-of-line defs for full specialization of StringMaker
    //
    //// ======================================================= ////

    std::string StringMaker<std::string>::convert(const std::string& str) {
        if (!getCurrentContext().getConfig()->showInvisibles()) {
            return '"' + str + '"';
        }

        std::string s("\"");
        for (char c : str) {
            switch (c) {
                case '\n':
                    s.append("\\n");
                    break;
                case '\t':
                    s.append("\\t");
                    break;
                default:
                    s.push_back(c);
                    break;
            }
        }
        s.append("\"");
        return s;
    }

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    std::string StringMaker<std::string_view>::convert(std::string_view str) {
        return ::Catch::Detail::stringify(std::string{str});
    }
#endif

    std::string StringMaker<char const*>::convert(char const* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::string{str});
        } else {
            return {"{null string}"};
        }
    }
    std::string StringMaker<char*>::convert(char* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::string{str});
        } else {
            return {"{null string}"};
        }
    }

#ifdef CATCH_CONFIG_WCHAR
    std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {
        std::string s;
        s.reserve(wstr.size());
        for (auto c : wstr) {
            s += (c <= 0xff) ? static_cast<char>(c) : '?';
        }
        return ::Catch::Detail::stringify(s);
    }

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {
        return StringMaker<std::wstring>::convert(std::wstring(str));
    }
#endif

    std::string StringMaker<wchar_t const*>::convert(wchar_t const* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::wstring{str});
        } else {
            return {"{null string}"};
        }
    }
    std::string StringMaker<wchar_t*>::convert(wchar_t* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::wstring{str});
        } else {
            return {"{null string}"};
        }
    }
#endif

#if defined(CATCH_CONFIG_CPP17_BYTE)
#include <cstddef>
    std::string StringMaker<std::byte>::convert(std::byte value) {
        return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value));
    }
#endif // defined(CATCH_CONFIG_CPP17_BYTE)

    std::string StringMaker<int>::convert(int value) {
        return ::Catch::Detail::stringify(static_cast<long long>(value));
    }
    std::string StringMaker<long>::convert(long value) {
        return ::Catch::Detail::stringify(static_cast<long long>(value));
    }
    std::string StringMaker<long long>::convert(long long value) {
        ReusableStringStream rss;
        rss << value;
        if (value > Detail::hexThreshold) {
            rss << " (0x" << std::hex << value << ')';
        }
        return rss.str();
    }

    std::string StringMaker<unsigned int>::convert(unsigned int value) {
        return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
    }
    std::string StringMaker<unsigned long>::convert(unsigned long value) {
        return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
    }
    std::string StringMaker<unsigned long long>::convert(unsigned long long value) {
        ReusableStringStream rss;
        rss << value;
        if (value > Detail::hexThreshold) {
            rss << " (0x" << std::hex << value << ')';
        }
        return rss.str();
    }

    std::string StringMaker<bool>::convert(bool b) { return b ? "true" : "false"; }

    std::string StringMaker<signed char>::convert(signed char value) {
        if (value == '\r') {
            return "'\\r'";
        } else if (value == '\f') {
            return "'\\f'";
        } else if (value == '\n') {
            return "'\\n'";
        } else if (value == '\t') {
            return "'\\t'";
        } else if ('\0' <= value && value < ' ') {
            return ::Catch::Detail::stringify(static_cast<unsigned int>(value));
        } else {
            char chstr[] = "' '";
            chstr[1] = value;
            return chstr;
        }
    }
    std::string StringMaker<char>::convert(char c) {
        return ::Catch::Detail::stringify(static_cast<signed char>(c));
    }
    std::string StringMaker<unsigned char>::convert(unsigned char c) {
        return ::Catch::Detail::stringify(static_cast<char>(c));
    }

    std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) { return "nullptr"; }

    int StringMaker<float>::precision = 5;

    std::string StringMaker<float>::convert(float value) {
        return fpToString(value, precision) + 'f';
    }

    int StringMaker<double>::precision = 10;

    std::string StringMaker<double>::convert(double value) { return fpToString(value, precision); }

    std::string ratio_string<std::atto>::symbol() { return "a"; }
    std::string ratio_string<std::femto>::symbol() { return "f"; }
    std::string ratio_string<std::pico>::symbol() { return "p"; }
    std::string ratio_string<std::nano>::symbol() { return "n"; }
    std::string ratio_string<std::micro>::symbol() { return "u"; }
    std::string ratio_string<std::milli>::symbol() { return "m"; }

} // end namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

// end catch_tostring.cpp
// start catch_totals.cpp

namespace Catch {

    Counts Counts::operator-(Counts const& other) const {
        Counts diff;
        diff.passed = passed - other.passed;
        diff.failed = failed - other.failed;
        diff.failedButOk = failedButOk - other.failedButOk;
        return diff;
    }

    Counts& Counts::operator+=(Counts const& other) {
        passed += other.passed;
        failed += other.failed;
        failedButOk += other.failedButOk;
        return *this;
    }

    std::size_t Counts::total() const { return passed + failed + failedButOk; }
    bool Counts::allPassed() const { return failed == 0 && failedButOk == 0; }
    bool Counts::allOk() const { return failed == 0; }

    Totals Totals::operator-(Totals const& other) const {
        Totals diff;
        diff.assertions = assertions - other.assertions;
        diff.testCases = testCases - other.testCases;
        return diff;
    }

    Totals& Totals::operator+=(Totals const& other) {
        assertions += other.assertions;
        testCases += other.testCases;
        return *this;
    }

    Totals Totals::delta(Totals const& prevTotals) const {
        Totals diff = *this - prevTotals;
        if (diff.assertions.failed > 0)
            ++diff.testCases.failed;
        else if (diff.assertions.failedButOk > 0)
            ++diff.testCases.failedButOk;
        else
            ++diff.testCases.passed;
        return diff;
    }

} // namespace Catch
// end catch_totals.cpp
// start catch_uncaught_exceptions.cpp

// start catch_config_uncaught_exceptions.hpp

//              Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
//   (See accompanying file LICENSE_1_0.txt or copy at
//        https://www.boost.org/LICENSE_1_0.txt)

// SPDX-License-Identifier: BSL-1.0

#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP

#if defined(_MSC_VER)
#if _MSC_VER >= 1900 // Visual Studio 2015 or newer
#define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif
#endif

#include <exception>

#if defined(__cpp_lib_uncaught_exceptions) &&                                                      \
    !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)

#define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif // __cpp_lib_uncaught_exceptions

#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) &&                                    \
    !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) &&                                         \
    !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)

#define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif

#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
// end catch_config_uncaught_exceptions.hpp
#include <exception>

namespace Catch {
    bool uncaught_exceptions() {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        return false;
#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
        return std::uncaught_exceptions() > 0;
#else
        return std::uncaught_exception();
#endif
    }
} // end namespace Catch
// end catch_uncaught_exceptions.cpp
// start catch_version.cpp

#include <ostream>

namespace Catch {

    Version::Version(unsigned int _majorVersion,
                     unsigned int _minorVersion,
                     unsigned int _patchNumber,
                     char const* const _branchName,
                     unsigned int _buildNumber) :
        majorVersion(_majorVersion),
        minorVersion(_minorVersion),
        patchNumber(_patchNumber),
        branchName(_branchName),
        buildNumber(_buildNumber) {}

    std::ostream& operator<<(std::ostream& os, Version const& version) {
        os << version.majorVersion << '.' << version.minorVersion << '.' << version.patchNumber;
        // branchName is never null -> 0th char is \0 if it is empty
        if (version.branchName[0]) {
            os << '-' << version.branchName << '.' << version.buildNumber;
        }
        return os;
    }

    Version const& libraryVersion() {
        static Version version(2, 13, 7, "", 0);
        return version;
    }

} // namespace Catch
// end catch_version.cpp
// start catch_wildcard_pattern.cpp

namespace Catch {

    WildcardPattern::WildcardPattern(std::string const& pattern,
                                     CaseSensitive::Choice caseSensitivity) :
        m_caseSensitivity(caseSensitivity), m_pattern(normaliseString(pattern)) {
        if (startsWith(m_pattern, '*')) {
            m_pattern = m_pattern.substr(1);
            m_wildcard = WildcardAtStart;
        }
        if (endsWith(m_pattern, '*')) {
            m_pattern = m_pattern.substr(0, m_pattern.size() - 1);
            m_wildcard = static_cast<WildcardPosition>(m_wildcard | WildcardAtEnd);
        }
    }

    bool WildcardPattern::matches(std::string const& str) const {
        switch (m_wildcard) {
            case NoWildcard:
                return m_pattern == normaliseString(str);
            case WildcardAtStart:
                return endsWith(normaliseString(str), m_pattern);
            case WildcardAtEnd:
                return startsWith(normaliseString(str), m_pattern);
            case WildcardAtBothEnds:
                return contains(normaliseString(str), m_pattern);
            default:
                CATCH_INTERNAL_ERROR("Unknown enum");
        }
    }

    std::string WildcardPattern::normaliseString(std::string const& str) const {
        return trim(m_caseSensitivity == CaseSensitive::No ? toLower(str) : str);
    }
} // namespace Catch
// end catch_wildcard_pattern.cpp
// start catch_xmlwriter.cpp

#include <iomanip>
#include <type_traits>

namespace Catch {

    namespace {

        size_t trailingBytes(unsigned char c) {
            if ((c & 0xE0) == 0xC0) {
                return 2;
            }
            if ((c & 0xF0) == 0xE0) {
                return 3;
            }
            if ((c & 0xF8) == 0xF0) {
                return 4;
            }
            CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
        }

        uint32_t headerValue(unsigned char c) {
            if ((c & 0xE0) == 0xC0) {
                return c & 0x1F;
            }
            if ((c & 0xF0) == 0xE0) {
                return c & 0x0F;
            }
            if ((c & 0xF8) == 0xF0) {
                return c & 0x07;
            }
            CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
        }

        void hexEscapeChar(std::ostream& os, unsigned char c) {
            std::ios_base::fmtflags f(os.flags());
            os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
               << static_cast<int>(c);
            os.flags(f);
        }

        bool shouldNewline(XmlFormatting fmt) {
            return !!(static_cast<std::underlying_type<XmlFormatting>::type>(
                fmt & XmlFormatting::Newline));
        }

        bool shouldIndent(XmlFormatting fmt) {
            return !!(static_cast<std::underlying_type<XmlFormatting>::type>(
                fmt & XmlFormatting::Indent));
        }

    } // anonymous namespace

    XmlFormatting operator|(XmlFormatting lhs, XmlFormatting rhs) {
        return static_cast<XmlFormatting>(
            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) |
            static_cast<std::underlying_type<XmlFormatting>::type>(rhs));
    }

    XmlFormatting operator&(XmlFormatting lhs, XmlFormatting rhs) {
        return static_cast<XmlFormatting>(
            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) &
            static_cast<std::underlying_type<XmlFormatting>::type>(rhs));
    }

    XmlEncode::XmlEncode(std::string const& str, ForWhat forWhat) :
        m_str(str), m_forWhat(forWhat) {}

    void XmlEncode::encodeTo(std::ostream& os) const {
        // Apostrophe escaping not necessary if we always use " to write
        // attributes (see: http://www.w3.org/TR/xml/#syntax)

        for (std::size_t idx = 0; idx < m_str.size(); ++idx) {
            unsigned char c = m_str[idx];
            switch (c) {
                case '<':
                    os << "&lt;";
                    break;
                case '&':
                    os << "&amp;";
                    break;

                case '>':
                    // See: http://www.w3.org/TR/xml/#syntax
                    if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')
                        os << "&gt;";
                    else
                        os << c;
                    break;

                case '\"':
                    if (m_forWhat == ForAttributes)
                        os << "&quot;";
                    else
                        os << c;
                    break;

                default:
                    // Check for control characters and invalid utf-8

                    // Escape control characters in standard ascii
                    // see
                    // http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
                    if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
                        hexEscapeChar(os, c);
                        break;
                    }

                    // Plain ASCII: Write it to stream
                    if (c < 0x7F) {
                        os << c;
                        break;
                    }

                    // UTF-8 territory
                    // Check if the encoding is valid and if it is not, hex
                    // escape bytes. Important: We do not check the exact
                    // decoded values for validity, only the encoding format
                    // First check that this bytes is a valid lead byte:
                    // This means that it is not encoded as 1111 1XXX
                    // Or as 10XX XXXX
                    if (c < 0xC0 || c >= 0xF8) {
                        hexEscapeChar(os, c);
                        break;
                    }

                    auto encBytes = trailingBytes(c);
                    // Are there enough bytes left to avoid accessing
                    // out-of-bounds memory?
                    if (idx + encBytes - 1 >= m_str.size()) {
                        hexEscapeChar(os, c);
                        break;
                    }
                    // The header is valid, check data
                    // The next encBytes bytes must together be a valid utf-8
                    // This means: bitpattern 10XX XXXX and the extracted value
                    // is sane (ish)
                    bool valid = true;
                    uint32_t value = headerValue(c);
                    for (std::size_t n = 1; n < encBytes; ++n) {
                        unsigned char nc = m_str[idx + n];
                        valid &= ((nc & 0xC0) == 0x80);
                        value = (value << 6) | (nc & 0x3F);
                    }

                    if (
                        // Wrong bit pattern of following bytes
                        (!valid) ||
                        // Overlong encodings
                        (value < 0x80) || (0x80 <= value && value < 0x800 && encBytes > 2) ||
                        (0x800 < value && value < 0x10000 && encBytes > 3) ||
                        // Encoded value out of range
                        (value >= 0x110000))
                    {
                        hexEscapeChar(os, c);
                        break;
                    }

                    // If we got here, this is in fact a valid(ish) utf-8
                    // sequence
                    for (std::size_t n = 0; n < encBytes; ++n) {
                        os << m_str[idx + n];
                    }
                    idx += encBytes - 1;
                    break;
            }
        }
    }

    std::ostream& operator<<(std::ostream& os, XmlEncode const& xmlEncode) {
        xmlEncode.encodeTo(os);
        return os;
    }

    XmlWriter::ScopedElement::ScopedElement(XmlWriter* writer, XmlFormatting fmt) :
        m_writer(writer), m_fmt(fmt) {}

    XmlWriter::ScopedElement::ScopedElement(ScopedElement&& other) noexcept :
        m_writer(other.m_writer), m_fmt(other.m_fmt) {
        other.m_writer = nullptr;
        other.m_fmt = XmlFormatting::None;
    }
    XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=(ScopedElement&& other) noexcept {
        if (m_writer) {
            m_writer->endElement();
        }
        m_writer = other.m_writer;
        other.m_writer = nullptr;
        m_fmt = other.m_fmt;
        other.m_fmt = XmlFormatting::None;
        return *this;
    }

    XmlWriter::ScopedElement::~ScopedElement() {
        if (m_writer) {
            m_writer->endElement(m_fmt);
        }
    }

    XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText(std::string const& text,
                                                                  XmlFormatting fmt) {
        m_writer->writeText(text, fmt);
        return *this;
    }

    XmlWriter::XmlWriter(std::ostream& os) : m_os(os) { writeDeclaration(); }

    XmlWriter::~XmlWriter() {
        while (!m_tags.empty()) {
            endElement();
        }
        newlineIfNecessary();
    }

    XmlWriter& XmlWriter::startElement(std::string const& name, XmlFormatting fmt) {
        ensureTagClosed();
        newlineIfNecessary();
        if (shouldIndent(fmt)) {
            m_os << m_indent;
            m_indent += "  ";
        }
        m_os << '<' << name;
        m_tags.push_back(name);
        m_tagIsOpen = true;
        applyFormatting(fmt);
        return *this;
    }

    XmlWriter::ScopedElement XmlWriter::scopedElement(std::string const& name, XmlFormatting fmt) {
        ScopedElement scoped(this, fmt);
        startElement(name, fmt);
        return scoped;
    }

    XmlWriter& XmlWriter::endElement(XmlFormatting fmt) {
        m_indent = m_indent.substr(0, m_indent.size() - 2);

        if (m_tagIsOpen) {
            m_os << "/>";
            m_tagIsOpen = false;
        } else {
            newlineIfNecessary();
            if (shouldIndent(fmt)) {
                m_os << m_indent;
            }
            m_os << "</" << m_tags.back() << ">";
        }
        m_os << std::flush;
        applyFormatting(fmt);
        m_tags.pop_back();
        return *this;
    }

    XmlWriter& XmlWriter::writeAttribute(std::string const& name, std::string const& attribute) {
        if (!name.empty() && !attribute.empty())
            m_os << ' ' << name << "=\"" << XmlEncode(attribute, XmlEncode::ForAttributes) << '"';
        return *this;
    }

    XmlWriter& XmlWriter::writeAttribute(std::string const& name, bool attribute) {
        m_os << ' ' << name << "=\"" << (attribute ? "true" : "false") << '"';
        return *this;
    }

    XmlWriter& XmlWriter::writeText(std::string const& text, XmlFormatting fmt) {
        if (!text.empty()) {
            bool tagWasOpen = m_tagIsOpen;
            ensureTagClosed();
            if (tagWasOpen && shouldIndent(fmt)) {
                m_os << m_indent;
            }
            m_os << XmlEncode(text);
            applyFormatting(fmt);
        }
        return *this;
    }

    XmlWriter& XmlWriter::writeComment(std::string const& text, XmlFormatting fmt) {
        ensureTagClosed();
        if (shouldIndent(fmt)) {
            m_os << m_indent;
        }
        m_os << "<!--" << text << "-->";
        applyFormatting(fmt);
        return *this;
    }

    void XmlWriter::writeStylesheetRef(std::string const& url) {
        m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
    }

    XmlWriter& XmlWriter::writeBlankLine() {
        ensureTagClosed();
        m_os << '\n';
        return *this;
    }

    void XmlWriter::ensureTagClosed() {
        if (m_tagIsOpen) {
            m_os << '>' << std::flush;
            newlineIfNecessary();
            m_tagIsOpen = false;
        }
    }

    void XmlWriter::applyFormatting(XmlFormatting fmt) { m_needsNewline = shouldNewline(fmt); }

    void XmlWriter::writeDeclaration() { m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; }

    void XmlWriter::newlineIfNecessary() {
        if (m_needsNewline) {
            m_os << std::endl;
            m_needsNewline = false;
        }
    }
} // namespace Catch
// end catch_xmlwriter.cpp
// start catch_reporter_bases.cpp

#include <cstring>
#include <cfloat>
#include <cstdio>
#include <cassert>
#include <memory>

namespace Catch {
    void prepareExpandedExpression(AssertionResult& result) { result.getExpandedExpression(); }

    // Because formatting using c++ streams is stateful, drop down to C is
    // required Alternatively we could use stringstream, but its performance
    // is... not good.
    std::string getFormattedDuration(double duration) {
        // Max exponent + 1 is required to represent the whole part
        // + 1 for decimal point
        // + 3 for the 3 decimal places
        // + 1 for null terminator
        const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;
        char buffer[maxDoubleSize];

        // Save previous errno, to prevent sprintf from overwriting it
        ErrnoGuard guard;
#ifdef _MSC_VER
        sprintf_s(buffer, "%.3f", duration);
#else
        std::sprintf(buffer, "%.3f", duration);
#endif
        return std::string(buffer);
    }

    bool shouldShowDuration(IConfig const& config, double duration) {
        if (config.showDurations() == ShowDurations::Always) {
            return true;
        }
        if (config.showDurations() == ShowDurations::Never) {
            return false;
        }
        const double min = config.minDuration();
        return min >= 0 && duration >= min;
    }

    std::string serializeFilters(std::vector<std::string> const& container) {
        ReusableStringStream oss;
        bool first = true;
        for (auto&& filter : container) {
            if (!first)
                oss << ' ';
            else
                first = false;

            oss << filter;
        }
        return oss.str();
    }

    TestEventListenerBase::TestEventListenerBase(ReporterConfig const& _config) :
        StreamingReporterBase(_config) {}

    std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() {
        return {Verbosity::Quiet, Verbosity::Normal, Verbosity::High};
    }

    void TestEventListenerBase::assertionStarting(AssertionInfo const&) {}

    bool TestEventListenerBase::assertionEnded(AssertionStats const&) { return false; }

} // end namespace Catch
// end catch_reporter_bases.cpp
// start catch_reporter_compact.cpp

namespace {

#ifdef CATCH_PLATFORM_MAC
    const char* failedString() { return "FAILED"; }
    const char* passedString() { return "PASSED"; }
#else
    const char* failedString() { return "failed"; }
    const char* passedString() { return "passed"; }
#endif

    // Colour::LightGrey
    Catch::Colour::Code dimColour() { return Catch::Colour::FileName; }

    std::string bothOrAll(std::size_t count) {
        return count == 1 ? std::string() : count == 2 ? "both " : "all ";
    }

} // namespace

namespace Catch {
    namespace {
        // Colour, message variants:
        // - white: No tests ran.
        // -   red: Failed [both/all] N test cases, failed [both/all] M
        // assertions.
        // - white: Passed [both/all] N test cases (no assertions).
        // -   red: Failed N tests cases, failed M assertions.
        // - green: Passed [both/all] N tests cases with M assertions.
        void printTotals(std::ostream& out, const Totals& totals) {
            if (totals.testCases.total() == 0) {
                out << "No tests ran.";
            } else if (totals.testCases.failed == totals.testCases.total()) {
                Colour colour(Colour::ResultError);
                const std::string qualify_assertions_failed =
                    totals.assertions.failed == totals.assertions.total()
                        ? bothOrAll(totals.assertions.failed)
                        : std::string();
                out << "Failed " << bothOrAll(totals.testCases.failed)
                    << pluralise(totals.testCases.failed, "test case")
                    << ", "
                       "failed "
                    << qualify_assertions_failed << pluralise(totals.assertions.failed, "assertion")
                    << '.';
            } else if (totals.assertions.total() == 0) {
                out << "Passed " << bothOrAll(totals.testCases.total())
                    << pluralise(totals.testCases.total(), "test case") << " (no assertions).";
            } else if (totals.assertions.failed) {
                Colour colour(Colour::ResultError);
                out << "Failed " << pluralise(totals.testCases.failed, "test case")
                    << ", "
                       "failed "
                    << pluralise(totals.assertions.failed, "assertion") << '.';
            } else {
                Colour colour(Colour::ResultSuccess);
                out << "Passed " << bothOrAll(totals.testCases.passed)
                    << pluralise(totals.testCases.passed, "test case") << " with "
                    << pluralise(totals.assertions.passed, "assertion") << '.';
            }
        }

        // Implementation of CompactReporter formatting
        class AssertionPrinter {
        public:
            AssertionPrinter& operator=(AssertionPrinter const&) = delete;
            AssertionPrinter(AssertionPrinter const&) = delete;
            AssertionPrinter(std::ostream& _stream,
                             AssertionStats const& _stats,
                             bool _printInfoMessages) :
                stream(_stream),
                result(_stats.assertionResult),
                messages(_stats.infoMessages),
                itMessage(_stats.infoMessages.begin()),
                printInfoMessages(_printInfoMessages) {}

            void print() {
                printSourceInfo();

                itMessage = messages.begin();

                switch (result.getResultType()) {
                    case ResultWas::Ok:
                        printResultType(Colour::ResultSuccess, passedString());
                        printOriginalExpression();
                        printReconstructedExpression();
                        if (!result.hasExpression())
                            printRemainingMessages(Colour::None);
                        else
                            printRemainingMessages();
                        break;
                    case ResultWas::ExpressionFailed:
                        if (result.isOk())
                            printResultType(Colour::ResultSuccess,
                                            failedString() + std::string(" - but was ok"));
                        else
                            printResultType(Colour::Error, failedString());
                        printOriginalExpression();
                        printReconstructedExpression();
                        printRemainingMessages();
                        break;
                    case ResultWas::ThrewException:
                        printResultType(Colour::Error, failedString());
                        printIssue("unexpected exception with message:");
                        printMessage();
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::FatalErrorCondition:
                        printResultType(Colour::Error, failedString());
                        printIssue("fatal error condition with message:");
                        printMessage();
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::DidntThrowException:
                        printResultType(Colour::Error, failedString());
                        printIssue("expected exception, got none");
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::Info:
                        printResultType(Colour::None, "info");
                        printMessage();
                        printRemainingMessages();
                        break;
                    case ResultWas::Warning:
                        printResultType(Colour::None, "warning");
                        printMessage();
                        printRemainingMessages();
                        break;
                    case ResultWas::ExplicitFailure:
                        printResultType(Colour::Error, failedString());
                        printIssue("explicitly");
                        printRemainingMessages(Colour::None);
                        break;
                        // These cases are here to prevent compiler warnings
                    case ResultWas::Unknown:
                    case ResultWas::FailureBit:
                    case ResultWas::Exception:
                        printResultType(Colour::Error, "** internal error **");
                        break;
                }
            }

        private:
            void printSourceInfo() const {
                Colour colourGuard(Colour::FileName);
                stream << result.getSourceInfo() << ':';
            }

            void printResultType(Colour::Code colour, std::string const& passOrFail) const {
                if (!passOrFail.empty()) {
                    {
                        Colour colourGuard(colour);
                        stream << ' ' << passOrFail;
                    }
                    stream << ':';
                }
            }

            void printIssue(std::string const& issue) const { stream << ' ' << issue; }

            void printExpressionWas() {
                if (result.hasExpression()) {
                    stream << ';';
                    {
                        Colour colour(dimColour());
                        stream << " expression was:";
                    }
                    printOriginalExpression();
                }
            }

            void printOriginalExpression() const {
                if (result.hasExpression()) {
                    stream << ' ' << result.getExpression();
                }
            }

            void printReconstructedExpression() const {
                if (result.hasExpandedExpression()) {
                    {
                        Colour colour(dimColour());
                        stream << " for: ";
                    }
                    stream << result.getExpandedExpression();
                }
            }

            void printMessage() {
                if (itMessage != messages.end()) {
                    stream << " '" << itMessage->message << '\'';
                    ++itMessage;
                }
            }

            void printRemainingMessages(Colour::Code colour = dimColour()) {
                if (itMessage == messages.end())
                    return;

                const auto itEnd = messages.cend();
                const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd));

                {
                    Colour colourGuard(colour);
                    stream << " with " << pluralise(N, "message") << ':';
                }

                while (itMessage != itEnd) {
                    // If this assertion is a warning ignore any INFO messages
                    if (printInfoMessages || itMessage->type != ResultWas::Info) {
                        printMessage();
                        if (itMessage != itEnd) {
                            Colour colourGuard(dimColour());
                            stream << " and";
                        }
                        continue;
                    }
                    ++itMessage;
                }
            }

        private:
            std::ostream& stream;
            AssertionResult const& result;
            std::vector<MessageInfo> messages;
            std::vector<MessageInfo>::const_iterator itMessage;
            bool printInfoMessages;
        };

    } // namespace

    std::string CompactReporter::getDescription() {
        return "Reports test results on a single line, suitable for IDEs";
    }

    void CompactReporter::noMatchingTestCases(std::string const& spec) {
        stream << "No test cases matched '" << spec << '\'' << std::endl;
    }

    void CompactReporter::assertionStarting(AssertionInfo const&) {}

    bool CompactReporter::assertionEnded(AssertionStats const& _assertionStats) {
        AssertionResult const& result = _assertionStats.assertionResult;

        bool printInfoMessages = true;

        // Drop out if result was successful and we're not printing those
        if (!m_config->includeSuccessfulResults() && result.isOk()) {
            if (result.getResultType() != ResultWas::Warning)
                return false;
            printInfoMessages = false;
        }

        AssertionPrinter printer(stream, _assertionStats, printInfoMessages);
        printer.print();

        stream << std::endl;
        return true;
    }

    void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {
        double dur = _sectionStats.durationInSeconds;
        if (shouldShowDuration(*m_config, dur)) {
            stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name
                   << std::endl;
        }
    }

    void CompactReporter::testRunEnded(TestRunStats const& _testRunStats) {
        printTotals(stream, _testRunStats.totals);
        stream << '\n' << std::endl;
        StreamingReporterBase::testRunEnded(_testRunStats);
    }

    CompactReporter::~CompactReporter() {}

    CATCH_REGISTER_REPORTER("compact", CompactReporter)

} // end namespace Catch
// end catch_reporter_compact.cpp
// start catch_reporter_console.cpp

#include <cfloat>
#include <cstdio>

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in switch
  // Note that 4062 (not all labels are handled and default is missing) is
  // enabled
#endif

#if defined(__clang__)
#pragma clang diagnostic push
// For simplicity, benchmarking-only helpers are always enabled
#pragma clang diagnostic ignored "-Wunused-function"
#endif

namespace Catch {

    namespace {

        // Formatter impl for ConsoleReporter
        class ConsoleAssertionPrinter {
        public:
            ConsoleAssertionPrinter& operator=(ConsoleAssertionPrinter const&) = delete;
            ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete;
            ConsoleAssertionPrinter(std::ostream& _stream,
                                    AssertionStats const& _stats,
                                    bool _printInfoMessages) :
                stream(_stream),
                stats(_stats),
                result(_stats.assertionResult),
                colour(Colour::None),
                message(result.getMessage()),
                messages(_stats.infoMessages),
                printInfoMessages(_printInfoMessages) {
                switch (result.getResultType()) {
                    case ResultWas::Ok:
                        colour = Colour::Success;
                        passOrFail = "PASSED";
                        // if( result.hasMessage() )
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "with messages";
                        break;
                    case ResultWas::ExpressionFailed:
                        if (result.isOk()) {
                            colour = Colour::Success;
                            passOrFail = "FAILED - but was ok";
                        } else {
                            colour = Colour::Error;
                            passOrFail = "FAILED";
                        }
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "with messages";
                        break;
                    case ResultWas::ThrewException:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "due to unexpected exception with ";
                        if (_stats.infoMessages.size() == 1)
                            messageLabel += "message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel += "messages";
                        break;
                    case ResultWas::FatalErrorCondition:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "due to a fatal error condition";
                        break;
                    case ResultWas::DidntThrowException:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "because no exception was thrown where "
                                       "one was expected";
                        break;
                    case ResultWas::Info:
                        messageLabel = "info";
                        break;
                    case ResultWas::Warning:
                        messageLabel = "warning";
                        break;
                    case ResultWas::ExplicitFailure:
                        passOrFail = "FAILED";
                        colour = Colour::Error;
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "explicitly with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "explicitly with messages";
                        break;
                        // These cases are here to prevent compiler warnings
                    case ResultWas::Unknown:
                    case ResultWas::FailureBit:
                    case ResultWas::Exception:
                        passOrFail = "** internal error **";
                        colour = Colour::Error;
                        break;
                }
            }

            void print() const {
                printSourceInfo();
                if (stats.totals.assertions.total() > 0) {
                    printResultType();
                    printOriginalExpression();
                    printReconstructedExpression();
                } else {
                    stream << '\n';
                }
                printMessage();
            }

        private:
            void printResultType() const {
                if (!passOrFail.empty()) {
                    Colour colourGuard(colour);
                    stream << passOrFail << ":\n";
                }
            }
            void printOriginalExpression() const {
                if (result.hasExpression()) {
                    Colour colourGuard(Colour::OriginalExpression);
                    stream << "  ";
                    stream << result.getExpressionInMacro();
                    stream << '\n';
                }
            }
            void printReconstructedExpression() const {
                if (result.hasExpandedExpression()) {
                    stream << "with expansion:\n";
                    Colour colourGuard(Colour::ReconstructedExpression);
                    stream << Column(result.getExpandedExpression()).indent(2) << '\n';
                }
            }
            void printMessage() const {
                if (!messageLabel.empty())
                    stream << messageLabel << ':' << '\n';
                for (auto const& msg : messages) {
                    // If this assertion is a warning ignore any INFO messages
                    if (printInfoMessages || msg.type != ResultWas::Info)
                        stream << Column(msg.message).indent(2) << '\n';
                }
            }
            void printSourceInfo() const {
                Colour colourGuard(Colour::FileName);
                stream << result.getSourceInfo() << ": ";
            }

            std::ostream& stream;
            AssertionStats const& stats;
            AssertionResult const& result;
            Colour::Code colour;
            std::string passOrFail;
            std::string messageLabel;
            std::string message;
            std::vector<MessageInfo> messages;
            bool printInfoMessages;
        };

        std::size_t makeRatio(std::size_t number, std::size_t total) {
            std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;
            return (ratio == 0 && number > 0) ? 1 : ratio;
        }

        std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) {
            if (i > j && i > k)
                return i;
            else if (j > k)
                return j;
            else
                return k;
        }

        struct ColumnInfo {
            enum Justification { Left, Right };
            std::string name;
            int width;
            Justification justification;
        };
        struct ColumnBreak {};
        struct RowBreak {};

        class Duration {
            enum class Unit { Auto, Nanoseconds, Microseconds, Milliseconds, Seconds, Minutes };
            static const uint64_t s_nanosecondsInAMicrosecond = 1000;
            static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond;
            static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;
            static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;

            double m_inNanoseconds;
            Unit m_units;

        public:
            explicit Duration(double inNanoseconds, Unit units = Unit::Auto) :
                m_inNanoseconds(inNanoseconds), m_units(units) {
                if (m_units == Unit::Auto) {
                    if (m_inNanoseconds < s_nanosecondsInAMicrosecond)
                        m_units = Unit::Nanoseconds;
                    else if (m_inNanoseconds < s_nanosecondsInAMillisecond)
                        m_units = Unit::Microseconds;
                    else if (m_inNanoseconds < s_nanosecondsInASecond)
                        m_units = Unit::Milliseconds;
                    else if (m_inNanoseconds < s_nanosecondsInAMinute)
                        m_units = Unit::Seconds;
                    else
                        m_units = Unit::Minutes;
                }
            }

            auto value() const -> double {
                switch (m_units) {
                    case Unit::Microseconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond);
                    case Unit::Milliseconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond);
                    case Unit::Seconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond);
                    case Unit::Minutes:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);
                    default:
                        return m_inNanoseconds;
                }
            }
            auto unitsAsString() const -> std::string {
                switch (m_units) {
                    case Unit::Nanoseconds:
                        return "ns";
                    case Unit::Microseconds:
                        return "us";
                    case Unit::Milliseconds:
                        return "ms";
                    case Unit::Seconds:
                        return "s";
                    case Unit::Minutes:
                        return "m";
                    default:
                        return "** internal error **";
                }
            }
            friend auto operator<<(std::ostream& os, Duration const& duration) -> std::ostream& {
                return os << duration.value() << ' ' << duration.unitsAsString();
            }
        };
    } // namespace

    class TablePrinter {
        std::ostream& m_os;
        std::vector<ColumnInfo> m_columnInfos;
        std::ostringstream m_oss;
        int m_currentColumn = -1;
        bool m_isOpen = false;

    public:
        TablePrinter(std::ostream& os, std::vector<ColumnInfo> columnInfos) :
            m_os(os), m_columnInfos(std::move(columnInfos)) {}

        auto columnInfos() const -> std::vector<ColumnInfo> const& { return m_columnInfos; }

        void open() {
            if (!m_isOpen) {
                m_isOpen = true;
                *this << RowBreak();

                Columns headerCols;
                Spacer spacer(2);
                for (auto const& info : m_columnInfos) {
                    headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));
                    headerCols += spacer;
                }
                m_os << headerCols << '\n';

                m_os << Catch::getLineOfChars<'-'>() << '\n';
            }
        }
        void close() {
            if (m_isOpen) {
                *this << RowBreak();
                m_os << std::endl;
                m_isOpen = false;
            }
        }

        template <typename T> friend TablePrinter& operator<<(TablePrinter& tp, T const& value) {
            tp.m_oss << value;
            return tp;
        }

        friend TablePrinter& operator<<(TablePrinter& tp, ColumnBreak) {
            auto colStr = tp.m_oss.str();
            const auto strSize = colStr.size();
            tp.m_oss.str("");
            tp.open();
            if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {
                tp.m_currentColumn = -1;
                tp.m_os << '\n';
            }
            tp.m_currentColumn++;

            auto colInfo = tp.m_columnInfos[tp.m_currentColumn];
            auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width))
                               ? std::string(colInfo.width - (strSize + 1), ' ')
                               : std::string();
            if (colInfo.justification == ColumnInfo::Left)
                tp.m_os << colStr << padding << ' ';
            else
                tp.m_os << padding << colStr << ' ';
            return tp;
        }

        friend TablePrinter& operator<<(TablePrinter& tp, RowBreak) {
            if (tp.m_currentColumn > 0) {
                tp.m_os << '\n';
                tp.m_currentColumn = -1;
            }
            return tp;
        }
    };

    ConsoleReporter::ConsoleReporter(ReporterConfig const& config) :
        StreamingReporterBase(config),
        m_tablePrinter(new TablePrinter(config.stream(), [&config]() -> std::vector<ColumnInfo> {
            if (config.fullConfig()->benchmarkNoAnalysis()) {
                return {{"benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left},
                        {"     samples", 14, ColumnInfo::Right},
                        {"  iterations", 14, ColumnInfo::Right},
                        {"        mean", 14, ColumnInfo::Right}};
            } else {
                return {{"benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left},
                        {"samples      mean       std dev", 14, ColumnInfo::Right},
                        {"iterations   low mean   low std dev", 14, ColumnInfo::Right},
                        {"estimated    high mean  high std dev", 14, ColumnInfo::Right}};
            }
        }())) {}
    ConsoleReporter::~ConsoleReporter() = default;

    std::string ConsoleReporter::getDescription() {
        return "Reports test results as plain lines of text";
    }

    void ConsoleReporter::noMatchingTestCases(std::string const& spec) {
        stream << "No test cases matched '" << spec << '\'' << std::endl;
    }

    void ConsoleReporter::reportInvalidArguments(std::string const& arg) {
        stream << "Invalid Filter: " << arg << std::endl;
    }

    void ConsoleReporter::assertionStarting(AssertionInfo const&) {}

    bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {
        AssertionResult const& result = _assertionStats.assertionResult;

        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();

        // Drop out if result was successful but we're not printing them.
        if (!includeResults && result.getResultType() != ResultWas::Warning)
            return false;

        lazyPrint();

        ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults);
        printer.print();
        stream << std::endl;
        return true;
    }

    void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) {
        m_tablePrinter->close();
        m_headerPrinted = false;
        StreamingReporterBase::sectionStarting(_sectionInfo);
    }
    void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {
        m_tablePrinter->close();
        if (_sectionStats.missingAssertions) {
            lazyPrint();
            Colour colour(Colour::ResultError);
            if (m_sectionStack.size() > 1)
                stream << "\nNo assertions in section";
            else
                stream << "\nNo assertions in test case";
            stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
        }
        double dur = _sectionStats.durationInSeconds;
        if (shouldShowDuration(*m_config, dur)) {
            stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name
                   << std::endl;
        }
        if (m_headerPrinted) {
            m_headerPrinted = false;
        }
        StreamingReporterBase::sectionEnded(_sectionStats);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void ConsoleReporter::benchmarkPreparing(std::string const& name) {
        lazyPrintWithoutClosingBenchmarkTable();

        auto nameCol = Column(name).width(
            static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));

        bool firstLine = true;
        for (auto line : nameCol) {
            if (!firstLine)
                (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();
            else
                firstLine = false;

            (*m_tablePrinter) << line << ColumnBreak();
        }
    }

    void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {
        (*m_tablePrinter) << info.samples << ColumnBreak() << info.iterations << ColumnBreak();
        if (!m_config->benchmarkNoAnalysis())
            (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak();
    }
    void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {
        if (m_config->benchmarkNoAnalysis()) {
            (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak();
        } else {
            (*m_tablePrinter) << ColumnBreak() << Duration(stats.mean.point.count())
                              << ColumnBreak() << Duration(stats.mean.lower_bound.count())
                              << ColumnBreak() << Duration(stats.mean.upper_bound.count())
                              << ColumnBreak() << ColumnBreak()
                              << Duration(stats.standardDeviation.point.count()) << ColumnBreak()
                              << Duration(stats.standardDeviation.lower_bound.count())
                              << ColumnBreak()
                              << Duration(stats.standardDeviation.upper_bound.count())
                              << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak()
                              << ColumnBreak();
        }
    }

    void ConsoleReporter::benchmarkFailed(std::string const& error) {
        Colour colour(Colour::Red);
        (*m_tablePrinter) << "Benchmark failed (" << error << ')' << ColumnBreak() << RowBreak();
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) {
        m_tablePrinter->close();
        StreamingReporterBase::testCaseEnded(_testCaseStats);
        m_headerPrinted = false;
    }
    void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) {
        if (currentGroupInfo.used) {
            printSummaryDivider();
            stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
            printTotals(_testGroupStats.totals);
            stream << '\n' << std::endl;
        }
        StreamingReporterBase::testGroupEnded(_testGroupStats);
    }
    void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {
        printTotalsDivider(_testRunStats.totals);
        printTotals(_testRunStats.totals);
        stream << std::endl;
        StreamingReporterBase::testRunEnded(_testRunStats);
    }
    void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {
        StreamingReporterBase::testRunStarting(_testInfo);
        printTestFilters();
    }

    void ConsoleReporter::lazyPrint() {

        m_tablePrinter->close();
        lazyPrintWithoutClosingBenchmarkTable();
    }

    void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() {

        if (!currentTestRunInfo.used)
            lazyPrintRunInfo();
        if (!currentGroupInfo.used)
            lazyPrintGroupInfo();

        if (!m_headerPrinted) {
            printTestCaseAndSectionHeader();
            m_headerPrinted = true;
        }
    }
    void ConsoleReporter::lazyPrintRunInfo() {
        stream << '\n' << getLineOfChars<'~'>() << '\n';
        Colour colour(Colour::SecondaryText);
        stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion()
               << " host application.\n"
               << "Run with -? for options\n\n";

        if (m_config->rngSeed() != 0)
            stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";

        currentTestRunInfo.used = true;
    }
    void ConsoleReporter::lazyPrintGroupInfo() {
        if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) {
            printClosedHeader("Group: " + currentGroupInfo->name);
            currentGroupInfo.used = true;
        }
    }
    void ConsoleReporter::printTestCaseAndSectionHeader() {
        assert(!m_sectionStack.empty());
        printOpenHeader(currentTestCaseInfo->name);

        if (m_sectionStack.size() > 1) {
            Colour colourGuard(Colour::Headers);

            auto it = m_sectionStack.begin() + 1, // Skip first section (test case)
                itEnd = m_sectionStack.end();
            for (; it != itEnd; ++it)
                printHeaderString(it->name, 2);
        }

        SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;

        stream << getLineOfChars<'-'>() << '\n';
        Colour colourGuard(Colour::FileName);
        stream << lineInfo << '\n';
        stream << getLineOfChars<'.'>() << '\n' << std::endl;
    }

    void ConsoleReporter::printClosedHeader(std::string const& _name) {
        printOpenHeader(_name);
        stream << getLineOfChars<'.'>() << '\n';
    }
    void ConsoleReporter::printOpenHeader(std::string const& _name) {
        stream << getLineOfChars<'-'>() << '\n';
        {
            Colour colourGuard(Colour::Headers);
            printHeaderString(_name);
        }
    }

    // if string has a : in first line will set indent to follow it on
    // subsequent lines
    void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) {
        std::size_t i = _string.find(": ");
        if (i != std::string::npos)
            i += 2;
        else
            i = 0;
        stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n';
    }

    struct SummaryColumn {

        SummaryColumn(std::string _label, Colour::Code _colour) :
            label(std::move(_label)), colour(_colour) {}
        SummaryColumn addRow(std::size_t count) {
            ReusableStringStream rss;
            rss << count;
            std::string row = rss.str();
            for (auto& oldRow : rows) {
                while (oldRow.size() < row.size())
                    oldRow = ' ' + oldRow;
                while (oldRow.size() > row.size())
                    row = ' ' + row;
            }
            rows.push_back(row);
            return *this;
        }

        std::string label;
        Colour::Code colour;
        std::vector<std::string> rows;
    };

    void ConsoleReporter::printTotals(Totals const& totals) {
        if (totals.testCases.total() == 0) {
            stream << Colour(Colour::Warning) << "No tests ran\n";
        } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) {
            stream << Colour(Colour::ResultSuccess) << "All tests passed";
            stream << " (" << pluralise(totals.assertions.passed, "assertion") << " in "
                   << pluralise(totals.testCases.passed, "test case") << ')' << '\n';
        } else {

            std::vector<SummaryColumn> columns;
            columns.push_back(SummaryColumn("", Colour::None)
                                  .addRow(totals.testCases.total())
                                  .addRow(totals.assertions.total()));
            columns.push_back(SummaryColumn("passed", Colour::Success)
                                  .addRow(totals.testCases.passed)
                                  .addRow(totals.assertions.passed));
            columns.push_back(SummaryColumn("failed", Colour::ResultError)
                                  .addRow(totals.testCases.failed)
                                  .addRow(totals.assertions.failed));
            columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure)
                                  .addRow(totals.testCases.failedButOk)
                                  .addRow(totals.assertions.failedButOk));

            printSummaryRow("test cases", columns, 0);
            printSummaryRow("assertions", columns, 1);
        }
    }
    void ConsoleReporter::printSummaryRow(std::string const& label,
                                          std::vector<SummaryColumn> const& cols,
                                          std::size_t row) {
        for (auto col : cols) {
            std::string value = col.rows[row];
            if (col.label.empty()) {
                stream << label << ": ";
                if (value != "0")
                    stream << value;
                else
                    stream << Colour(Colour::Warning) << "- none -";
            } else if (value != "0") {
                stream << Colour(Colour::LightGrey) << " | ";
                stream << Colour(col.colour) << value << ' ' << col.label;
            }
        }
        stream << '\n';
    }

    void ConsoleReporter::printTotalsDivider(Totals const& totals) {
        if (totals.testCases.total() > 0) {
            std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());
            std::size_t failedButOkRatio =
                makeRatio(totals.testCases.failedButOk, totals.testCases.total());
            std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());
            while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)
                findMax(failedRatio, failedButOkRatio, passedRatio)++;
            while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)
                findMax(failedRatio, failedButOkRatio, passedRatio)--;

            stream << Colour(Colour::Error) << std::string(failedRatio, '=');
            stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');
            if (totals.testCases.allPassed())
                stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');
            else
                stream << Colour(Colour::Success) << std::string(passedRatio, '=');
        } else {
            stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');
        }
        stream << '\n';
    }
    void ConsoleReporter::printSummaryDivider() { stream << getLineOfChars<'-'>() << '\n'; }

    void ConsoleReporter::printTestFilters() {
        if (m_config->testSpec().hasFilters()) {
            Colour guard(Colour::BrightYellow);
            stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n';
        }
    }

    CATCH_REGISTER_REPORTER("console", ConsoleReporter)

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

#if defined(__clang__)
#pragma clang diagnostic pop
#endif
// end catch_reporter_console.cpp
// start catch_reporter_junit.cpp

#include <cassert>
#include <sstream>
#include <ctime>
#include <algorithm>
#include <iomanip>

namespace Catch {

    namespace {
        std::string getCurrentTimestamp() {
            // Beware, this is not reentrant because of backward compatibility
            // issues Also, UTC only, again because of backward compatibility
            // (%z is C++11)
            time_t rawtime;
            std::time(&rawtime);
            auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");

#ifdef _MSC_VER
            std::tm timeInfo = {};
            gmtime_s(&timeInfo, &rawtime);
#else
            std::tm* timeInfo;
            timeInfo = std::gmtime(&rawtime);
#endif

            char timeStamp[timeStampSize];
            const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";

#ifdef _MSC_VER
            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
#else
            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
#endif
            return std::string(timeStamp, timeStampSize - 1);
        }

        std::string fileNameTag(const std::vector<std::string>& tags) {
            auto it = std::find_if(
                begin(tags), end(tags), [](std::string const& tag) { return tag.front() == '#'; });
            if (it != tags.end())
                return it->substr(1);
            return std::string();
        }

        // Formats the duration in seconds to 3 decimal places.
        // This is done because some genius defined Maven Surefire schema
        // in a way that only accepts 3 decimal places, and tools like
        // Jenkins use that schema for validation JUnit reporter output.
        std::string formatDuration(double seconds) {
            ReusableStringStream rss;
            rss << std::fixed << std::setprecision(3) << seconds;
            return rss.str();
        }

    } // anonymous namespace

    JunitReporter::JunitReporter(ReporterConfig const& _config) :
        CumulativeReporterBase(_config), xml(_config.stream()) {
        m_reporterPrefs.shouldRedirectStdOut = true;
        m_reporterPrefs.shouldReportAllAssertions = true;
    }

    JunitReporter::~JunitReporter() {}

    std::string JunitReporter::getDescription() {
        return "Reports test results in an XML format that looks like Ant's "
               "junitreport target";
    }

    void JunitReporter::noMatchingTestCases(std::string const& /*spec*/) {}

    void JunitReporter::testRunStarting(TestRunInfo const& runInfo) {
        CumulativeReporterBase::testRunStarting(runInfo);
        xml.startElement("testsuites");
    }

    void JunitReporter::testGroupStarting(GroupInfo const& groupInfo) {
        suiteTimer.start();
        stdOutForSuite.clear();
        stdErrForSuite.clear();
        unexpectedExceptions = 0;
        CumulativeReporterBase::testGroupStarting(groupInfo);
    }

    void JunitReporter::testCaseStarting(TestCaseInfo const& testCaseInfo) {
        m_okToFail = testCaseInfo.okToFail();
    }

    bool JunitReporter::assertionEnded(AssertionStats const& assertionStats) {
        if (assertionStats.assertionResult.getResultType() == ResultWas::ThrewException &&
            !m_okToFail)
            unexpectedExceptions++;
        return CumulativeReporterBase::assertionEnded(assertionStats);
    }

    void JunitReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        stdOutForSuite += testCaseStats.stdOut;
        stdErrForSuite += testCaseStats.stdErr;
        CumulativeReporterBase::testCaseEnded(testCaseStats);
    }

    void JunitReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        double suiteTime = suiteTimer.getElapsedSeconds();
        CumulativeReporterBase::testGroupEnded(testGroupStats);
        writeGroup(*m_testGroups.back(), suiteTime);
    }

    void JunitReporter::testRunEndedCumulative() { xml.endElement(); }

    void JunitReporter::writeGroup(TestGroupNode const& groupNode, double suiteTime) {
        XmlWriter::ScopedElement e = xml.scopedElement("testsuite");

        TestGroupStats const& stats = groupNode.value;
        xml.writeAttribute("name", stats.groupInfo.name);
        xml.writeAttribute("errors", unexpectedExceptions);
        xml.writeAttribute("failures", stats.totals.assertions.failed - unexpectedExceptions);
        xml.writeAttribute("tests", stats.totals.assertions.total());
        xml.writeAttribute("hostname", "tbd"); // !TBD
        if (m_config->showDurations() == ShowDurations::Never)
            xml.writeAttribute("time", "");
        else
            xml.writeAttribute("time", formatDuration(suiteTime));
        xml.writeAttribute("timestamp", getCurrentTimestamp());

        // Write properties if there are any
        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {
            auto properties = xml.scopedElement("properties");
            if (m_config->hasTestFilters()) {
                xml.scopedElement("property")
                    .writeAttribute("name", "filters")
                    .writeAttribute("value", serializeFilters(m_config->getTestsOrTags()));
            }
            if (m_config->rngSeed() != 0) {
                xml.scopedElement("property")
                    .writeAttribute("name", "random-seed")
                    .writeAttribute("value", m_config->rngSeed());
            }
        }

        // Write test cases
        for (auto const& child : groupNode.children)
            writeTestCase(*child);

        xml.scopedElement("system-out").writeText(trim(stdOutForSuite), XmlFormatting::Newline);
        xml.scopedElement("system-err").writeText(trim(stdErrForSuite), XmlFormatting::Newline);
    }

    void JunitReporter::writeTestCase(TestCaseNode const& testCaseNode) {
        TestCaseStats const& stats = testCaseNode.value;

        // All test cases have exactly one section - which represents the
        // test case itself. That section may have 0-n nested sections
        assert(testCaseNode.children.size() == 1);
        SectionNode const& rootSection = *testCaseNode.children.front();

        std::string className = stats.testInfo.className;

        if (className.empty()) {
            className = fileNameTag(stats.testInfo.tags);
            if (className.empty())
                className = "global";
        }

        if (!m_config->name().empty())
            className = m_config->name() + "." + className;

        writeSection(className, "", rootSection, stats.testInfo.okToFail());
    }

    void JunitReporter::writeSection(std::string const& className,
                                     std::string const& rootName,
                                     SectionNode const& sectionNode,
                                     bool testOkToFail) {
        std::string name = trim(sectionNode.stats.sectionInfo.name);
        if (!rootName.empty())
            name = rootName + '/' + name;

        if (!sectionNode.assertions.empty() || !sectionNode.stdOut.empty() ||
            !sectionNode.stdErr.empty()) {
            XmlWriter::ScopedElement e = xml.scopedElement("testcase");
            if (className.empty()) {
                xml.writeAttribute("classname", name);
                xml.writeAttribute("name", "root");
            } else {
                xml.writeAttribute("classname", className);
                xml.writeAttribute("name", name);
            }
            xml.writeAttribute("time", formatDuration(sectionNode.stats.durationInSeconds));
            // This is not ideal, but it should be enough to mimic gtest's
            // junit output.
            // Ideally the JUnit reporter would also handle `skipTest`
            // events and write those out appropriately.
            xml.writeAttribute("status", "run");

            if (sectionNode.stats.assertions.failedButOk) {
                xml.scopedElement("skipped").writeAttribute("message",
                                                            "TEST_CASE tagged with !mayfail");
            }

            writeAssertions(sectionNode);

            if (!sectionNode.stdOut.empty())
                xml.scopedElement("system-out")
                    .writeText(trim(sectionNode.stdOut), XmlFormatting::Newline);
            if (!sectionNode.stdErr.empty())
                xml.scopedElement("system-err")
                    .writeText(trim(sectionNode.stdErr), XmlFormatting::Newline);
        }
        for (auto const& childNode : sectionNode.childSections)
            if (className.empty())
                writeSection(name, "", *childNode, testOkToFail);
            else
                writeSection(className, name, *childNode, testOkToFail);
    }

    void JunitReporter::writeAssertions(SectionNode const& sectionNode) {
        for (auto const& assertion : sectionNode.assertions)
            writeAssertion(assertion);
    }

    void JunitReporter::writeAssertion(AssertionStats const& stats) {
        AssertionResult const& result = stats.assertionResult;
        if (!result.isOk()) {
            std::string elementName;
            switch (result.getResultType()) {
                case ResultWas::ThrewException:
                case ResultWas::FatalErrorCondition:
                    elementName = "error";
                    break;
                case ResultWas::ExplicitFailure:
                case ResultWas::ExpressionFailed:
                case ResultWas::DidntThrowException:
                    elementName = "failure";
                    break;

                // We should never see these here:
                case ResultWas::Info:
                case ResultWas::Warning:
                case ResultWas::Ok:
                case ResultWas::Unknown:
                case ResultWas::FailureBit:
                case ResultWas::Exception:
                    elementName = "internalError";
                    break;
            }

            XmlWriter::ScopedElement e = xml.scopedElement(elementName);

            xml.writeAttribute("message", result.getExpression());
            xml.writeAttribute("type", result.getTestMacroName());

            ReusableStringStream rss;
            if (stats.totals.assertions.total() > 0) {
                rss << "FAILED"
                    << ":\n";
                if (result.hasExpression()) {
                    rss << "  ";
                    rss << result.getExpressionInMacro();
                    rss << '\n';
                }
                if (result.hasExpandedExpression()) {
                    rss << "with expansion:\n";
                    rss << Column(result.getExpandedExpression()).indent(2) << '\n';
                }
            } else {
                rss << '\n';
            }

            if (!result.getMessage().empty())
                rss << result.getMessage() << '\n';
            for (auto const& msg : stats.infoMessages)
                if (msg.type == ResultWas::Info)
                    rss << msg.message << '\n';

            rss << "at " << result.getSourceInfo();
            xml.writeText(rss.str(), XmlFormatting::Newline);
        }
    }

    CATCH_REGISTER_REPORTER("junit", JunitReporter)

} // end namespace Catch
// end catch_reporter_junit.cpp
// start catch_reporter_listening.cpp

#include <cassert>

namespace Catch {

    ListeningReporter::ListeningReporter() {
        // We will assume that listeners will always want all assertions
        m_preferences.shouldReportAllAssertions = true;
    }

    void ListeningReporter::addListener(IStreamingReporterPtr&& listener) {
        m_listeners.push_back(std::move(listener));
    }

    void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) {
        assert(!m_reporter && "Listening reporter can wrap only 1 real reporter");
        m_reporter = std::move(reporter);
        m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut;
    }

    ReporterPreferences ListeningReporter::getPreferences() const { return m_preferences; }

    std::set<Verbosity> ListeningReporter::getSupportedVerbosities() {
        return std::set<Verbosity>{};
    }

    void ListeningReporter::noMatchingTestCases(std::string const& spec) {
        for (auto const& listener : m_listeners) {
            listener->noMatchingTestCases(spec);
        }
        m_reporter->noMatchingTestCases(spec);
    }

    void ListeningReporter::reportInvalidArguments(std::string const& arg) {
        for (auto const& listener : m_listeners) {
            listener->reportInvalidArguments(arg);
        }
        m_reporter->reportInvalidArguments(arg);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void ListeningReporter::benchmarkPreparing(std::string const& name) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkPreparing(name);
        }
        m_reporter->benchmarkPreparing(name);
    }
    void ListeningReporter::benchmarkStarting(BenchmarkInfo const& benchmarkInfo) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkStarting(benchmarkInfo);
        }
        m_reporter->benchmarkStarting(benchmarkInfo);
    }
    void ListeningReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkEnded(benchmarkStats);
        }
        m_reporter->benchmarkEnded(benchmarkStats);
    }

    void ListeningReporter::benchmarkFailed(std::string const& error) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkFailed(error);
        }
        m_reporter->benchmarkFailed(error);
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void ListeningReporter::testRunStarting(TestRunInfo const& testRunInfo) {
        for (auto const& listener : m_listeners) {
            listener->testRunStarting(testRunInfo);
        }
        m_reporter->testRunStarting(testRunInfo);
    }

    void ListeningReporter::testGroupStarting(GroupInfo const& groupInfo) {
        for (auto const& listener : m_listeners) {
            listener->testGroupStarting(groupInfo);
        }
        m_reporter->testGroupStarting(groupInfo);
    }

    void ListeningReporter::testCaseStarting(TestCaseInfo const& testInfo) {
        for (auto const& listener : m_listeners) {
            listener->testCaseStarting(testInfo);
        }
        m_reporter->testCaseStarting(testInfo);
    }

    void ListeningReporter::sectionStarting(SectionInfo const& sectionInfo) {
        for (auto const& listener : m_listeners) {
            listener->sectionStarting(sectionInfo);
        }
        m_reporter->sectionStarting(sectionInfo);
    }

    void ListeningReporter::assertionStarting(AssertionInfo const& assertionInfo) {
        for (auto const& listener : m_listeners) {
            listener->assertionStarting(assertionInfo);
        }
        m_reporter->assertionStarting(assertionInfo);
    }

    // The return value indicates if the messages buffer should be cleared:
    bool ListeningReporter::assertionEnded(AssertionStats const& assertionStats) {
        for (auto const& listener : m_listeners) {
            static_cast<void>(listener->assertionEnded(assertionStats));
        }
        return m_reporter->assertionEnded(assertionStats);
    }

    void ListeningReporter::sectionEnded(SectionStats const& sectionStats) {
        for (auto const& listener : m_listeners) {
            listener->sectionEnded(sectionStats);
        }
        m_reporter->sectionEnded(sectionStats);
    }

    void ListeningReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        for (auto const& listener : m_listeners) {
            listener->testCaseEnded(testCaseStats);
        }
        m_reporter->testCaseEnded(testCaseStats);
    }

    void ListeningReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        for (auto const& listener : m_listeners) {
            listener->testGroupEnded(testGroupStats);
        }
        m_reporter->testGroupEnded(testGroupStats);
    }

    void ListeningReporter::testRunEnded(TestRunStats const& testRunStats) {
        for (auto const& listener : m_listeners) {
            listener->testRunEnded(testRunStats);
        }
        m_reporter->testRunEnded(testRunStats);
    }

    void ListeningReporter::skipTest(TestCaseInfo const& testInfo) {
        for (auto const& listener : m_listeners) {
            listener->skipTest(testInfo);
        }
        m_reporter->skipTest(testInfo);
    }

    bool ListeningReporter::isMulti() const { return true; }

} // end namespace Catch
// end catch_reporter_listening.cpp
// start catch_reporter_xml.cpp

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in
                                // switch Note that 4062 (not all labels are
                                // handled and default is missing) is enabled
#endif

namespace Catch {
    XmlReporter::XmlReporter(ReporterConfig const& _config) :
        StreamingReporterBase(_config), m_xml(_config.stream()) {
        m_reporterPrefs.shouldRedirectStdOut = true;
        m_reporterPrefs.shouldReportAllAssertions = true;
    }

    XmlReporter::~XmlReporter() = default;

    std::string XmlReporter::getDescription() { return "Reports test results as an XML document"; }

    std::string XmlReporter::getStylesheetRef() const { return std::string(); }

    void XmlReporter::writeSourceInfo(SourceLineInfo const& sourceInfo) {
        m_xml.writeAttribute("filename", sourceInfo.file).writeAttribute("line", sourceInfo.line);
    }

    void XmlReporter::noMatchingTestCases(std::string const& s) {
        StreamingReporterBase::noMatchingTestCases(s);
    }

    void XmlReporter::testRunStarting(TestRunInfo const& testInfo) {
        StreamingReporterBase::testRunStarting(testInfo);
        std::string stylesheetRef = getStylesheetRef();
        if (!stylesheetRef.empty())
            m_xml.writeStylesheetRef(stylesheetRef);
        m_xml.startElement("Catch");
        if (!m_config->name().empty())
            m_xml.writeAttribute("name", m_config->name());
        if (m_config->testSpec().hasFilters())
            m_xml.writeAttribute("filters", serializeFilters(m_config->getTestsOrTags()));
        if (m_config->rngSeed() != 0)
            m_xml.scopedElement("Randomness").writeAttribute("seed", m_config->rngSeed());
    }

    void XmlReporter::testGroupStarting(GroupInfo const& groupInfo) {
        StreamingReporterBase::testGroupStarting(groupInfo);
        m_xml.startElement("Group").writeAttribute("name", groupInfo.name);
    }

    void XmlReporter::testCaseStarting(TestCaseInfo const& testInfo) {
        StreamingReporterBase::testCaseStarting(testInfo);
        m_xml.startElement("TestCase")
            .writeAttribute("name", trim(testInfo.name))
            .writeAttribute("description", testInfo.description)
            .writeAttribute("tags", testInfo.tagsAsString());

        writeSourceInfo(testInfo.lineInfo);

        if (m_config->showDurations() == ShowDurations::Always)
            m_testCaseTimer.start();
        m_xml.ensureTagClosed();
    }

    void XmlReporter::sectionStarting(SectionInfo const& sectionInfo) {
        StreamingReporterBase::sectionStarting(sectionInfo);
        if (m_sectionDepth++ > 0) {
            m_xml.startElement("Section").writeAttribute("name", trim(sectionInfo.name));
            writeSourceInfo(sectionInfo.lineInfo);
            m_xml.ensureTagClosed();
        }
    }

    void XmlReporter::assertionStarting(AssertionInfo const&) {}

    bool XmlReporter::assertionEnded(AssertionStats const& assertionStats) {

        AssertionResult const& result = assertionStats.assertionResult;

        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();

        if (includeResults || result.getResultType() == ResultWas::Warning) {
            // Print any info messages in <Info> tags.
            for (auto const& msg : assertionStats.infoMessages) {
                if (msg.type == ResultWas::Info && includeResults) {
                    m_xml.scopedElement("Info").writeText(msg.message);
                } else if (msg.type == ResultWas::Warning) {
                    m_xml.scopedElement("Warning").writeText(msg.message);
                }
            }
        }

        // Drop out if result was successful but we're not printing them.
        if (!includeResults && result.getResultType() != ResultWas::Warning)
            return true;

        // Print the expression if there is one.
        if (result.hasExpression()) {
            m_xml.startElement("Expression")
                .writeAttribute("success", result.succeeded())
                .writeAttribute("type", result.getTestMacroName());

            writeSourceInfo(result.getSourceInfo());

            m_xml.scopedElement("Original").writeText(result.getExpression());
            m_xml.scopedElement("Expanded").writeText(result.getExpandedExpression());
        }

        // And... Print a result applicable to each result type.
        switch (result.getResultType()) {
            case ResultWas::ThrewException:
                m_xml.startElement("Exception");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            case ResultWas::FatalErrorCondition:
                m_xml.startElement("FatalErrorCondition");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            case ResultWas::Info:
                m_xml.scopedElement("Info").writeText(result.getMessage());
                break;
            case ResultWas::Warning:
                // Warning will already have been written
                break;
            case ResultWas::ExplicitFailure:
                m_xml.startElement("Failure");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            default:
                break;
        }

        if (result.hasExpression())
            m_xml.endElement();

        return true;
    }

    void XmlReporter::sectionEnded(SectionStats const& sectionStats) {
        StreamingReporterBase::sectionEnded(sectionStats);
        if (--m_sectionDepth > 0) {
            XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResults");
            e.writeAttribute("successes", sectionStats.assertions.passed);
            e.writeAttribute("failures", sectionStats.assertions.failed);
            e.writeAttribute("expectedFailures", sectionStats.assertions.failedButOk);

            if (m_config->showDurations() == ShowDurations::Always)
                e.writeAttribute("durationInSeconds", sectionStats.durationInSeconds);

            m_xml.endElement();
        }
    }

    void XmlReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        StreamingReporterBase::testCaseEnded(testCaseStats);
        XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResult");
        e.writeAttribute("success", testCaseStats.totals.assertions.allOk());

        if (m_config->showDurations() == ShowDurations::Always)
            e.writeAttribute("durationInSeconds", m_testCaseTimer.getElapsedSeconds());

        if (!testCaseStats.stdOut.empty())
            m_xml.scopedElement("StdOut").writeText(trim(testCaseStats.stdOut),
                                                    XmlFormatting::Newline);
        if (!testCaseStats.stdErr.empty())
            m_xml.scopedElement("StdErr").writeText(trim(testCaseStats.stdErr),
                                                    XmlFormatting::Newline);

        m_xml.endElement();
    }

    void XmlReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        StreamingReporterBase::testGroupEnded(testGroupStats);
        // TODO: Check testGroupStats.aborting and act accordingly.
        m_xml.scopedElement("OverallResults")
            .writeAttribute("successes", testGroupStats.totals.assertions.passed)
            .writeAttribute("failures", testGroupStats.totals.assertions.failed)
            .writeAttribute("expectedFailures", testGroupStats.totals.assertions.failedButOk);
        m_xml.scopedElement("OverallResultsCases")
            .writeAttribute("successes", testGroupStats.totals.testCases.passed)
            .writeAttribute("failures", testGroupStats.totals.testCases.failed)
            .writeAttribute("expectedFailures", testGroupStats.totals.testCases.failedButOk);
        m_xml.endElement();
    }

    void XmlReporter::testRunEnded(TestRunStats const& testRunStats) {
        StreamingReporterBase::testRunEnded(testRunStats);
        m_xml.scopedElement("OverallResults")
            .writeAttribute("successes", testRunStats.totals.assertions.passed)
            .writeAttribute("failures", testRunStats.totals.assertions.failed)
            .writeAttribute("expectedFailures", testRunStats.totals.assertions.failedButOk);
        m_xml.scopedElement("OverallResultsCases")
            .writeAttribute("successes", testRunStats.totals.testCases.passed)
            .writeAttribute("failures", testRunStats.totals.testCases.failed)
            .writeAttribute("expectedFailures", testRunStats.totals.testCases.failedButOk);
        m_xml.endElement();
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void XmlReporter::benchmarkPreparing(std::string const& name) {
        m_xml.startElement("BenchmarkResults").writeAttribute("name", name);
    }

    void XmlReporter::benchmarkStarting(BenchmarkInfo const& info) {
        m_xml.writeAttribute("samples", info.samples)
            .writeAttribute("resamples", info.resamples)
            .writeAttribute("iterations", info.iterations)
            .writeAttribute("clockResolution", info.clockResolution)
            .writeAttribute("estimatedDuration", info.estimatedDuration)
            .writeComment("All values in nano seconds");
    }

    void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
        m_xml.startElement("mean")
            .writeAttribute("value", benchmarkStats.mean.point.count())
            .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count())
            .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count())
            .writeAttribute("ci", benchmarkStats.mean.confidence_interval);
        m_xml.endElement();
        m_xml.startElement("standardDeviation")
            .writeAttribute("value", benchmarkStats.standardDeviation.point.count())
            .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count())
            .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count())
            .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval);
        m_xml.endElement();
        m_xml.startElement("outliers")
            .writeAttribute("variance", benchmarkStats.outlierVariance)
            .writeAttribute("lowMild", benchmarkStats.outliers.low_mild)
            .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe)
            .writeAttribute("highMild", benchmarkStats.outliers.high_mild)
            .writeAttribute("highSevere", benchmarkStats.outliers.high_severe);
        m_xml.endElement();
        m_xml.endElement();
    }

    void XmlReporter::benchmarkFailed(std::string const& error) {
        m_xml.scopedElement("failed").writeAttribute("message", error);
        m_xml.endElement();
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    CATCH_REGISTER_REPORTER("xml", XmlReporter)

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif
// end catch_reporter_xml.cpp

namespace Catch {
    LeakDetector leakDetector;
}

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_impl.hpp
#endif

#ifdef CATCH_CONFIG_MAIN
// start catch_default_main.hpp

#ifndef __OBJC__

#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) &&         \
    !defined(DO_NOT_USE_WMAIN)
// Standard C/C++ Win32 Unicode wmain entry point
extern "C" int wmain(int argc, wchar_t* argv[], wchar_t*[]) {
#else
// Standard C/C++ main entry point
int main(int argc, char* argv[]) {
#endif

    return Catch::Session().run(argc, argv);
}

#else // __OBJC__

// Objective-C entry point
int main(int argc, char* const argv[]) {
#if !CATCH_ARC_ENABLED
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
#endif

    Catch::registerTestMethods();
    int result = Catch::Session().run(argc, (char**)argv);

#if !CATCH_ARC_ENABLED
    [pool drain];
#endif

    return result;
}

#endif // __OBJC__

// end catch_default_main.hpp
#endif

#if !defined(CATCH_CONFIG_IMPL_ONLY)

#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
#undef CLARA_CONFIG_MAIN
#endif

#if !defined(CATCH_CONFIG_DISABLE)
//////
// If this config identifier is defined then all CATCH macros are prefixed with
// CATCH_
#ifdef CATCH_CONFIG_PREFIX_ALL

#define CATCH_REQUIRE(...)                                                                         \
    INTERNAL_CATCH_TEST("CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define CATCH_REQUIRE_FALSE(...)                                                                   \
    INTERNAL_CATCH_TEST("CATCH_REQUIRE_FALSE",                                                     \
                        Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest,    \
                        __VA_ARGS__)

#define CATCH_REQUIRE_THROWS(...)                                                                  \
    INTERNAL_CATCH_THROWS("CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define CATCH_REQUIRE_THROWS_AS(expr, exceptionType)                                               \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr)
#define CATCH_REQUIRE_THROWS_WITH(expr, matcher)                                                   \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher)                                 \
    INTERNAL_CATCH_THROWS_MATCHES("CATCH_REQUIRE_THROWS_MATCHES",                                  \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::Normal,                                \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW(...)                                                                 \
    INTERNAL_CATCH_NO_THROW("CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__)

#define CATCH_CHECK(...)                                                                           \
    INTERNAL_CATCH_TEST("CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_FALSE(...)                                                                     \
    INTERNAL_CATCH_TEST("CATCH_CHECK_FALSE",                                                       \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::FalseTest,                                   \
                        __VA_ARGS__)
#define CATCH_CHECKED_IF(...)                                                                      \
    INTERNAL_CATCH_IF("CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECKED_ELSE(...)                                                                    \
    INTERNAL_CATCH_ELSE(                                                                           \
        "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_NOFAIL(...)                                                                    \
    INTERNAL_CATCH_TEST("CATCH_CHECK_NOFAIL",                                                      \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::SuppressFail,                                \
                        __VA_ARGS__)

#define CATCH_CHECK_THROWS(...)                                                                    \
    INTERNAL_CATCH_THROWS(                                                                         \
        "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_THROWS_AS(expr, exceptionType)                                                 \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr)
#define CATCH_CHECK_THROWS_WITH(expr, matcher)                                                     \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES(expr, exceptionType, matcher)                                   \
    INTERNAL_CATCH_THROWS_MATCHES("CATCH_CHECK_THROWS_MATCHES",                                    \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::ContinueOnFailure,                     \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW(...)                                                                   \
    INTERNAL_CATCH_NO_THROW(                                                                       \
        "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THAT(arg, matcher)                                                             \
    INTERNAL_CHECK_THAT(                                                                           \
        "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg)

#define CATCH_REQUIRE_THAT(arg, matcher)                                                           \
    INTERNAL_CHECK_THAT("CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define CATCH_INFO(msg) INTERNAL_CATCH_INFO("CATCH_INFO", msg)
#define CATCH_UNSCOPED_INFO(msg) INTERNAL_CATCH_UNSCOPED_INFO("CATCH_UNSCOPED_INFO", msg)
#define CATCH_WARN(msg)                                                                            \
    INTERNAL_CATCH_MSG(                                                                            \
        "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg)
#define CATCH_CAPTURE(...)                                                                         \
    INTERNAL_CATCH_CAPTURE(INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE", __VA_ARGS__)

#define CATCH_TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
#define CATCH_TEST_CASE_METHOD(className, ...)                                                     \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_METHOD_AS_TEST_CASE(method, ...)                                                     \
    INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
#define CATCH_REGISTER_TEST_CASE(Function, ...)                                                    \
    INTERNAL_CATCH_REGISTER_TESTCASE(Function, __VA_ARGS__)
#define CATCH_SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
#define CATCH_DYNAMIC_SECTION(...) INTERNAL_CATCH_DYNAMIC_SECTION(__VA_ARGS__)
#define CATCH_FAIL(...)                                                                            \
    INTERNAL_CATCH_MSG("CATCH_FAIL",                                                               \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::Normal,                                           \
                       __VA_ARGS__)
#define CATCH_FAIL_CHECK(...)                                                                      \
    INTERNAL_CATCH_MSG("CATCH_FAIL_CHECK",                                                         \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)
#define CATCH_SUCCEED(...)                                                                         \
    INTERNAL_CATCH_MSG("CATCH_SUCCEED",                                                            \
                       Catch::ResultWas::Ok,                                                       \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)

#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define CATCH_TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_SIG(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                  \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#else
#define CATCH_TEMPLATE_TEST_CASE(...)                                                              \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...)                                                      \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#endif

#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
#define CATCH_STATIC_REQUIRE(...)                                                                  \
    static_assert(__VA_ARGS__, #__VA_ARGS__);                                                      \
    CATCH_SUCCEED(#__VA_ARGS__)
#define CATCH_STATIC_REQUIRE_FALSE(...)                                                            \
    static_assert(!(__VA_ARGS__), "!(" #__VA_ARGS__ ")");                                          \
    CATCH_SUCCEED(#__VA_ARGS__)
#else
#define CATCH_STATIC_REQUIRE(...) CATCH_REQUIRE(__VA_ARGS__)
#define CATCH_STATIC_REQUIRE_FALSE(...) CATCH_REQUIRE_FALSE(__VA_ARGS__)
#endif

// "BDD-style" convenience wrappers
#define CATCH_SCENARIO(...) CATCH_TEST_CASE("Scenario: " __VA_ARGS__)
#define CATCH_SCENARIO_METHOD(className, ...)                                                      \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)
#define CATCH_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("    Given: " << desc)
#define CATCH_AND_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("And given: " << desc)
#define CATCH_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     When: " << desc)
#define CATCH_AND_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION(" And when: " << desc)
#define CATCH_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     Then: " << desc)
#define CATCH_AND_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("      And: " << desc)

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
#define CATCH_BENCHMARK(...)                                                                       \
    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),           \
                             INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__, , ),                            \
                             INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__, , ))
#define CATCH_BENCHMARK_ADVANCED(name)                                                             \
    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),  \
                                      name)
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not
// required
#else

#define REQUIRE(...) INTERNAL_CATCH_TEST("REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define REQUIRE_FALSE(...)                                                                         \
    INTERNAL_CATCH_TEST("REQUIRE_FALSE",                                                           \
                        Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest,    \
                        __VA_ARGS__)

#define REQUIRE_THROWS(...)                                                                        \
    INTERNAL_CATCH_THROWS("REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define REQUIRE_THROWS_AS(expr, exceptionType)                                                     \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr)
#define REQUIRE_THROWS_WITH(expr, matcher)                                                         \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher)                                       \
    INTERNAL_CATCH_THROWS_MATCHES(                                                                 \
        "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define REQUIRE_NOTHROW(...)                                                                       \
    INTERNAL_CATCH_NO_THROW("REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__)

#define CHECK(...)                                                                                 \
    INTERNAL_CATCH_TEST("CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_FALSE(...)                                                                           \
    INTERNAL_CATCH_TEST("CHECK_FALSE",                                                             \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::FalseTest,                                   \
                        __VA_ARGS__)
#define CHECKED_IF(...)                                                                            \
    INTERNAL_CATCH_IF("CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECKED_ELSE(...)                                                                          \
    INTERNAL_CATCH_ELSE("CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_NOFAIL(...)                                                                          \
    INTERNAL_CATCH_TEST("CHECK_NOFAIL",                                                            \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::SuppressFail,                                \
                        __VA_ARGS__)

#define CHECK_THROWS(...)                                                                          \
    INTERNAL_CATCH_THROWS("CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_THROWS_AS(expr, exceptionType)                                                       \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr)
#define CHECK_THROWS_WITH(expr, matcher)                                                           \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_MATCHES(expr, exceptionType, matcher)                                         \
    INTERNAL_CATCH_THROWS_MATCHES("CHECK_THROWS_MATCHES",                                          \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::ContinueOnFailure,                     \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CHECK_NOTHROW(...)                                                                         \
    INTERNAL_CATCH_NO_THROW(                                                                       \
        "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THAT(arg, matcher)                                                                   \
    INTERNAL_CHECK_THAT("CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg)

#define REQUIRE_THAT(arg, matcher)                                                                 \
    INTERNAL_CHECK_THAT("REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define INFO(msg) INTERNAL_CATCH_INFO("INFO", msg)
#define UNSCOPED_INFO(msg) INTERNAL_CATCH_UNSCOPED_INFO("UNSCOPED_INFO", msg)
#define WARN(msg)                                                                                  \
    INTERNAL_CATCH_MSG(                                                                            \
        "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg)
#define CAPTURE(...)                                                                               \
    INTERNAL_CATCH_CAPTURE(INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE", __VA_ARGS__)

#define TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
#define TEST_CASE_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
#define METHOD_AS_TEST_CASE(method, ...) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
#define REGISTER_TEST_CASE(Function, ...) INTERNAL_CATCH_REGISTER_TESTCASE(Function, __VA_ARGS__)
#define SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
#define DYNAMIC_SECTION(...) INTERNAL_CATCH_DYNAMIC_SECTION(__VA_ARGS__)
#define FAIL(...)                                                                                  \
    INTERNAL_CATCH_MSG(                                                                            \
        "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__)
#define FAIL_CHECK(...)                                                                            \
    INTERNAL_CATCH_MSG("FAIL_CHECK",                                                               \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)
#define SUCCEED(...)                                                                               \
    INTERNAL_CATCH_MSG(                                                                            \
        "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_SIG(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                        \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define TEMPLATE_LIST_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_LIST_TEST_CASE_METHOD(className, ...)                                             \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define TEMPLATE_TEST_CASE(...)                                                                    \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE(...)                                                            \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                        \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define TEMPLATE_LIST_TEST_CASE(...)                                                               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_LIST_TEST_CASE_METHOD(className, ...)                                             \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(className, __VA_ARGS__))
#endif

#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
#define STATIC_REQUIRE(...)                                                                        \
    static_assert(__VA_ARGS__, #__VA_ARGS__);                                                      \
    SUCCEED(#__VA_ARGS__)
#define STATIC_REQUIRE_FALSE(...)                                                                  \
    static_assert(!(__VA_ARGS__), "!(" #__VA_ARGS__ ")");                                          \
    SUCCEED("!(" #__VA_ARGS__ ")")
#else
#define STATIC_REQUIRE(...) REQUIRE(__VA_ARGS__)
#define STATIC_REQUIRE_FALSE(...) REQUIRE_FALSE(__VA_ARGS__)
#endif

#endif

#define CATCH_TRANSLATE_EXCEPTION(signature) INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature)

// "BDD-style" convenience wrappers
#define SCENARIO(...) TEST_CASE("Scenario: " __VA_ARGS__)
#define SCENARIO_METHOD(className, ...)                                                            \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)

#define GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("    Given: " << desc)
#define AND_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("And given: " << desc)
#define WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     When: " << desc)
#define AND_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION(" And when: " << desc)
#define THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     Then: " << desc)
#define AND_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("      And: " << desc)

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
#define BENCHMARK(...)                                                                             \
    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),           \
                             INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__, , ),                            \
                             INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__, , ))
#define BENCHMARK_ADVANCED(name)                                                                   \
    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),  \
                                      name)
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

using Catch::Detail::Approx;

#else // CATCH_CONFIG_DISABLE

//////
// If this config identifier is defined then all CATCH macros are prefixed with
// CATCH_
#ifdef CATCH_CONFIG_PREFIX_ALL

#define CATCH_REQUIRE(...) (void)(0)
#define CATCH_REQUIRE_FALSE(...) (void)(0)

#define CATCH_REQUIRE_THROWS(...) (void)(0)
#define CATCH_REQUIRE_THROWS_AS(expr, exceptionType) (void)(0)
#define CATCH_REQUIRE_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW(...) (void)(0)

#define CATCH_CHECK(...) (void)(0)
#define CATCH_CHECK_FALSE(...) (void)(0)
#define CATCH_CHECKED_IF(...) if (__VA_ARGS__)
#define CATCH_CHECKED_ELSE(...) if (!(__VA_ARGS__))
#define CATCH_CHECK_NOFAIL(...) (void)(0)

#define CATCH_CHECK_THROWS(...) (void)(0)
#define CATCH_CHECK_THROWS_AS(expr, exceptionType) (void)(0)
#define CATCH_CHECK_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW(...) (void)(0)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THAT(arg, matcher) (void)(0)

#define CATCH_REQUIRE_THAT(arg, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define CATCH_INFO(msg) (void)(0)
#define CATCH_UNSCOPED_INFO(msg) (void)(0)
#define CATCH_WARN(msg) (void)(0)
#define CATCH_CAPTURE(msg) (void)(0)

#define CATCH_TEST_CASE(...)                                                                       \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_TEST_CASE_METHOD(className, ...)                                                     \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_METHOD_AS_TEST_CASE(method, ...)
#define CATCH_REGISTER_TEST_CASE(Function, ...) (void)(0)
#define CATCH_SECTION(...)
#define CATCH_DYNAMIC_SECTION(...)
#define CATCH_FAIL(...) (void)(0)
#define CATCH_FAIL_CHECK(...) (void)(0)
#define CATCH_SUCCEED(...) (void)(0)

#define CATCH_ANON_TEST_CASE()                                                                     \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define CATCH_TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define CATCH_TEMPLATE_TEST_CASE(...)                                                              \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#endif

// "BDD-style" convenience wrappers
#define CATCH_SCENARIO(...)                                                                        \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_SCENARIO_METHOD(className, ...)                                                      \
    INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(                                                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), className)
#define CATCH_GIVEN(desc)
#define CATCH_AND_GIVEN(desc)
#define CATCH_WHEN(desc)
#define CATCH_AND_WHEN(desc)
#define CATCH_THEN(desc)
#define CATCH_AND_THEN(desc)

#define CATCH_STATIC_REQUIRE(...) (void)(0)
#define CATCH_STATIC_REQUIRE_FALSE(...) (void)(0)

// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not
// required
#else

#define REQUIRE(...) (void)(0)
#define REQUIRE_FALSE(...) (void)(0)

#define REQUIRE_THROWS(...) (void)(0)
#define REQUIRE_THROWS_AS(expr, exceptionType) (void)(0)
#define REQUIRE_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define REQUIRE_NOTHROW(...) (void)(0)

#define CHECK(...) (void)(0)
#define CHECK_FALSE(...) (void)(0)
#define CHECKED_IF(...) if (__VA_ARGS__)
#define CHECKED_ELSE(...) if (!(__VA_ARGS__))
#define CHECK_NOFAIL(...) (void)(0)

#define CHECK_THROWS(...) (void)(0)
#define CHECK_THROWS_AS(expr, exceptionType) (void)(0)
#define CHECK_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CHECK_NOTHROW(...) (void)(0)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THAT(arg, matcher) (void)(0)

#define REQUIRE_THAT(arg, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define INFO(msg) (void)(0)
#define UNSCOPED_INFO(msg) (void)(0)
#define WARN(msg) (void)(0)
#define CAPTURE(msg) (void)(0)

#define TEST_CASE(...)                                                                             \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define TEST_CASE_METHOD(className, ...)                                                           \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define METHOD_AS_TEST_CASE(method, ...)
#define REGISTER_TEST_CASE(Function, ...) (void)(0)
#define SECTION(...)
#define DYNAMIC_SECTION(...)
#define FAIL(...) (void)(0)
#define FAIL_CHECK(...) (void)(0)
#define SUCCEED(...) (void)(0)
#define ANON_TEST_CASE()                                                                           \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define TEMPLATE_TEST_CASE(...)                                                                    \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#endif

#define STATIC_REQUIRE(...) (void)(0)
#define STATIC_REQUIRE_FALSE(...) (void)(0)

#endif

#define CATCH_TRANSLATE_EXCEPTION(signature)                                                       \
    INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG(                                                     \
        INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator), signature)

// "BDD-style" convenience wrappers
#define SCENARIO(...)                                                                              \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define SCENARIO_METHOD(className, ...)                                                            \
    INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(                                                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), className)

#define GIVEN(desc)
#define AND_GIVEN(desc)
#define WHEN(desc)
#define AND_WHEN(desc)
#define THEN(desc)
#define AND_THEN(desc)

using Catch::Detail::Approx;

#endif

#endif // ! CATCH_CONFIG_IMPL_ONLY

// start catch_reenable_warnings.h

#ifdef __clang__
#ifdef __ICC // icpc defines the __clang__ macro
#pragma warning(pop)
#else
#pragma clang diagnostic pop
#endif
#elif defined __GNUC__
#pragma GCC diagnostic pop
#endif

// end catch_reenable_warnings.h
// end catch.hpp
#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
