From 6983e53daae8cab25ff113c7b5ccd3b31f39fcbb Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 14 Feb 2023 16:34:40 -0500 Subject: Basic Song and chord structure --- song.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 song.cpp (limited to 'song.cpp') diff --git a/song.cpp b/song.cpp new file mode 100644 index 0000000..0f34782 --- /dev/null +++ b/song.cpp @@ -0,0 +1,54 @@ +#include "song.h" + +Song::Song(std::string chartFile) { + // TODO: import and parse chartFile +} + +Song::~Song() {}; + +void Song::consolidate() { + int totalSize = chords.size(); + // Check each chord against every other chord + for (int i=0; i Song::getChords() { + return chords; +} -- cgit v1.2.3 From b8dadd82d4afff0e5e6b6a8a00df948045d31503 Mon Sep 17 00:00:00 2001 From: Simon Gagne Date: Thu, 16 Mar 2023 10:06:04 -0400 Subject: Commit pour deplacement vers VSStudio --- chord.cpp | 52 - chord.h | 45 - chordNote.cpp | 52 + chordNote.h | 45 + include/json.hpp | 22109 ++++++++++++++++++++++++++++++++++++++++ include/serial/SerialPort.cpp | 131 + include/serial/SerialPort.hpp | 31 + main.cpp | 333 + song.cpp | 2 +- song.h | 8 +- 10 files changed, 22706 insertions(+), 102 deletions(-) delete mode 100644 chord.cpp delete mode 100644 chord.h create mode 100644 chordNote.cpp create mode 100644 chordNote.h create mode 100644 include/json.hpp create mode 100644 include/serial/SerialPort.cpp create mode 100644 include/serial/SerialPort.hpp create mode 100644 main.cpp (limited to 'song.cpp') diff --git a/chord.cpp b/chord.cpp deleted file mode 100644 index 8c6be33..0000000 --- a/chord.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "chord.h" - -Chord::Chord(int btn, int startTime, int endTime) { - start = startTime; - end = endTime; - for (int i=0; i<5; i++) { - notes[i] = false; - } - notes[btn] = true; -}; - -Chord::~Chord() {}; - -void Chord::change(int button) { - notes[button] = !notes[button]; -}; - -void Chord::setEnd(int endTime) { - end = endTime; -}; - -void Chord::setRenderStart(int renderTime) { - renderStart = start - renderTime; -}; - -bool* Chord::getNotes() { - return notes; -}; - -int Chord::getStart() { - return start; -}; - -int Chord::getEnd() { - return end; -}; - -int Chord::getRenderStart() { - return renderStart; -}; - -std::regex Chord::getRegex() { - // empty string - std::string regex = ""; - // true becomes "t" and false becomes "f" - // this is used to create a string of 5 characters - // which can be used as a regex - for (int i=0; i<5; i++) { - regex += notes[i] ? "t" : "f"; - } - return std::regex(regex); -}; diff --git a/chord.h b/chord.h deleted file mode 100644 index 6ce4b64..0000000 --- a/chord.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __CHORD_H__ -#define __CHORD_H__ - -#include - -// Chords are used to represent a set of notes that are played together. -// For this guitar hero implementation, a single note is technically a chord. -// This analogy is used to make sure that simultaneous notes are always grouped -// under a single chord since they have information in common (start/end time). - -#define FRET1 0 // green -#define FRET2 1 // red -#define FRET3 2 // yellow -#define FRET4 3 // blue -#define FRET5 4 // orange - - -class Chord { - private: - bool notes[5]; // which buttons are pressed - int start; // when to play in ms (relative to song start) - int end; // when to stop playing in ms (relative to song start) - int renderStart; // when to render (no need to define on construction) - public: - // Chords are initialized with a single button. - // Other notes are added as notes with the same "start" are encountered - // in .chart files. - // End time is initialized to 0 but can be changed if the .chart indicates - // that the chord is held for longer than the default 1/16th note. - Chord(int btn, int startTime, int endTime); - ~Chord(); - void change(int button); // change note in existing chord - void setEnd(int endTime); // set the end time of the chord - void setRenderStart(int renderTime); // sets when to start rendering - bool* getNotes(); // get the notes in the chord - int getStart(); // get the start time of the chord - int getEnd(); // get the end time of the chord - int getRenderStart(); // get the render time of the chord - std::regex getRegex(); // regex for this chord - // compares the player's input to - // the expected chord -}; - -#include "chord.cpp" -#endif // __CHORD_H__ diff --git a/chordNote.cpp b/chordNote.cpp new file mode 100644 index 0000000..cea7ae5 --- /dev/null +++ b/chordNote.cpp @@ -0,0 +1,52 @@ +#include "chordNote.h" + +ChordNote::ChordNote(int btn, int startTime, int endTime) { + start = startTime; + end = endTime; + for (int i=0; i<5; i++) { + notes[i] = false; + } + notes[btn] = true; +}; + +ChordNote::~ChordNote() {}; + +void ChordNote::change(int button) { + notes[button] = !notes[button]; +}; + +void ChordNote::setEnd(int endTime) { + end = endTime; +}; + +void ChordNote::setRenderStart(int renderTime) { + renderStart = start - renderTime; +}; + +bool* ChordNote::getNotes() { + return notes; +}; + +int ChordNote::getStart() { + return start; +}; + +int ChordNote::getEnd() { + return end; +}; + +int ChordNote::getRenderStart() { + return renderStart; +}; + +std::regex ChordNote::getRegex() { + // empty string + std::string regex = ""; + // true becomes "t" and false becomes "f" + // this is used to create a string of 5 characters + // which can be used as a regex + for (int i=0; i<5; i++) { + regex += notes[i] ? "t" : "f"; + } + return std::regex(regex); +}; diff --git a/chordNote.h b/chordNote.h new file mode 100644 index 0000000..3ac7f71 --- /dev/null +++ b/chordNote.h @@ -0,0 +1,45 @@ +#ifndef __CHORDNOTE_H__ +#define __CHORDNOTE_H__ + +#include + +// Chords are used to represent a set of notes that are played together. +// For this guitar hero implementation, a single note is technically a chord. +// This analogy is used to make sure that simultaneous notes are always grouped +// under a single chord since they have information in common (start/end time). + +#define FRET1 0 // green +#define FRET2 1 // red +#define FRET3 2 // yellow +#define FRET4 3 // blue +#define FRET5 4 // orange + + +class ChordNote { + private: + bool notes[5]; // which buttons are pressed + int start; // when to play in ms (relative to song start) + int end; // when to stop playing in ms (relative to song start) + int renderStart; // when to render (no need to define on construction) + public: + // Chords are initialized with a single button. + // Other notes are added as notes with the same "start" are encountered + // in .chart files. + // End time is initialized to 0 but can be changed if the .chart indicates + // that the chord is held for longer than the default 1/16th note. + ChordNote(int btn, int startTime, int endTime); + ~ChordNote(); + void change(int button); // change note in existing chord + void setEnd(int endTime); // set the end time of the chord + void setRenderStart(int renderTime); // sets when to start rendering + bool* getNotes(); // get the notes in the chord + int getStart(); // get the start time of the chord + int getEnd(); // get the end time of the chord + int getRenderStart(); // get the render time of the chord + std::regex getRegex(); // regex for this chord + // compares the player's input to + // the expected chord +}; + +#include "chordNote.cpp" +#endif // __CHORDNOTE_H__ diff --git a/include/json.hpp b/include/json.hpp new file mode 100644 index 0000000..6563c6e --- /dev/null +++ b/include/json.hpp @@ -0,0 +1,22109 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ +| | |__ | | | | | | version 3.10.5 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2022 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file doc/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#define NLOHMANN_JSON_VERSION_MAJOR 3 +#define NLOHMANN_JSON_VERSION_MINOR 10 +#define NLOHMANN_JSON_VERSION_PATCH 5 + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // accumulate +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include + + +#include +#include + +// #include + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include + + +#include // exception +#include // runtime_error +#include // to_string +#include // vector + +// #include + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +namespace nlohmann +{ +namespace detail +{ +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +} +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +// #include + + +#include // declval, pair +// #include + + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * For details, see . + * SPDX-License-Identifier: CC0-1.0 + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + +// #include + + +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; +} // namespace detail +} // namespace nlohmann + + +// https://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; +} // namespace detail +} // namespace nlohmann + + +// This file contains all internal macro definitions +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +inline void replace_substring(std::string& s, const std::string& f, + const std::string& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +inline std::string escape(std::string s) +{ + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +static void unescape(std::string& s) +{ + replace_substring(s, "~1", "/"); + replace_substring(s, "~0", "~"); +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // size_t + +namespace nlohmann +{ +namespace detail +{ +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return "[json.exception." + ename + "." + std::to_string(id_) + "] "; + } + + template + static std::string diagnostics(const BasicJsonType& leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector tokens; + for (const auto* current = &leaf_element; current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) + { + if (¤t->m_parent->m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + return "(" + std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }) + ") "; +#else + static_cast(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + position_string(pos) + ": " + exception::diagnostics(context) + what_arg; + return {id_, pos.chars_read_total, w.c_str()}; + } + + template + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") + + ": " + exception::diagnostics(context) + what_arg; + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return " at line " + std::to_string(pos.lines_read + 1) + + ", column " + std::to_string(pos.chars_read_current_line); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template + static invalid_iterator create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("invalid_iterator", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template + static type_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("type_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template + static out_of_range create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("out_of_range", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template + static other_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("other_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; // NOLINT(readability-redundant-declaration) + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// dispatching helper struct +template struct identity_tag {}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple + +// #include + + +// #include + + +#include // random_access_iterator_tag + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); +} // namespace nlohmann + +// #include + +// #include + +// #include +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ +#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + +#include // int64_t, uint64_t +#include // map +#include // allocator +#include // string +#include // vector + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ +/*! +@brief default JSONSerializer template argument + +This serializer ignores the template arguments and uses ADL +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) +for serialization. +*/ +template +struct adl_serializer; + +/// a class to store JSON values +/// @sa https://json.nlohmann.me/api/basic_json/ +template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector> +class basic_json; + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer; + +/*! +@brief default specialization +@sa https://json.nlohmann.me/api/json/ +*/ +using json = basic_json<>; + +/// @brief a minimal map-like container that preserves insertion order +/// @sa https://json.nlohmann.me/api/ordered_map/ +template +struct ordered_map; + +/// @brief specialization that maintains the insertion order of object keys +/// @sa https://json.nlohmann.me/api/ordered_json/ +using ordered_json = basic_json; + +} // namespace nlohmann + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +namespace nlohmann +{ +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B1 { }; +template +struct conjunction +: std::conditional, B1>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +// a naive helper to check if a type is an ordered_map (exploits the fact that +// ordered_map inherits capacity() from std::vector) +template +struct is_ordered_map +{ + using one = char; + + struct two + { + char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + }; + + template static one test( decltype(&C::capacity) ) ; + template static two test(...); + + enum { value = sizeof(test(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) +}; + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template < typename T, typename U, enable_if_t < !std::is_same::value, int > = 0 > +T conditional_static_cast(U value) +{ + return static_cast(value); +} + +template::value, int> = 0> +T conditional_static_cast(U value) +{ + return value; +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()), j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic::value&& + !std::is_same::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()), j)); + } + b = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + s = *j.template get_ptr(); +} + +template < + typename BasicJsonType, typename ConstructibleStringType, + enable_if_t < + is_constructible_string_type::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ConstructibleStringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + + s = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type::type val; + get_arithmetic_value(j, val); + e = static_cast(val); +} + +// forward_list doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::forward_list& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get(); + }); +} + +// valarray doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::valarray& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get(); + }); +} + +template +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template +void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr(); +} + +template +auto from_json_array_impl(const BasicJsonType& j, std::array& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval()), + j.template get(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template::value, + int> = 0> +void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type::value&& + !is_constructible_object_type::value&& + !is_constructible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag> /*unused*/, index_sequence /*unused*/) +{ + return { { std::forward(j).at(Idx).template get()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag> tag) +-> decltype(from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {}); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name()), j)); + } + + bin = *j.template get_ptr(); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()), j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::boolean: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +std::tuple from_json_tuple_impl_base(BasicJsonType&& j, index_sequence /*unused*/) +{ + return std::make_tuple(std::forward(j).at(Idx).template get()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward(j).at(0).template get(), + std::forward(j).at(1).template get()}; +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); +} + +template +std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + p = *j.template get_ptr(); +} +#endif + +struct from_json_fn +{ + template + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward(val)))) + -> decltype(from_json(j, std::forward(val))) + { + return from_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& from_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + + +#include // copy +#include // begin, end +#include // string +#include // tuple, get +#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include // move, forward, declval, pair +#include // valarray +#include // vector + +// #include + +// #include + + +#include // size_t +#include // input_iterator_tag +#include // string, to_string +#include // tuple_size, get, tuple_element +#include // move + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const string_type empty_str{}; + + public: + explicit iteration_proxy_value(IteratorType it) noexcept + : anchor(std::move(it)) + {} + + /// dereference operator (needed for range-based for) + iteration_proxy_value& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_value begin() noexcept + { + return iteration_proxy_value(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value end() noexcept + { + return iteration_proxy_value(container.end()); + } +}; +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) +{ + return i.value(); +} +} // namespace detail +} // namespace nlohmann + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template +class tuple_size<::nlohmann::detail::iteration_proxy_value> + : public std::integral_constant {}; + +template +class tuple_element> +{ + public: + using type = decltype( + get(std::declval < + ::nlohmann::detail::iteration_proxy_value> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif +} // namespace std + +// #include + +// #include + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template struct external_constructor; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::boolean; + j.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = s; + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_float; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_unsigned; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_integer; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value.array = j.template create(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, const std::vector& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_value.array->push_back(x); + j.set_parent(j.m_value.array->back()); + } + j.assert_invariant(); + } + + template::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value.object = j.template create(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor::construct(j, b); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor::construct(j, s); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor::construct(j, std::move(s)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type::type; + external_constructor::construct(j, static_cast(e)); +} + +template +void to_json(BasicJsonType& j, const std::vector& e) +{ + external_constructor::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type::value&& + !is_compatible_object_type::value&& + !is_compatible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor::construct(j, arr); +} + +template +void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor::construct(j, bin); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const std::valarray& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > +void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor::construct(j, obj); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > +void to_json(BasicJsonType& j, const std::pair& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template>::value, int> = 0> +void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template +void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +{ + j = { std::get(t)... }; +} + +template::value, int > = 0> +void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) + -> decltype(to_json(j, std::forward(val)), void()) + { + return to_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& to_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), val))) + -> decltype(::nlohmann::from_json(std::forward(j), val), void()) + { + ::nlohmann::from_json(std::forward(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) + -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) + { + return ::nlohmann::from_json(std::forward(j), detail::identity_tag {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward(val)))) + -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) + { + ::nlohmann::to_json(j, std::forward(val)); + } +}; +} // namespace nlohmann + +// #include + + +#include // uint8_t, uint64_t +#include // tie +#include // move + +namespace nlohmann +{ + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast(*this), m_subtype, m_has_subtype) == + std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + + +#include // uint8_t +#include // size_t +#include // hash + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash {}(j.template get_ref()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // generate_n +#include // array +#include // ldexp +#include // size_t +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf +#include // memcpy +#include // back_inserter +#include // numeric_limits +#include // char_traits, string +#include // make_pair, move +#include // vector + +// #include + +// #include + + +#include // array +#include // size_t +#include // strlen +#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include // shared_ptr, make_shared, addressof +#include // accumulate +#include // string, char_traits +#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include // pair, declval + +#ifndef JSON_NO_IO + #include // FILE * + #include // istream +#endif // JSON_NO_IO + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + {} + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits::to_int_type, to + // ensure that std::char_traits::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename std::char_traits::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = std::char_traits::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return std::char_traits::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + + +template +struct wide_string_input_helper; + +template +struct wide_string_input_helper +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template +struct wide_string_input_helper +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast(input.get_character()); + const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input apdater to convert wide character types into individual bytes. +template +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template + void fill_buffer() + { + wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + + +template +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using adapter_type = iterator_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template +struct iterator_input_adapter_factory::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using base_adapter_type = iterator_input_adapter; + using adapter_type = wide_string_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template +typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template +struct container_input_adapter_factory {}; + +template +struct container_input_adapter_factory< ContainerType, + void_t()), end(std::declval()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval()), end(std::declval()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template +typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + !std::is_array::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast(b)); + const auto* ptr = reinterpret_cast(b); + return input_adapter(ptr, ptr + length); +} + +template +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} + + template::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +#include // string +#include // move +#include // vector + +// #include + +// #include + + +namespace nlohmann +{ + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template + std::pair handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, &root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// stack to manage which values to keep + std::vector keep_stack {}; + /// stack to manage which object keys to keep + std::vector key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; +} // namespace detail + +} // namespace nlohmann + +// #include + + +#include // array +#include // localeconv +#include // size_t +#include // snprintf +#include // strtof, strtod, strtold, strtoll, strtoull +#include // initializer_list +#include // char_traits, string +#include // move +#include // vector + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////// +// lexer // +/////////// + +template +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template +class lexer : public lexer_base +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + using token_type = typename lexer_base::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast((static_cast(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast((static_cast(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast((static_cast(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case std::char_traits::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast( + // high surrogate occupies the most significant 22 bits + (static_cast(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case std::char_traits::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case std::char_traits::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(std::char_traits::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `std::char_traits::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + token_string.push_back(std::char_traits::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast(c) <= '\x1F') + { + // escape control characters + std::array cs{{}}; + static_cast((std::snprintf)(cs.data(), cs.size(), "", static_cast(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array true_literal = {{static_cast('t'), static_cast('r'), static_cast('u'), static_cast('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array false_literal = {{static_cast('f'), static_cast('a'), static_cast('l'), static_cast('s'), static_cast('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array null_literal = {{static_cast('n'), static_cast('u'), static_cast('l'), static_cast('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case std::char_traits::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // declval +#include // string + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +using null_function_t = decltype(std::declval().null()); + +template +using boolean_function_t = + decltype(std::declval().boolean(std::declval())); + +template +using number_integer_function_t = + decltype(std::declval().number_integer(std::declval())); + +template +using number_unsigned_function_t = + decltype(std::declval().number_unsigned(std::declval())); + +template +using number_float_function_t = decltype(std::declval().number_float( + std::declval(), std::declval())); + +template +using string_function_t = + decltype(std::declval().string(std::declval())); + +template +using binary_function_t = + decltype(std::declval().binary(std::declval())); + +template +using start_object_function_t = + decltype(std::declval().start_object(std::declval())); + +template +using key_function_t = + decltype(std::declval().key(std::declval())); + +template +using end_object_function_t = decltype(std::declval().end_object()); + +template +using start_array_function_t = + decltype(std::declval().start_array(std::declval())); + +template +using end_array_function_t = decltype(std::declval().end_array()); + +template +using parse_error_function_t = decltype(std::declval().parse_error( + std::declval(), std::declval(), + std::declval())); + +template +struct is_sax +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value; +}; + +template +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast(&num) == 1; +} + + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(std::move(adapter)) + { + (void)detail::is_sax_static_asserts {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (format == input_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), + parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value"), BasicJsonType())); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string"), BasicJsonType())); + } + + return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary"), BasicJsonType())); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data()), BasicJsonType())); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) + - static_cast(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary"), BasicJsonType())); + } + } + } + + /*! + @param[in] len the length of the array or static_cast(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + default: + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) + { + switch (get_ignore_noop()) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + } + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair& result) + { + result.first = string_t::npos; // size + result.second = 0; // type + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + + return get_ubjson_size_value(result.first); + } + + if (current == '#') + { + return get_ubjson_size_value(result.first); + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case std::char_traits::eof(): // EOF + return unexpect_eof(input_format_t::ubjson, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'd': + { + float number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char"), BasicJsonType())); + } + string_t s(1, static_cast(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + string_t key; + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + auto res = get_ubjson_size_value(size); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number"))) + { + return false; + } + number_vector.push_back(static_cast(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `std::char_traits::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + */ + template + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != InputIsLittleEndian) + { + vec[sizeof(NumberType) - i - 1] = static_cast(current); + } + else + { + vec[i] = static_cast(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) + { + return sax->parse_error(chars_read, "", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), BasicJsonType())); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return error_msg + " " + context + ": " + detail; + } + + private: + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the SAX parser + json_sax_t* sax = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // isfinite +#include // uint8_t +#include // function +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template +using parser_callback_t = + std::function; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + return result; + } + + private: + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'", BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), BasicJsonType())); + } + + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::end_of_input: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), BasicJsonType())); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), BasicJsonType())); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), BasicJsonType())); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += "while parsing " + context + " "; + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + + m_lexer.get_token_string() + "'"; + } + else + { + error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +#include // ptrdiff_t +#include // numeric_limits + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t const operator++(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t const operator--(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include // conditional, is_const, remove_const + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// forward declare, to be able to friend it later on +template class iteration_proxy; +template class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy; + friend iteration_proxy_value; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json::type>::value, + "iter_impl only accepts (const) basic_json"); + + public: + + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator++(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator--(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", *m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", *m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", *m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator::type> m_it {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // ptrdiff_t +#include // reverse_iterator +#include // declval + +namespace nlohmann +{ +namespace detail +{ +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template +class json_reverse_iterator : public std::reverse_iterator +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator const operator++(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator const operator--(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // all_of +#include // isdigit +#include // max +#include // accumulate +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + public: + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const std::string& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + std::string to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + operator std::string() const + { + return to_string(); + } + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::string token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::string token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const std::string& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const std::string& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(std::string&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + static typename BasicJsonType::size_type array_index(const std::string& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, "array index '" + s + "' must not begin with '0'", BasicJsonType())); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number", BasicJsonType())); + } + + std::size_t processed_chars = 0; + unsigned long long res = 0; // NOLINT(runtime/int) + JSON_TRY + { + res = std::stoull(s, &processed_chars); + } + JSON_CATCH(std::out_of_range&) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // check if the string was completely read + if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size())) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast((std::numeric_limits::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type", BasicJsonType())); // LCOV_EXCL_LINE + } + + return static_cast(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range", *ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector split(const std::string& reference_string) + { + std::vector result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, "JSON pointer must be empty or begin with '/' - was: '" + reference_string + "'", BasicJsonType())); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == std::string::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == std::string::npos) + start = (slash == std::string::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != std::string::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", BasicJsonType())); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + static void flatten(const std::string& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(reference_string + "/" + detail::escape(element.first), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + /*! + @brief compares two JSON pointers for equality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is equal to @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator==(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return lhs.reference_tokens == rhs.reference_tokens; + } + + /*! + @brief compares two JSON pointers for inequality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is not equal @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator!=(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return !(lhs == rhs); + } + + /// the reference tokens + std::vector reference_tokens; +}; +} // namespace nlohmann + +// #include + + +#include +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + + +#include // reverse +#include // array +#include // isnan, isinf +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // memcpy +#include // numeric_limits +#include // string +#include // move + +// #include + +// #include + +// #include + + +#include // copy +#include // size_t +#include // back_inserter +#include // shared_ptr, make_shared +#include // basic_string +#include // vector + +#ifndef JSON_NO_IO + #include // streamsize + #include // basic_ostream +#endif // JSON_NO_IO + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// abstract output adapter interface +template struct output_adapter_protocol +{ + virtual void write_character(CharType c) = 0; + virtual void write_characters(const CharType* s, std::size_t length) = 0; + virtual ~output_adapter_protocol() = default; + + output_adapter_protocol() = default; + output_adapter_protocol(const output_adapter_protocol&) = default; + output_adapter_protocol(output_adapter_protocol&&) noexcept = default; + output_adapter_protocol& operator=(const output_adapter_protocol&) = default; + output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default; +}; + +/// a type to simplify interfaces +template +using output_adapter_t = std::shared_ptr>; + +/// output adapter for byte vectors +template> +class output_vector_adapter : public output_adapter_protocol +{ + public: + explicit output_vector_adapter(std::vector& vec) noexcept + : v(vec) + {} + + void write_character(CharType c) override + { + v.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + std::copy(s, s + length, std::back_inserter(v)); + } + + private: + std::vector& v; +}; + +#ifndef JSON_NO_IO +/// output adapter for output streams +template +class output_stream_adapter : public output_adapter_protocol +{ + public: + explicit output_stream_adapter(std::basic_ostream& s) noexcept + : stream(s) + {} + + void write_character(CharType c) override + { + stream.put(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + stream.write(s, static_cast(length)); + } + + private: + std::basic_ostream& stream; +}; +#endif // JSON_NO_IO + +/// output adapter for basic_string +template> +class output_string_adapter : public output_adapter_protocol +{ + public: + explicit output_string_adapter(StringType& s) noexcept + : str(s) + {} + + void write_character(CharType c) override + { + str.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + str.append(s, length); + } + + private: + StringType& str; +}; + +template> +class output_adapter +{ + public: + template> + output_adapter(std::vector& vec) + : oa(std::make_shared>(vec)) {} + +#ifndef JSON_NO_IO + output_adapter(std::basic_ostream& s) + : oa(std::make_shared>(s)) {} +#endif // JSON_NO_IO + + output_adapter(StringType& s) + : oa(std::make_shared>(s)) {} + + operator output_adapter_t() + { + return oa; + } + + private: + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// binary writer // +/////////////////// + +/*! +@brief serialization to CBOR and MessagePack values +*/ +template +class binary_writer +{ + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using number_float_t = typename BasicJsonType::number_float_t; + + public: + /*! + @brief create a binary writer + + @param[in] adapter output adapter to write to + */ + explicit binary_writer(output_adapter_t adapter) : oa(std::move(adapter)) + { + JSON_ASSERT(oa); + } + + /*! + @param[in] j JSON value to serialize + @pre j.type() == value_t::object + */ + void write_bson(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + { + write_bson_object(*j.m_value.object); + break; + } + + case value_t::null: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name()), j)); + } + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_cbor(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: + { + oa->write_character(to_char_type(0xF6)); + break; + } + + case value_t::boolean: + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xF5) + : to_char_type(0xF4)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // CBOR does not differentiate between positive signed + // integers and unsigned integers. Therefore, we used the + // code from the value_t::number_unsigned case here. + if (j.m_value.number_integer <= 0x17) + { + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_integer)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + // The conversions below encode the sign in the first + // byte, and the value is converted to a positive number. + const auto positive_number = -1 - j.m_value.number_integer; + if (j.m_value.number_integer >= -24) + { + write_number(static_cast(0x20 + positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x38)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x39)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x3A)); + write_number(static_cast(positive_number)); + } + else + { + oa->write_character(to_char_type(0x3B)); + write_number(static_cast(positive_number)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= 0x17) + { + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_unsigned)); + } + break; + } + + case value_t::number_float: + { + if (std::isnan(j.m_value.number_float)) + { + // NaN is 0xf97e00 in CBOR + oa->write_character(to_char_type(0xF9)); + oa->write_character(to_char_type(0x7E)); + oa->write_character(to_char_type(0x00)); + } + else if (std::isinf(j.m_value.number_float)) + { + // Infinity is 0xf97c00, -Infinity is 0xf9fc00 + oa->write_character(to_char_type(0xf9)); + oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); + oa->write_character(to_char_type(0x00)); + } + else + { + write_compact_float(j.m_value.number_float, detail::input_format_t::cbor); + } + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 0x17) + { + write_number(static_cast(0x60 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x78)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x79)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 0x17) + { + write_number(static_cast(0x80 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x98)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x99)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_cbor(el); + } + break; + } + + case value_t::binary: + { + if (j.m_value.binary->has_subtype()) + { + if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd8)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd9)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xda)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xdb)); + write_number(static_cast(j.m_value.binary->subtype())); + } + } + + // step 1: write control byte and the binary array size + const auto N = j.m_value.binary->size(); + if (N <= 0x17) + { + write_number(static_cast(0x40 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x58)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x59)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 0x17) + { + write_number(static_cast(0xA0 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB8)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBA)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBB)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_cbor(el.first); + write_cbor(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_msgpack(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: // nil + { + oa->write_character(to_char_type(0xC0)); + break; + } + + case value_t::boolean: // true and false + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xC3) + : to_char_type(0xC2)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // MessagePack does not differentiate between positive + // signed integers and unsigned integers. Therefore, we used + // the code from the value_t::number_unsigned case here. + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + if (j.m_value.number_integer >= -32) + { + // negative fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 8 + oa->write_character(to_char_type(0xD0)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 16 + oa->write_character(to_char_type(0xD1)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 32 + oa->write_character(to_char_type(0xD2)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 64 + oa->write_character(to_char_type(0xD3)); + write_number(static_cast(j.m_value.number_integer)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + break; + } + + case value_t::number_float: + { + write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack); + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 31) + { + // fixstr + write_number(static_cast(0xA0 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 8 + oa->write_character(to_char_type(0xD9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 16 + oa->write_character(to_char_type(0xDA)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 32 + oa->write_character(to_char_type(0xDB)); + write_number(static_cast(N)); + } + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 15) + { + // fixarray + write_number(static_cast(0x90 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 16 + oa->write_character(to_char_type(0xDC)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 32 + oa->write_character(to_char_type(0xDD)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_msgpack(el); + } + break; + } + + case value_t::binary: + { + // step 0: determine if the binary type has a set subtype to + // determine whether or not to use the ext or fixext types + const bool use_ext = j.m_value.binary->has_subtype(); + + // step 1: write control byte and the byte string length + const auto N = j.m_value.binary->size(); + if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type{}; + bool fixed = true; + if (use_ext) + { + switch (N) + { + case 1: + output_type = 0xD4; // fixext 1 + break; + case 2: + output_type = 0xD5; // fixext 2 + break; + case 4: + output_type = 0xD6; // fixext 4 + break; + case 8: + output_type = 0xD7; // fixext 8 + break; + case 16: + output_type = 0xD8; // fixext 16 + break; + default: + output_type = 0xC7; // ext 8 + fixed = false; + break; + } + + } + else + { + output_type = 0xC4; // bin 8 + fixed = false; + } + + oa->write_character(to_char_type(output_type)); + if (!fixed) + { + write_number(static_cast(N)); + } + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC8 // ext 16 + : 0xC5; // bin 16 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC9 // ext 32 + : 0xC6; // bin 32 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + + // step 1.5: if this is an ext type, write the subtype + if (use_ext) + { + write_number(static_cast(j.m_value.binary->subtype())); + } + + // step 2: write the byte string + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 15) + { + // fixmap + write_number(static_cast(0x80 | (N & 0xF))); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 16 + oa->write_character(to_char_type(0xDE)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 32 + oa->write_character(to_char_type(0xDF)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_msgpack(el.first); + write_msgpack(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + @param[in] use_count whether to use '#' prefixes (optimized format) + @param[in] use_type whether to use '$' prefixes (optimized format) + @param[in] add_prefix whether prefixes need to be used for this value + */ + void write_ubjson(const BasicJsonType& j, const bool use_count, + const bool use_type, const bool add_prefix = true) + { + switch (j.type()) + { + case value_t::null: + { + if (add_prefix) + { + oa->write_character(to_char_type('Z')); + } + break; + } + + case value_t::boolean: + { + if (add_prefix) + { + oa->write_character(j.m_value.boolean + ? to_char_type('T') + : to_char_type('F')); + } + break; + } + + case value_t::number_integer: + { + write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); + break; + } + + case value_t::number_unsigned: + { + write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); + break; + } + + case value_t::number_float: + { + write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); + break; + } + + case value_t::string: + { + if (add_prefix) + { + oa->write_character(to_char_type('S')); + } + write_number_with_ubjson_prefix(j.m_value.string->size(), true); + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.array->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin() + 1, j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.array->size(), true); + } + + for (const auto& el : *j.m_value.array) + { + write_ubjson(el, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::binary: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + if (use_type && !j.m_value.binary->empty()) + { + JSON_ASSERT(use_count); + oa->write_character(to_char_type('$')); + oa->write_character('U'); + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.binary->size(), true); + } + + if (use_type) + { + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + j.m_value.binary->size()); + } + else + { + for (size_t i = 0; i < j.m_value.binary->size(); ++i) + { + oa->write_character(to_char_type('U')); + oa->write_character(j.m_value.binary->data()[i]); + } + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::object: + { + if (add_prefix) + { + oa->write_character(to_char_type('{')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.object->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin(), j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.object->size(), true); + } + + for (const auto& el : *j.m_value.object) + { + write_number_with_ubjson_prefix(el.first.size(), true); + oa->write_characters( + reinterpret_cast(el.first.c_str()), + el.first.size()); + write_ubjson(el.second, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type('}')); + } + + break; + } + + case value_t::discarded: + default: + break; + } + } + + private: + ////////// + // BSON // + ////////// + + /*! + @return The size of a BSON document entry header, including the id marker + and the entry name size (and its null-terminator). + */ + static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) + { + const auto it = name.find(static_cast(0)); + if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) + { + JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")", j)); + static_cast(j); + } + + return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; + } + + /*! + @brief Writes the given @a element_type and @a name to the output adapter + */ + void write_bson_entry_header(const string_t& name, + const std::uint8_t element_type) + { + oa->write_character(to_char_type(element_type)); // boolean + oa->write_characters( + reinterpret_cast(name.c_str()), + name.size() + 1u); + } + + /*! + @brief Writes a BSON element with key @a name and boolean value @a value + */ + void write_bson_boolean(const string_t& name, + const bool value) + { + write_bson_entry_header(name, 0x08); + oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and double value @a value + */ + void write_bson_double(const string_t& name, + const double value) + { + write_bson_entry_header(name, 0x01); + write_number(value); + } + + /*! + @return The size of the BSON-encoded string in @a value + */ + static std::size_t calc_bson_string_size(const string_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and string value @a value + */ + void write_bson_string(const string_t& name, + const string_t& value) + { + write_bson_entry_header(name, 0x02); + + write_number(static_cast(value.size() + 1ul)); + oa->write_characters( + reinterpret_cast(value.c_str()), + value.size() + 1); + } + + /*! + @brief Writes a BSON element with key @a name and null value + */ + void write_bson_null(const string_t& name) + { + write_bson_entry_header(name, 0x0A); + } + + /*! + @return The size of the BSON-encoded integer @a value + */ + static std::size_t calc_bson_integer_size(const std::int64_t value) + { + return (std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)() + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and integer @a value + */ + void write_bson_integer(const string_t& name, + const std::int64_t value) + { + if ((std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)()) + { + write_bson_entry_header(name, 0x10); // int32 + write_number(static_cast(value)); + } + else + { + write_bson_entry_header(name, 0x12); // int64 + write_number(static_cast(value)); + } + } + + /*! + @return The size of the BSON-encoded unsigned integer in @a j + */ + static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept + { + return (value <= static_cast((std::numeric_limits::max)())) + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and unsigned @a value + */ + void write_bson_unsigned(const string_t& name, + const BasicJsonType& j) + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x10 /* int32 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x12 /* int64 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(j.m_value.number_unsigned) + " cannot be represented by BSON as it does not fit int64", j)); + } + } + + /*! + @brief Writes a BSON element with key @a name and object @a value + */ + void write_bson_object_entry(const string_t& name, + const typename BasicJsonType::object_t& value) + { + write_bson_entry_header(name, 0x03); // object + write_bson_object(value); + } + + /*! + @return The size of the BSON-encoded array @a value + */ + static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) + { + std::size_t array_index = 0ul; + + const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) + { + return result + calc_bson_element_size(std::to_string(array_index++), el); + }); + + return sizeof(std::int32_t) + embedded_document_size + 1ul; + } + + /*! + @return The size of the BSON-encoded binary array @a value + */ + static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and array @a value + */ + void write_bson_array(const string_t& name, + const typename BasicJsonType::array_t& value) + { + write_bson_entry_header(name, 0x04); // array + write_number(static_cast(calc_bson_array_size(value))); + + std::size_t array_index = 0ul; + + for (const auto& el : value) + { + write_bson_element(std::to_string(array_index++), el); + } + + oa->write_character(to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and binary value @a value + */ + void write_bson_binary(const string_t& name, + const binary_t& value) + { + write_bson_entry_header(name, 0x05); + + write_number(static_cast(value.size())); + write_number(value.has_subtype() ? static_cast(value.subtype()) : static_cast(0x00)); + + oa->write_characters(reinterpret_cast(value.data()), value.size()); + } + + /*! + @brief Calculates the size necessary to serialize the JSON value @a j with its @a name + @return The calculated size for the BSON document entry for @a j with the given @a name. + */ + static std::size_t calc_bson_element_size(const string_t& name, + const BasicJsonType& j) + { + const auto header_size = calc_bson_entry_header_size(name, j); + switch (j.type()) + { + case value_t::object: + return header_size + calc_bson_object_size(*j.m_value.object); + + case value_t::array: + return header_size + calc_bson_array_size(*j.m_value.array); + + case value_t::binary: + return header_size + calc_bson_binary_size(*j.m_value.binary); + + case value_t::boolean: + return header_size + 1ul; + + case value_t::number_float: + return header_size + 8ul; + + case value_t::number_integer: + return header_size + calc_bson_integer_size(j.m_value.number_integer); + + case value_t::number_unsigned: + return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned); + + case value_t::string: + return header_size + calc_bson_string_size(*j.m_value.string); + + case value_t::null: + return header_size + 0ul; + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return 0ul; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Serializes the JSON value @a j to BSON and associates it with the + key @a name. + @param name The name to associate with the JSON entity @a j within the + current BSON document + */ + void write_bson_element(const string_t& name, + const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + return write_bson_object_entry(name, *j.m_value.object); + + case value_t::array: + return write_bson_array(name, *j.m_value.array); + + case value_t::binary: + return write_bson_binary(name, *j.m_value.binary); + + case value_t::boolean: + return write_bson_boolean(name, j.m_value.boolean); + + case value_t::number_float: + return write_bson_double(name, j.m_value.number_float); + + case value_t::number_integer: + return write_bson_integer(name, j.m_value.number_integer); + + case value_t::number_unsigned: + return write_bson_unsigned(name, j); + + case value_t::string: + return write_bson_string(name, *j.m_value.string); + + case value_t::null: + return write_bson_null(name); + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Calculates the size of the BSON serialization of the given + JSON-object @a j. + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) + { + std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast(0), + [](size_t result, const typename BasicJsonType::object_t::value_type & el) + { + return result += calc_bson_element_size(el.first, el.second); + }); + + return sizeof(std::int32_t) + document_size + 1ul; + } + + /*! + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + void write_bson_object(const typename BasicJsonType::object_t& value) + { + write_number(static_cast(calc_bson_object_size(value))); + + for (const auto& el : value) + { + write_bson_element(el.first, el.second); + } + + oa->write_character(to_char_type(0x00)); + } + + ////////// + // CBOR // + ////////// + + static constexpr CharType get_cbor_float_prefix(float /*unused*/) + { + return to_char_type(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double /*unused*/) + { + return to_char_type(0xFB); // Double-Precision Float + } + + ///////////// + // MsgPack // + ///////////// + + static constexpr CharType get_msgpack_float_prefix(float /*unused*/) + { + return to_char_type(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double /*unused*/) + { + return to_char_type(0xCB); // float 64 + } + + //////////// + // UBJSON // + //////////// + + // UBJSON: write number (floating point) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (add_prefix) + { + oa->write_character(get_ubjson_float_prefix(n)); + } + write_number(n); + } + + // UBJSON: write number (unsigned integer) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + } + + // UBJSON: write number (signed integer) + template < typename NumberType, typename std::enable_if < + std::is_signed::value&& + !std::is_floating_point::value, int >::type = 0 > + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (static_cast((std::numeric_limits::min)()) <= n && n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + // LCOV_EXCL_START + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + // LCOV_EXCL_STOP + } + + /*! + @brief determine the type prefix of container values + */ + CharType ubjson_prefix(const BasicJsonType& j) const noexcept + { + switch (j.type()) + { + case value_t::null: + return 'Z'; + + case value_t::boolean: + return j.m_value.boolean ? 'T' : 'F'; + + case value_t::number_integer: + { + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'i'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'U'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'I'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'l'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'i'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'U'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'I'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'l'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_float: + return get_ubjson_float_prefix(j.m_value.number_float); + + case value_t::string: + return 'S'; + + case value_t::array: // fallthrough + case value_t::binary: + return '['; + + case value_t::object: + return '{'; + + case value_t::discarded: + default: // discarded values + return 'N'; + } + } + + static constexpr CharType get_ubjson_float_prefix(float /*unused*/) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double /*unused*/) + { + return 'D'; // float 64 + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /* + @brief write a number to output input + @param[in] n number of type @a NumberType + @tparam NumberType the type of the number + @tparam OutputIsLittleEndian Set to true if output data is + required to be little endian + + @note This function needs to respect the system's endianness, because bytes + in CBOR, MessagePack, and UBJSON are stored in network order (big + endian) and therefore need reordering on little endian systems. + */ + template + void write_number(const NumberType n) + { + // step 1: write number to array of length NumberType + std::array vec{}; + std::memcpy(vec.data(), &n, sizeof(NumberType)); + + // step 2: write array to output (with possible reordering) + if (is_little_endian != OutputIsLittleEndian) + { + // reverse byte order prior to conversion if necessary + std::reverse(vec.begin(), vec.end()); + } + + oa->write_characters(vec.data(), sizeof(NumberType)); + } + + void write_compact_float(const number_float_t n, detail::input_format_t format) + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (static_cast(n) >= static_cast(std::numeric_limits::lowest()) && + static_cast(n) <= static_cast((std::numeric_limits::max)()) && + static_cast(static_cast(n)) == static_cast(n)) + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(static_cast(n)) + : get_msgpack_float_prefix(static_cast(n))); + write_number(static_cast(n)); + } + else + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(n) + : get_msgpack_float_prefix(n)); + write_number(n); + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + public: + // The following to_char_type functions are implement the conversion + // between uint8_t and CharType. In case CharType is not unsigned, + // such a conversion is required to allow values greater than 128. + // See for a discussion. + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_signed::value > * = nullptr > + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return *reinterpret_cast(&x); + } + + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_unsigned::value > * = nullptr > + static CharType to_char_type(std::uint8_t x) noexcept + { + static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); + static_assert(std::is_trivial::value, "CharType must be trivial"); + CharType result; + std::memcpy(&result, &x, sizeof(x)); + return result; + } + + template::value>* = nullptr> + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return x; + } + + template < typename InputCharType, typename C = CharType, + enable_if_t < + std::is_signed::value && + std::is_signed::value && + std::is_same::type>::value + > * = nullptr > + static constexpr CharType to_char_type(InputCharType x) noexcept + { + return x; + } + + private: + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the output + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // reverse, remove, fill, find, none_of +#include // array +#include // localeconv, lconv +#include // labs, isfinite, isnan, signbit +#include // size_t, ptrdiff_t +#include // uint8_t +#include // snprintf +#include // numeric_limits +#include // string, char_traits +#include // setfill, setw +#include // is_same +#include // move + +// #include + + +#include // array +#include // signbit, isfinite +#include // intN_t, uintN_t +#include // memcpy, memmove +#include // numeric_limits +#include // conditional + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional::type; + + const auto bits = static_cast(reinterpret_bits(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 + const boundaries w = compute_boundaries(static_cast(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + else + { + *buf++ = static_cast('0' + k / 100); + k %= 100; + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast(n) - static_cast(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); + buf[n] = '.'; + return buf + (static_cast(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast(-n)); + return buf + (2U + static_cast(-n) + static_cast(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// serialization // +/////////////////// + +/// how to treat decoding errors +enum class error_handler_t +{ + strict, ///< throw a type_error exception in case of invalid UTF-8 + replace, ///< replace invalid UTF-8 sequences with U+FFFD + ignore ///< ignore invalid UTF-8 sequences +}; + +template +class serializer +{ + using string_t = typename BasicJsonType::string_t; + using number_float_t = typename BasicJsonType::number_float_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using binary_char_t = typename BasicJsonType::binary_t::value_type; + static constexpr std::uint8_t UTF8_ACCEPT = 0; + static constexpr std::uint8_t UTF8_REJECT = 1; + + public: + /*! + @param[in] s output stream to serialize to + @param[in] ichar indentation character to use + @param[in] error_handler_ how to react on decoding errors + */ + serializer(output_adapter_t s, const char ichar, + error_handler_t error_handler_ = error_handler_t::strict) + : o(std::move(s)) + , loc(std::localeconv()) + , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->thousands_sep))) + , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->decimal_point))) + , indent_char(ichar) + , indent_string(512, indent_char) + , error_handler(error_handler_) + {} + + // delete because of pointer members + serializer(const serializer&) = delete; + serializer& operator=(const serializer&) = delete; + serializer(serializer&&) = delete; + serializer& operator=(serializer&&) = delete; + ~serializer() = default; + + /*! + @brief internal implementation of the serialization function + + This function is called by the public member function dump and organizes + the serialization internally. The indentation level is propagated as + additional parameter. In case of arrays and objects, the function is + called recursively. + + - strings and object keys are escaped using `escape_string()` + - integer numbers are converted implicitly via `operator<<` + - floating-point numbers are converted to a string using `"%g"` format + - binary values are serialized as objects containing the subtype and the + byte array + + @param[in] val value to serialize + @param[in] pretty_print whether the output shall be pretty-printed + @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters + in the output are escaped with `\uXXXX` sequences, and the result consists + of ASCII characters only. + @param[in] indent_step the indent level + @param[in] current_indent the current indent level (only used internally) + */ + void dump(const BasicJsonType& val, + const bool pretty_print, + const bool ensure_ascii, + const unsigned int indent_step, + const unsigned int current_indent = 0) + { + switch (val.m_type) + { + case value_t::object: + { + if (val.m_value.object->empty()) + { + o->write_characters("{}", 2); + return; + } + + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_character('{'); + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + + o->write_character('}'); + } + + return; + } + + case value_t::array: + { + if (val.m_value.array->empty()) + { + o->write_characters("[]", 2); + return; + } + + if (pretty_print) + { + o->write_characters("[\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + dump(*i, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + o->write_characters(indent_string.c_str(), new_indent); + dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character(']'); + } + else + { + o->write_character('['); + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + dump(*i, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); + + o->write_character(']'); + } + + return; + } + + case value_t::string: + { + o->write_character('\"'); + dump_escaped(*val.m_value.string, ensure_ascii); + o->write_character('\"'); + return; + } + + case value_t::binary: + { + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"bytes\": [", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_characters(", ", 2); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\n", 3); + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"subtype\": ", 11); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + } + else + { + o->write_characters("null", 4); + } + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_characters("{\"bytes\":[", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_character(','); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\"subtype\":", 12); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + o->write_character('}'); + } + else + { + o->write_characters("null}", 5); + } + } + return; + } + + case value_t::boolean: + { + if (val.m_value.boolean) + { + o->write_characters("true", 4); + } + else + { + o->write_characters("false", 5); + } + return; + } + + case value_t::number_integer: + { + dump_integer(val.m_value.number_integer); + return; + } + + case value_t::number_unsigned: + { + dump_integer(val.m_value.number_unsigned); + return; + } + + case value_t::number_float: + { + dump_float(val.m_value.number_float); + return; + } + + case value_t::discarded: + { + o->write_characters("", 11); + return; + } + + case value_t::null: + { + o->write_characters("null", 4); + return; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief dump escaped string + + Escape a string by replacing certain special characters by a sequence of an + escape character (backslash) and another character and other control + characters by a sequence of "\u" followed by a four-digit hex + representation. The escaped string is written to output stream @a o. + + @param[in] s the string to escape + @param[in] ensure_ascii whether to escape non-ASCII characters with + \uXXXX sequences + + @complexity Linear in the length of string @a s. + */ + void dump_escaped(const string_t& s, const bool ensure_ascii) + { + std::uint32_t codepoint{}; + std::uint8_t state = UTF8_ACCEPT; + std::size_t bytes = 0; // number of bytes written to string_buffer + + // number of bytes written at the point of the last valid byte + std::size_t bytes_after_last_accept = 0; + std::size_t undumped_chars = 0; + + for (std::size_t i = 0; i < s.size(); ++i) + { + const auto byte = static_cast(s[i]); + + switch (decode(state, codepoint, byte)) + { + case UTF8_ACCEPT: // decode found a new code point + { + switch (codepoint) + { + case 0x08: // backspace + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'b'; + break; + } + + case 0x09: // horizontal tab + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 't'; + break; + } + + case 0x0A: // newline + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'n'; + break; + } + + case 0x0C: // formfeed + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'f'; + break; + } + + case 0x0D: // carriage return + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'r'; + break; + } + + case 0x22: // quotation mark + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\"'; + break; + } + + case 0x5C: // reverse solidus + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\\'; + break; + } + + default: + { + // escape control characters (0x00..0x1F) or, if + // ensure_ascii parameter is used, non-ASCII characters + if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) + { + if (codepoint <= 0xFFFF) + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", + static_cast(codepoint))); + bytes += 6; + } + else + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast(0xD7C0u + (codepoint >> 10u)), + static_cast(0xDC00u + (codepoint & 0x3FFu)))); + bytes += 12; + } + } + else + { + // copy byte to buffer (all previous bytes + // been copied have in default case above) + string_buffer[bytes++] = s[i]; + } + break; + } + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + // remember the byte position of this accept + bytes_after_last_accept = bytes; + undumped_chars = 0; + break; + } + + case UTF8_REJECT: // decode found invalid UTF-8 byte + { + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + hex_bytes(byte | 0), BasicJsonType())); + } + + case error_handler_t::ignore: + case error_handler_t::replace: + { + // in case we saw this character the first time, we + // would like to read it again, because the byte + // may be OK for itself, but just not OK for the + // previous sequence + if (undumped_chars > 0) + { + --i; + } + + // reset length buffer to the last accepted index; + // thus removing/ignoring the invalid characters + bytes = bytes_after_last_accept; + + if (error_handler == error_handler_t::replace) + { + // add a replacement character + if (ensure_ascii) + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'u'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'd'; + } + else + { + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xEF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBD'); + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + bytes_after_last_accept = bytes; + } + + undumped_chars = 0; + + // continue processing the string + state = UTF8_ACCEPT; + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + break; + } + + default: // decode found yet incomplete multi-byte code point + { + if (!ensure_ascii) + { + // code point will not be escaped - copy byte to buffer + string_buffer[bytes++] = s[i]; + } + ++undumped_chars; + break; + } + } + } + + // we finished processing the string + if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) + { + // write buffer + if (bytes > 0) + { + o->write_characters(string_buffer.data(), bytes); + } + } + else + { + // we finish reading, but do not accept: string was incomplete + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + hex_bytes(static_cast(s.back() | 0)), BasicJsonType())); + } + + case error_handler_t::ignore: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + break; + } + + case error_handler_t::replace: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + // add a replacement character + if (ensure_ascii) + { + o->write_characters("\\ufffd", 6); + } + else + { + o->write_characters("\xEF\xBF\xBD", 3); + } + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + } + + private: + /*! + @brief count digits + + Count the number of decimal (base 10) digits for an input unsigned integer. + + @param[in] x unsigned integer number to count its digits + @return number of decimal digits + */ + inline unsigned int count_digits(number_unsigned_t x) noexcept + { + unsigned int n_digits = 1; + for (;;) + { + if (x < 10) + { + return n_digits; + } + if (x < 100) + { + return n_digits + 1; + } + if (x < 1000) + { + return n_digits + 2; + } + if (x < 10000) + { + return n_digits + 3; + } + x = x / 10000u; + n_digits += 4; + } + } + + /*! + * @brief convert a byte to a uppercase hex representation + * @param[in] byte byte to represent + * @return representation ("00".."FF") + */ + static std::string hex_bytes(std::uint8_t byte) + { + std::string result = "FF"; + constexpr const char* nibble_to_hex = "0123456789ABCDEF"; + result[0] = nibble_to_hex[byte / 16]; + result[1] = nibble_to_hex[byte % 16]; + return result; + } + + // templates to avoid warnings about useless casts + template ::value, int> = 0> + bool is_negative_number(NumberType x) + { + return x < 0; + } + + template < typename NumberType, enable_if_t ::value, int > = 0 > + bool is_negative_number(NumberType /*unused*/) + { + return false; + } + + /*! + @brief dump an integer + + Dump a given integer to output stream @a o. Works internally with + @a number_buffer. + + @param[in] x integer number (signed or unsigned) to dump + @tparam NumberType either @a number_integer_t or @a number_unsigned_t + */ + template < typename NumberType, detail::enable_if_t < + std::is_integral::value || + std::is_same::value || + std::is_same::value || + std::is_same::value, + int > = 0 > + void dump_integer(NumberType x) + { + static constexpr std::array, 100> digits_to_99 + { + { + {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, + {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, + {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, + {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, + {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, + {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, + {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, + {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, + {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, + {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, + } + }; + + // special case for "0" + if (x == 0) + { + o->write_character('0'); + return; + } + + // use a pointer to fill the buffer + auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg) + + number_unsigned_t abs_value; + + unsigned int n_chars{}; + + if (is_negative_number(x)) + { + *buffer_ptr = '-'; + abs_value = remove_sign(static_cast(x)); + + // account one more byte for the minus sign + n_chars = 1 + count_digits(abs_value); + } + else + { + abs_value = static_cast(x); + n_chars = count_digits(abs_value); + } + + // spare 1 byte for '\0' + JSON_ASSERT(n_chars < number_buffer.size() - 1); + + // jump to the end to generate the string from backward, + // so we later avoid reversing the result + buffer_ptr += n_chars; + + // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu + // See: https://www.youtube.com/watch?v=o4-CwDo2zpg + while (abs_value >= 100) + { + const auto digits_index = static_cast((abs_value % 100)); + abs_value /= 100; + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + + if (abs_value >= 10) + { + const auto digits_index = static_cast(abs_value); + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + else + { + *(--buffer_ptr) = static_cast('0' + abs_value); + } + + o->write_characters(number_buffer.data(), n_chars); + } + + /*! + @brief dump a floating-point number + + Dump a given floating-point number to output stream @a o. Works internally + with @a number_buffer. + + @param[in] x floating-point number to dump + */ + void dump_float(number_float_t x) + { + // NaN / inf + if (!std::isfinite(x)) + { + o->write_characters("null", 4); + return; + } + + // If number_float_t is an IEEE-754 single or double precision number, + // use the Grisu2 algorithm to produce short numbers which are + // guaranteed to round-trip, using strtof and strtod, resp. + // + // NB: The test below works if == . + static constexpr bool is_ieee_single_or_double + = (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 24 && std::numeric_limits::max_exponent == 128) || + (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 53 && std::numeric_limits::max_exponent == 1024); + + dump_float(x, std::integral_constant()); + } + + void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) + { + auto* begin = number_buffer.data(); + auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); + + o->write_characters(begin, static_cast(end - begin)); + } + + void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) + { + // get number of digits for a float -> text -> float round-trip + static constexpr auto d = std::numeric_limits::max_digits10; + + // the actual conversion + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); + + // negative value indicates an error + JSON_ASSERT(len > 0); + // check if buffer was large enough + JSON_ASSERT(static_cast(len) < number_buffer.size()); + + // erase thousands separator + if (thousands_sep != '\0') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); + std::fill(end, number_buffer.end(), '\0'); + JSON_ASSERT((end - number_buffer.begin()) <= len); + len = (end - number_buffer.begin()); + } + + // convert decimal point to '.' + if (decimal_point != '\0' && decimal_point != '.') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); + if (dec_pos != number_buffer.end()) + { + *dec_pos = '.'; + } + } + + o->write_characters(number_buffer.data(), static_cast(len)); + + // determine if we need to append ".0" + const bool value_is_int_like = + std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, + [](char c) + { + return c == '.' || c == 'e'; + }); + + if (value_is_int_like) + { + o->write_characters(".0", 2); + } + } + + /*! + @brief check whether a string is UTF-8 encoded + + The function checks each byte of a string whether it is UTF-8 encoded. The + result of the check is stored in the @a state parameter. The function must + be called initially with state 0 (accept). State 1 means the string must + be rejected, because the current byte is not allowed. If the string is + completely processed, but the state is non-zero, the string ended + prematurely; that is, the last byte indicated more bytes should have + followed. + + @param[in,out] state the state of the decoding + @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) + @param[in] byte next byte to decode + @return new state + + @note The function has been edited: a std::array is used. + + @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann + @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + */ + static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept + { + static const std::array utf8d = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF + 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF + 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF + 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF + 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 + 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 + 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 + } + }; + + JSON_ASSERT(byte < utf8d.size()); + const std::uint8_t type = utf8d[byte]; + + codep = (state != UTF8_ACCEPT) + ? (byte & 0x3fu) | (codep << 6u) + : (0xFFu >> type) & (byte); + + std::size_t index = 256u + static_cast(state) * 16u + static_cast(type); + JSON_ASSERT(index < 400); + state = utf8d[index]; + return state; + } + + /* + * Overload to make the compiler happy while it is instantiating + * dump_integer for number_unsigned_t. + * Must never be called. + */ + number_unsigned_t remove_sign(number_unsigned_t x) + { + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE + } + + /* + * Helper function for dump_integer + * + * This function takes a negative signed integer and returns its absolute + * value as unsigned integer. The plus/minus shuffling is necessary as we can + * not directly remove the sign of an arbitrary signed integer as the + * absolute values of INT_MIN and INT_MAX are usually not the same. See + * #1708 for details. + */ + inline number_unsigned_t remove_sign(number_integer_t x) noexcept + { + JSON_ASSERT(x < 0 && x < (std::numeric_limits::max)()); // NOLINT(misc-redundant-expression) + return static_cast(-(x + 1)) + 1; + } + + private: + /// the output of the serializer + output_adapter_t o = nullptr; + + /// a (hopefully) large enough character buffer + std::array number_buffer{{}}; + + /// the locale + const std::lconv* loc = nullptr; + /// the locale's thousand separator character + const char thousands_sep = '\0'; + /// the locale's decimal point character + const char decimal_point = '\0'; + + /// string buffer + std::array string_buffer{{}}; + + /// the indentation character + const char indent_char; + /// the indentation string + string_t indent_string; + + /// error_handler how to react on decoding errors + const error_handler_t error_handler; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // less +#include // initializer_list +#include // input_iterator_tag, iterator_traits +#include // allocator +#include // for out_of_range +#include // enable_if, is_convertible +#include // pair +#include // vector + +// #include + + +namespace nlohmann +{ + +/// ordered_map: a minimal map-like container that preserves insertion order +/// for use within nlohmann::basic_json +template , + class Allocator = std::allocator>> + struct ordered_map : std::vector, Allocator> +{ + using key_type = Key; + using mapped_type = T; + using Container = std::vector, Allocator>; + using iterator = typename Container::iterator; + using const_iterator = typename Container::const_iterator; + using size_type = typename Container::size_type; + using value_type = typename Container::value_type; + + // Explicit constructors instead of `using Container::Container` + // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) + ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {} + template + ordered_map(It first, It last, const Allocator& alloc = Allocator()) + : Container{first, last, alloc} {} + ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) + : Container{init, alloc} {} + + std::pair emplace(const key_type& key, T&& t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return {it, false}; + } + } + Container::emplace_back(key, t); + return {--this->end(), true}; + } + + T& operator[](const Key& key) + { + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + iterator erase(iterator pos) + { + return erase(pos, std::next(pos)); + } + + iterator erase(iterator first, iterator last) + { + const auto elements_affected = std::distance(first, last); + const auto offset = std::distance(Container::begin(), first); + + // This is the start situation. We need to delete elements_affected + // elements (3 in this example: e, f, g), and need to return an + // iterator past the last deleted element (h in this example). + // Note that offset is the distance from the start of the vector + // to first. We will need this later. + + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // first last + + // Since we cannot move const Keys, we re-construct them in place. + // We start at first and re-construct (viz. copy) the elements from + // the back of the vector. Example for first iteration: + + // ,--------. + // v | destroy e and re-construct with h + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // it it + elements_affected + + for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) + { + it->~value_type(); // destroy but keep allocation + new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // "move" next element to it + } + + // [ a, b, c, d, h, i, j, h, i, j ] + // ^ ^ + // first last + + // remove the unneeded elements at the end of the vector + Container::resize(this->size() - static_cast(elements_affected)); + + // [ a, b, c, d, h, i, j ] + // ^ ^ + // first last + + // first is now pointing past the last deleted element, but we cannot + // use this iterator, because it may have been invalidated by the + // resize call. Instead, we can return begin() + offset. + return Container::begin() + offset; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } + + template + using require_input_iter = typename std::enable_if::iterator_category, + std::input_iterator_tag>::value>::type; + + template> + void insert(InputIt first, InputIt last) + { + for (auto it = first; it != last; ++it) + { + insert(*it); + } + } +}; + +} // namespace nlohmann + + +#if defined(JSON_HAS_CPP_17) + #include +#endif + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ + +/*! +@brief a class to store JSON values + +@internal +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + +@note ObjectType trick from https://stackoverflow.com/a/9860911 +@endinternal + +@since version 1.0.0 + +@nosubgrouping +*/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + private: + template friend struct detail::external_constructor; + friend ::nlohmann::json_pointer; + + template + friend class ::nlohmann::detail::parser; + friend ::nlohmann::detail::serializer; + template + friend class ::nlohmann::detail::iter_impl; + template + friend class ::nlohmann::detail::binary_writer; + template + friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; + friend class ::nlohmann::detail::exception; + + /// workaround type for MSVC + using basic_json_t = NLOHMANN_BASIC_JSON_TPL; + + JSON_PRIVATE_UNLESS_TESTED: + // convenience aliases for types residing in namespace detail; + using lexer = ::nlohmann::detail::lexer_base; + + template + static ::nlohmann::detail::parser parser( + InputAdapterType adapter, + detail::parser_callback_tcb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false + ) + { + return ::nlohmann::detail::parser(std::move(adapter), + std::move(cb), allow_exceptions, ignore_comments); + } + + private: + using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; + template + using internal_iterator = ::nlohmann::detail::internal_iterator; + template + using iter_impl = ::nlohmann::detail::iter_impl; + template + using iteration_proxy = ::nlohmann::detail::iteration_proxy; + template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; + + template + using output_adapter_t = ::nlohmann::detail::output_adapter_t; + + template + using binary_reader = ::nlohmann::detail::binary_reader; + template using binary_writer = ::nlohmann::detail::binary_writer; + + JSON_PRIVATE_UNLESS_TESTED: + using serializer = ::nlohmann::detail::serializer; + + public: + using value_t = detail::value_t; + /// JSON Pointer, see @ref nlohmann::json_pointer + using json_pointer = ::nlohmann::json_pointer; + template + using json_serializer = JSONSerializer; + /// how to treat decoding errors + using error_handler_t = detail::error_handler_t; + /// how to treat CBOR tags + using cbor_tag_handler_t = detail::cbor_tag_handler_t; + /// helper type for initializer lists of basic_json values + using initializer_list_t = std::initializer_list>; + + using input_format_t = detail::input_format_t; + /// SAX interface type, see @ref nlohmann::json_sax + using json_sax_t = json_sax; + + //////////////// + // exceptions // + //////////////// + + /// @name exceptions + /// Classes to implement user-defined exceptions. + /// @{ + + using exception = detail::exception; + using parse_error = detail::parse_error; + using invalid_iterator = detail::invalid_iterator; + using type_error = detail::type_error; + using out_of_range = detail::out_of_range; + using other_error = detail::other_error; + + /// @} + + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType; + + /// the type of an element pointer + using pointer = typename std::allocator_traits::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits::const_pointer; + + /// an iterator for a basic_json container + using iterator = iter_impl; + /// a const iterator for a basic_json container + using const_iterator = iter_impl; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator; + + /// @} + + + /// @brief returns the allocator associated with the container + /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ + static allocator_type get_allocator() + { + return allocator_type(); + } + + /// @brief returns version information on the library + /// @sa https://json.nlohmann.me/api/basic_json/meta/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json meta() + { + basic_json result; + + result["copyright"] = "(C) 2013-2022 Niels Lohmann"; + result["name"] = "JSON for Modern C++"; + result["url"] = "https://github.com/nlohmann/json"; + result["version"]["string"] = + std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_PATCH); + result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; + result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; + result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; + +#ifdef _WIN32 + result["platform"] = "win32"; +#elif defined __linux__ + result["platform"] = "linux"; +#elif defined __APPLE__ + result["platform"] = "apple"; +#elif defined __unix__ + result["platform"] = "unix"; +#else + result["platform"] = "unknown"; +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; +#elif defined(__clang__) + result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; +#elif defined(__GNUC__) || defined(__GNUG__) + result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; +#elif defined(__HP_cc) || defined(__HP_aCC) + result["compiler"] = "hp" +#elif defined(__IBMCPP__) + result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; +#elif defined(_MSC_VER) + result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; +#elif defined(__PGI) + result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; +#elif defined(__SUNPRO_CC) + result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; +#else + result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; +#endif + +#ifdef __cplusplus + result["compiler"]["c++"] = std::to_string(__cplusplus); +#else + result["compiler"]["c++"] = "unknown"; +#endif + return result; + } + + + /////////////////////////// + // JSON value data types // + /////////////////////////// + + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ + + /// @brief object key comparator type + /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/ +#if defined(JSON_HAS_CPP_14) + // Use transparent comparator if possible, combined with perfect forwarding + // on find() and count() calls prevents unnecessary string construction. + using object_comparator_t = std::less<>; +#else + using object_comparator_t = std::less; +#endif + + /// @brief a type for an object + /// @sa https://json.nlohmann.me/api/basic_json/object_t/ + using object_t = ObjectType>>; + + /// @brief a type for an array + /// @sa https://json.nlohmann.me/api/basic_json/array_t/ + using array_t = ArrayType>; + + /// @brief a type for a string + /// @sa https://json.nlohmann.me/api/basic_json/string_t/ + using string_t = StringType; + + /// @brief a type for a boolean + /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/ + using boolean_t = BooleanType; + + /// @brief a type for a number (integer) + /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/ + using number_integer_t = NumberIntegerType; + + /// @brief a type for a number (unsigned) + /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/ + using number_unsigned_t = NumberUnsignedType; + + /// @brief a type for a number (floating-point) + /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/ + using number_float_t = NumberFloatType; + + /// @brief a type for a packed binary type + /// @sa https://json.nlohmann.me/api/basic_json/binary_t/ + using binary_t = nlohmann::byte_container_with_subtype; + + /// @} + + private: + + /// helper for exception-safe object creation + template + JSON_HEDLEY_RETURNS_NON_NULL + static T* create(Args&& ... args) + { + AllocatorType alloc; + using AllocatorTraits = std::allocator_traits>; + + auto deleter = [&](T * obj) + { + AllocatorTraits::deallocate(alloc, obj, 1); + }; + std::unique_ptr obj(AllocatorTraits::allocate(alloc, 1), deleter); + AllocatorTraits::construct(alloc, obj.get(), std::forward(args)...); + JSON_ASSERT(obj != nullptr); + return obj.release(); + } + + //////////////////////// + // JSON value storage // + //////////////////////// + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief a JSON value + + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + binary | binary | pointer to @ref binary_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. + + @since version 1.0.0 + */ + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// binary (stored with pointer to save storage) + binary_t* binary; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) + { + case value_t::object: + { + object = create(); + break; + } + + case value_t::array: + { + array = create(); + break; + } + + case value_t::string: + { + string = create(""); + break; + } + + case value_t::binary: + { + binary = create(); + break; + } + + case value_t::boolean: + { + boolean = static_cast(false); + break; + } + + case value_t::number_integer: + { + number_integer = static_cast(0); + break; + } + + case value_t::number_unsigned: + { + number_unsigned = static_cast(0); + break; + } + + case value_t::number_float: + { + number_float = static_cast(0.0); + break; + } + + case value_t::null: + { + object = nullptr; // silence warning, see #821 + break; + } + + case value_t::discarded: + default: + { + object = nullptr; // silence warning, see #821 + if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) + { + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.10.5", basic_json())); // LCOV_EXCL_LINE + } + break; + } + } + } + + /// constructor for strings + json_value(const string_t& value) : string(create(value)) {} + + /// constructor for rvalue strings + json_value(string_t&& value) : string(create(std::move(value))) {} + + /// constructor for objects + json_value(const object_t& value) : object(create(value)) {} + + /// constructor for rvalue objects + json_value(object_t&& value) : object(create(std::move(value))) {} + + /// constructor for arrays + json_value(const array_t& value) : array(create(value)) {} + + /// constructor for rvalue arrays + json_value(array_t&& value) : array(create(std::move(value))) {} + + /// constructor for binary arrays + json_value(const typename binary_t::container_type& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays + json_value(typename binary_t::container_type&& value) : binary(create(std::move(value))) {} + + /// constructor for binary arrays (internal type) + json_value(const binary_t& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays (internal type) + json_value(binary_t&& value) : binary(create(std::move(value))) {} + + void destroy(value_t t) + { + if (t == value_t::array || t == value_t::object) + { + // flatten the current json_value to a heap-allocated stack + std::vector stack; + + // move the top-level items to stack + if (t == value_t::array) + { + stack.reserve(array->size()); + std::move(array->begin(), array->end(), std::back_inserter(stack)); + } + else + { + stack.reserve(object->size()); + for (auto&& it : *object) + { + stack.push_back(std::move(it.second)); + } + } + + while (!stack.empty()) + { + // move the last item to local variable to be processed + basic_json current_item(std::move(stack.back())); + stack.pop_back(); + + // if current_item is array/object, move + // its children to the stack to be processed later + if (current_item.is_array()) + { + std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack)); + + current_item.m_value.array->clear(); + } + else if (current_item.is_object()) + { + for (auto&& it : *current_item.m_value.object) + { + stack.push_back(std::move(it.second)); + } + + current_item.m_value.object->clear(); + } + + // it's now safe that current_item get destructed + // since it doesn't have any children + } + } + + switch (t) + { + case value_t::object: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, object); + std::allocator_traits::deallocate(alloc, object, 1); + break; + } + + case value_t::array: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, array); + std::allocator_traits::deallocate(alloc, array, 1); + break; + } + + case value_t::string: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, string); + std::allocator_traits::deallocate(alloc, string, 1); + break; + } + + case value_t::binary: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, binary); + std::allocator_traits::deallocate(alloc, binary, 1); + break; + } + + case value_t::null: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::discarded: + default: + { + break; + } + } + } + }; + + private: + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + + Furthermore, the parent relation is checked for arrays and objects: If + @a check_parents true and the value is an array or object, then the + container's elements must have the current value as parent. + + @param[in] check_parents whether the parent relation should be checked. + The value is true by default and should only be set to false + during destruction of objects when the invariant does not + need to hold. + */ + void assert_invariant(bool check_parents = true) const noexcept + { + JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr); + JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr); + JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr); + JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr); + +#if JSON_DIAGNOSTICS + JSON_TRY + { + // cppcheck-suppress assertWithSideEffect + JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j) + { + return j.m_parent == this; + })); + } + JSON_CATCH(...) {} // LCOV_EXCL_LINE +#endif + static_cast(check_parents); + } + + void set_parents() + { +#if JSON_DIAGNOSTICS + switch (m_type) + { + case value_t::array: + { + for (auto& element : *m_value.array) + { + element.m_parent = this; + } + break; + } + + case value_t::object: + { + for (auto& element : *m_value.object) + { + element.second.m_parent = this; + } + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + break; + } +#endif + } + + iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) + { +#if JSON_DIAGNOSTICS + for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) + { + (it + i)->m_parent = this; + } +#else + static_cast(count_set_parents); +#endif + return it; + } + + reference set_parent(reference j, std::size_t old_capacity = static_cast(-1)) + { +#if JSON_DIAGNOSTICS + if (old_capacity != static_cast(-1)) + { + // see https://github.com/nlohmann/json/issues/2838 + JSON_ASSERT(type() == value_t::array); + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + return j; + } + } + + // ordered_json uses a vector internally, so pointers could have + // been invalidated; see https://github.com/nlohmann/json/issues/2962 +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning(push ) +#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr +#endif + if (detail::is_ordered_map::value) + { + set_parents(); + return j; + } +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning( pop ) +#endif + + j.m_parent = this; +#else + static_cast(j); + static_cast(old_capacity); +#endif + return j; + } + + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// + + /// @brief parser event types + /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/ + using parse_event_t = detail::parse_event_t; + + /// @brief per-element parser callback type + /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/ + using parser_callback_t = detail::parser_callback_t; + + ////////////////// + // constructors // + ////////////////// + + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ + + /// @brief create an empty value with a given type + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const value_t v) + : m_type(v), m_value(v) + { + assert_invariant(); + } + + /// @brief create a null object + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(std::nullptr_t = nullptr) noexcept + : basic_json(value_t::null) + { + assert_invariant(); + } + + /// @brief create a JSON value from compatible types + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename CompatibleType, + typename U = detail::uncvref_t, + detail::enable_if_t < + !detail::is_basic_json::value && detail::is_compatible_type::value, int > = 0 > + basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape) + JSONSerializer::to_json(std::declval(), + std::forward(val)))) + { + JSONSerializer::to_json(*this, std::forward(val)); + set_parents(); + assert_invariant(); + } + + /// @brief create a JSON value from an existing one + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value&& !std::is_same::value, int > = 0 > + basic_json(const BasicJsonType& val) + { + using other_boolean_t = typename BasicJsonType::boolean_t; + using other_number_float_t = typename BasicJsonType::number_float_t; + using other_number_integer_t = typename BasicJsonType::number_integer_t; + using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using other_string_t = typename BasicJsonType::string_t; + using other_object_t = typename BasicJsonType::object_t; + using other_array_t = typename BasicJsonType::array_t; + using other_binary_t = typename BasicJsonType::binary_t; + + switch (val.type()) + { + case value_t::boolean: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_float: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_integer: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_unsigned: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::string: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::object: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::array: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::binary: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::null: + *this = nullptr; + break; + case value_t::discarded: + m_type = value_t::discarded; + break; + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + set_parents(); + assert_invariant(); + } + + /// @brief create a container (array or object) from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(initializer_list_t init, + bool type_deduction = true, + value_t manual_type = value_t::array) + { + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const detail::json_ref& element_ref) + { + return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string(); + }); + + // adjust type if type deduction is not wanted + if (!type_deduction) + { + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } + + // if object is wanted but impossible, throw an exception + if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) + { + JSON_THROW(type_error::create(301, "cannot create object from initializer list", basic_json())); + } + } + + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_type = value_t::object; + m_value = value_t::object; + + for (auto& element_ref : init) + { + auto element = element_ref.moved_or_copied(); + m_value.object->emplace( + std::move(*((*element.m_value.array)[0].m_value.string)), + std::move((*element.m_value.array)[1])); + } + } + else + { + // the initializer list describes an array -> create array + m_type = value_t::array; + m_value.array = create(init.begin(), init.end()); + } + + set_parents(); + assert_invariant(); + } + + /// @brief explicitly create a binary array (without subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = init; + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(init, subtype); + return res; + } + + /// @brief explicitly create a binary array + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = std::move(init); + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(std::move(init), subtype); + return res; + } + + /// @brief explicitly create an array from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/array/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json array(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::array); + } + + /// @brief explicitly create an object from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/object/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json object(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::object); + } + + /// @brief construct an array with count copies of given value + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create(cnt, val); + set_parents(); + assert_invariant(); + } + + /// @brief construct a JSON container given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < class InputIT, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type = 0 > + basic_json(InputIT first, InputIT last) + { + JSON_ASSERT(first.m_object != nullptr); + JSON_ASSERT(last.m_object != nullptr); + + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", basic_json())); + } + + // copy type from first iterator + m_type = first.m_object->m_type; + + // check if iterator range is complete for primitive values + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *first.m_object)); + } + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::binary: + case value_t::discarded: + default: + break; + } + + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = first.m_object->m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = first.m_object->m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value.number_float = first.m_object->m_value.number_float; + break; + } + + case value_t::boolean: + { + m_value.boolean = first.m_object->m_value.boolean; + break; + } + + case value_t::string: + { + m_value = *first.m_object->m_value.string; + break; + } + + case value_t::object: + { + m_value.object = create(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_value.array = create(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::binary: + { + m_value = *first.m_object->m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + std::string(first.m_object->type_name()), *first.m_object)); + } + + set_parents(); + assert_invariant(); + } + + + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// + + template, + std::is_same>::value, int> = 0 > + basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} + + /// @brief copy constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const basic_json& other) + : m_type(other.m_type) + { + // check of passed value is valid + other.assert_invariant(); + + switch (m_type) + { + case value_t::object: + { + m_value = *other.m_value.object; + break; + } + + case value_t::array: + { + m_value = *other.m_value.array; + break; + } + + case value_t::string: + { + m_value = *other.m_value.string; + break; + } + + case value_t::boolean: + { + m_value = other.m_value.boolean; + break; + } + + case value_t::number_integer: + { + m_value = other.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value = other.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value = other.m_value.number_float; + break; + } + + case value_t::binary: + { + m_value = *other.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + + set_parents(); + assert_invariant(); + } + + /// @brief move constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(basic_json&& other) noexcept + : m_type(std::move(other.m_type)), + m_value(std::move(other.m_value)) + { + // check that passed value is valid + other.assert_invariant(false); + + // invalidate payload + other.m_type = value_t::null; + other.m_value = {}; + + set_parents(); + assert_invariant(); + } + + /// @brief copy assignment + /// @sa https://json.nlohmann.me/api/basic_json/operator=/ + basic_json& operator=(basic_json other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_type, other.m_type); + swap(m_value, other.m_value); + + set_parents(); + assert_invariant(); + return *this; + } + + /// @brief destructor + /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/ + ~basic_json() noexcept + { + assert_invariant(false); + m_value.destroy(m_type); + } + + /// @} + + public: + /////////////////////// + // object inspection // + /////////////////////// + + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ + + /// @brief serialization + /// @sa https://json.nlohmann.me/api/basic_json/dump/ + string_t dump(const int indent = -1, + const char indent_char = ' ', + const bool ensure_ascii = false, + const error_handler_t error_handler = error_handler_t::strict) const + { + string_t result; + serializer s(detail::output_adapter(result), indent_char, error_handler); + + if (indent >= 0) + { + s.dump(*this, true, ensure_ascii, static_cast(indent)); + } + else + { + s.dump(*this, false, ensure_ascii, 0); + } + + return result; + } + + /// @brief return the type of the JSON value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/type/ + constexpr value_t type() const noexcept + { + return m_type; + } + + /// @brief return whether type is primitive + /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/ + constexpr bool is_primitive() const noexcept + { + return is_null() || is_string() || is_boolean() || is_number() || is_binary(); + } + + /// @brief return whether type is structured + /// @sa https://json.nlohmann.me/api/basic_json/is_structured/ + constexpr bool is_structured() const noexcept + { + return is_array() || is_object(); + } + + /// @brief return whether value is null + /// @sa https://json.nlohmann.me/api/basic_json/is_null/ + constexpr bool is_null() const noexcept + { + return m_type == value_t::null; + } + + /// @brief return whether value is a boolean + /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/ + constexpr bool is_boolean() const noexcept + { + return m_type == value_t::boolean; + } + + /// @brief return whether value is a number + /// @sa https://json.nlohmann.me/api/basic_json/is_number/ + constexpr bool is_number() const noexcept + { + return is_number_integer() || is_number_float(); + } + + /// @brief return whether value is an integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/ + constexpr bool is_number_integer() const noexcept + { + return m_type == value_t::number_integer || m_type == value_t::number_unsigned; + } + + /// @brief return whether value is an unsigned integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/ + constexpr bool is_number_unsigned() const noexcept + { + return m_type == value_t::number_unsigned; + } + + /// @brief return whether value is a floating-point number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/ + constexpr bool is_number_float() const noexcept + { + return m_type == value_t::number_float; + } + + /// @brief return whether value is an object + /// @sa https://json.nlohmann.me/api/basic_json/is_object/ + constexpr bool is_object() const noexcept + { + return m_type == value_t::object; + } + + /// @brief return whether value is an array + /// @sa https://json.nlohmann.me/api/basic_json/is_array/ + constexpr bool is_array() const noexcept + { + return m_type == value_t::array; + } + + /// @brief return whether value is a string + /// @sa https://json.nlohmann.me/api/basic_json/is_string/ + constexpr bool is_string() const noexcept + { + return m_type == value_t::string; + } + + /// @brief return whether value is a binary array + /// @sa https://json.nlohmann.me/api/basic_json/is_binary/ + constexpr bool is_binary() const noexcept + { + return m_type == value_t::binary; + } + + /// @brief return whether value is discarded + /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/ + constexpr bool is_discarded() const noexcept + { + return m_type == value_t::discarded; + } + + /// @brief return the type of the JSON value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/ + constexpr operator value_t() const noexcept + { + return m_type; + } + + /// @} + + private: + ////////////////// + // value access // + ////////////////// + + /// get a boolean (explicit) + boolean_t get_impl(boolean_t* /*unused*/) const + { + if (JSON_HEDLEY_LIKELY(is_boolean())) + { + return m_value.boolean; + } + + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()), *this)); + } + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t* /*unused*/) noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t* /*unused*/) noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t* /*unused*/) noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (binary) + binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /// get a pointer to the value (binary) + constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /*! + @brief helper function to implement get_ref() + + This function helps to implement get_ref() without code duplication for + const and non-const overloads + + @tparam ThisType will be deduced as `basic_json` or `const basic_json` + + @throw type_error.303 if ReferenceType does not match underlying value + type of the current JSON + */ + template + static ReferenceType get_ref_impl(ThisType& obj) + { + // delegate the call to get_ptr<>() + auto* ptr = obj.template get_ptr::type>(); + + if (JSON_HEDLEY_LIKELY(ptr != nullptr)) + { + return *ptr; + } + + JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()), obj)); + } + + public: + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template::value, int>::type = 0> + auto get_ptr() noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast(nullptr)); + } + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template < typename PointerType, typename std::enable_if < + std::is_pointer::value&& + std::is_const::type>::value, int >::type = 0 > + constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast(nullptr)); + } + + private: + /*! + @brief get a value (explicit) + + Explicit type conversion between the JSON value and a compatible value + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + ValueType ret; + JSONSerializer::from_json(*this, ret); + return ret; + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json, + - @ref json_serializer has a `from_json()` method of the form + `void from_json(const basic_json&, ValueType&)`, and + - @ref json_serializer does not have a `from_json()` method of + the form `ValueType from_json(const basic_json&)` + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,get__ValueType_const} + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::is_default_constructible::value&& + detail::has_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), std::declval()))) + { + auto ret = ValueType(); + JSONSerializer::from_json(*this, ret); + return ret; + } + + /*! + @brief get a value (explicit); special case + + Explicit type conversion between the JSON value and a compatible value + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + return JSONSerializer::from_json(*this); + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json and + - @ref json_serializer has a `from_json()` method of the form + `ValueType from_json(const basic_json&)` + + @note If @ref json_serializer has both overloads of + `from_json()`, this one is chosen. + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::has_non_default_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval()))) + { + return JSONSerializer::from_json(*this); + } + + /*! + @brief get special-case overload + + This overloads converts the current @ref basic_json in a different + @ref basic_json type + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this, converted into @a BasicJsonType + + @complexity Depending on the implementation of the called `from_json()` + method. + + @since version 3.2.0 + */ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value, + int > = 0 > + BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const + { + return *this; + } + + /*! + @brief get special-case overload + + This overloads avoids a lot of template boilerplate, it can be seen as the + identity method + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this + + @complexity Constant. + + @since version 2.1.0 + */ + template::value, + int> = 0> + basic_json get_impl(detail::priority_tag<3> /*unused*/) const + { + return *this; + } + + /*! + @brief get a pointer value (explicit) + @copydoc get() + */ + template::value, + int> = 0> + constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept + -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + public: + /*! + @brief get a (pointer) value (explicit) + + Performs explicit type conversion between the JSON value and a compatible value if required. + + - If the requested type is a pointer to the internally stored JSON value that pointer is returned. + No copies are made. + + - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible + from the current @ref basic_json. + + - Otherwise the value is converted by calling the @ref json_serializer `from_json()` + method. + + @tparam ValueTypeCV the provided value type + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @tparam ValueType if necessary + + @throw what @ref json_serializer `from_json()` method throws if conversion is required + + @since version 2.1.0 + */ + template < typename ValueTypeCV, typename ValueType = detail::uncvref_t> +#if defined(JSON_HAS_CPP_14) + constexpr +#endif + auto get() const noexcept( + noexcept(std::declval().template get_impl(detail::priority_tag<4> {}))) + -> decltype(std::declval().template get_impl(detail::priority_tag<4> {})) + { + // we cannot static_assert on ValueTypeCV being non-const, because + // there is support for get(), which is why we + // still need the uncvref + static_assert(!std::is_reference::value, + "get() cannot be used with reference types, you might want to use get_ref()"); + return get_impl(detail::priority_tag<4> {}); + } + + /*! + @brief get a pointer value (explicit) + + Explicit pointer access to the internally stored JSON value. No copies are + made. + + @warning The pointer becomes invalid if the underlying JSON object + changes. + + @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, + @ref number_unsigned_t, or @ref number_float_t. + + @return pointer to the internally stored JSON value if the requested + pointer type @a PointerType fits to the JSON value; `nullptr` otherwise + + @complexity Constant. + + @liveexample{The example below shows how pointers to internal values of a + JSON value can be requested. Note that no type conversions are made and a + `nullptr` is returned if the value and the requested pointer type does not + match.,get__PointerType} + + @sa see @ref get_ptr() for explicit pointer-member access + + @since version 1.0.0 + */ + template::value, int>::type = 0> + auto get() noexcept -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + /// @brief get a value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_to/ + template < typename ValueType, + detail::enable_if_t < + !detail::is_basic_json::value&& + detail::has_from_json::value, + int > = 0 > + ValueType & get_to(ValueType& v) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + // specialization to allow calling get_to with a basic_json value + // see https://github.com/nlohmann/json/issues/2175 + template::value, + int> = 0> + ValueType & get_to(ValueType& v) const + { + v = *this; + return v; + } + + template < + typename T, std::size_t N, + typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + detail::enable_if_t < + detail::has_from_json::value, int > = 0 > + Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + noexcept(noexcept(JSONSerializer::from_json( + std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template < typename ReferenceType, typename std::enable_if < + std::is_reference::value&& + std::is_const::type>::value, int >::type = 0 > + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /*! + @brief get a value (implicit) + + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. + + @tparam ValueType non-pointer type compatible to the JSON value, for + instance `int` for JSON integer numbers, `bool` for JSON booleans, or + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. + + @return copy of the JSON value, converted to type @a ValueType + + @throw type_error.302 in case passed type @a ValueType is incompatible + to the JSON value type (e.g., the JSON value is of type boolean, but a + string is requested); see example below + + @complexity Linear in the size of the JSON value. + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,operator__ValueType} + + @since version 1.0.0 + */ + template < typename ValueType, typename std::enable_if < + detail::conjunction < + detail::negation>, + detail::negation>>, + detail::negation>, + detail::negation>, + detail::negation>>, + +#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) + detail::negation>, +#endif + detail::is_detected_lazy + >::value, int >::type = 0 > + JSON_EXPLICIT operator ValueType() const + { + // delegate the call to get<>() const + return get(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + binary_t& get_binary() + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + const binary_t& get_binary() const + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @} + + + //////////////////// + // element access // + //////////////////// + + /// @name element access + /// Access to the JSON value. + /// @{ + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(size_type idx) + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return set_parent(m_value.array->at(idx)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(size_type idx) const + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return m_value.array->at(idx); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const typename object_t::key_type& key) + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return set_parent(m_value.object->at(key)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const typename object_t::key_type& key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return m_value.object->at(key); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](size_type idx) + { + // implicitly convert null value to an empty array + if (is_null()) + { + m_type = value_t::array; + m_value.array = create(); + assert_invariant(); + } + + // operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) + { +#if JSON_DIAGNOSTICS + // remember array size & capacity before resizing + const auto old_size = m_value.array->size(); + const auto old_capacity = m_value.array->capacity(); +#endif + m_value.array->resize(idx + 1); + +#if JSON_DIAGNOSTICS + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + } + else + { + // set parent for values added above + set_parents(begin() + static_cast(old_size), static_cast(idx + 1 - old_size)); + } +#endif + assert_invariant(); + } + + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](size_type idx) const + { + // const operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const typename object_t::key_type& key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const typename object_t::key_type& key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + reference operator[](T* key) + { + // implicitly convert null to object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + const_reference operator[](T* key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// using std::is_convertible in a std::enable_if will fail when using explicit conversions + template < class ValueType, typename std::enable_if < + detail::is_getable::value + && !std::is_same::value, int >::type = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + string_t value(const typename object_t::key_type& key, const char* default_value) const + { + return value(key, string_t(default_value)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return default_value; + } + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + JSON_HEDLEY_NON_NULL(3) + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + reference front() + { + return *begin(); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + const_reference front() const + { + return *cbegin(); + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } + + /// @brief remove element given an iterator + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType pos) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) + { + JSON_THROW(invalid_iterator::create(205, "iterator out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove elements given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType first, IteratorType last) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) + { + JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + size_type erase(const typename object_t::key_type& key) + { + // this erase only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return m_value.object->erase(key); + } + + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + /// @brief remove element from a JSON array given an index + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + void erase(const size_type idx) + { + // this erase only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + if (JSON_HEDLEY_UNLIKELY(idx >= size())) + { + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + + m_value.array->erase(m_value.array->begin() + static_cast(idx)); + } + else + { + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + } + + /// @} + + + //////////// + // lookup // + //////////// + + /// @name lookup + /// @{ + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + iterator find(KeyT&& key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + const_iterator find(KeyT&& key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + template + size_type count(KeyT&& key) const + { + // return 0 for all nonobject types + return is_object() ? m_value.object->count(std::forward(key)) : 0; + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + template < typename KeyT, typename std::enable_if < + !std::is_same::type, json_pointer>::value, int >::type = 0 > + bool contains(KeyT && key) const + { + return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object given a JSON pointer + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const json_pointer& ptr) const + { + return ptr.contains(this); + } + + /// @} + + + /////////////// + // iterators // + /////////////// + + /// @name iterators + /// @{ + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + const_iterator begin() const noexcept + { + return cbegin(); + } + + /// @brief returns a const iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/cbegin/ + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + const_iterator end() const noexcept + { + return cend(); + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/cend/ + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + const_reverse_iterator rend() const noexcept + { + return crend(); + } + + /// @brief returns a const reverse iterator to the last element + /// @sa https://json.nlohmann.me/api/basic_json/crbegin/ + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } + + /// @brief returns a const reverse iterator to one before the first + /// @sa https://json.nlohmann.me/api/basic_json/crend/ + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } + + public: + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(reference ref) noexcept + { + return ref.items(); + } + + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(const_reference ref) noexcept + { + return ref.items(); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() noexcept + { + return iteration_proxy(*this); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() const noexcept + { + return iteration_proxy(*this); + } + + /// @} + + + ////////////// + // capacity // + ////////////// + + /// @name capacity + /// @{ + + /// @brief checks whether the container is empty. + /// @sa https://json.nlohmann.me/api/basic_json/empty/ + bool empty() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return true; + } + + case value_t::array: + { + // delegate call to array_t::empty() + return m_value.array->empty(); + } + + case value_t::object: + { + // delegate call to object_t::empty() + return m_value.object->empty(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types are nonempty + return false; + } + } + } + + /// @brief returns the number of elements + /// @sa https://json.nlohmann.me/api/basic_json/size/ + size_type size() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return 0; + } + + case value_t::array: + { + // delegate call to array_t::size() + return m_value.array->size(); + } + + case value_t::object: + { + // delegate call to object_t::size() + return m_value.object->size(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have size 1 + return 1; + } + } + } + + /// @brief returns the maximum possible number of elements + /// @sa https://json.nlohmann.me/api/basic_json/max_size/ + size_type max_size() const noexcept + { + switch (m_type) + { + case value_t::array: + { + // delegate call to array_t::max_size() + return m_value.array->max_size(); + } + + case value_t::object: + { + // delegate call to object_t::max_size() + return m_value.object->max_size(); + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have max_size() == size() + return size(); + } + } + } + + /// @} + + + /////////////// + // modifiers // + /////////////// + + /// @name modifiers + /// @{ + + /// @brief clears the contents + /// @sa https://json.nlohmann.me/api/basic_json/clear/ + void clear() noexcept + { + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = 0; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = 0; + break; + } + + case value_t::number_float: + { + m_value.number_float = 0.0; + break; + } + + case value_t::boolean: + { + m_value.boolean = false; + break; + } + + case value_t::string: + { + m_value.string->clear(); + break; + } + + case value_t::binary: + { + m_value.binary->clear(); + break; + } + + case value_t::array: + { + m_value.array->clear(); + break; + } + + case value_t::object: + { + m_value.object->clear(); + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(basic_json&& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (move semantics) + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(std::move(val)); + set_parent(m_value.array->back(), old_capacity); + // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const basic_json& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(val); + set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const typename object_t::value_type& val) + { + // push_back only works for null objects or objects + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to object + auto res = m_value.object->insert(val); + set_parent(res.first->second); + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(initializer_list_t init) + { + if (is_object() && init.size() == 2 && (*init.begin())->is_string()) + { + basic_json&& key = init.begin()->moved_or_copied(); + push_back(typename object_t::value_type( + std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); + } + else + { + push_back(basic_json(init)); + } + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(initializer_list_t init) + { + push_back(init); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/ + template + reference emplace_back(Args&& ... args) + { + // emplace_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (perfect forwarding) + const auto old_capacity = m_value.array->capacity(); + m_value.array->emplace_back(std::forward(args)...); + return set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an object if key does not exist + /// @sa https://json.nlohmann.me/api/basic_json/emplace/ + template + std::pair emplace(Args&& ... args) + { + // emplace only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to array (perfect forwarding) + auto res = m_value.object->emplace(std::forward(args)...); + set_parent(res.first->second); + + // create result iterator and set iterator to the result of emplace + auto it = begin(); + it.m_it.object_iterator = res.first; + + // return pair of iterator and boolean + return {it, res.second}; + } + + /// Helper for insertion of an iterator + /// @note: This uses std::distance to support GCC 4.8, + /// see https://github.com/nlohmann/json/pull/1257 + template + iterator insert_iterator(const_iterator pos, Args&& ... args) + { + iterator result(this); + JSON_ASSERT(m_value.array != nullptr); + + auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator); + m_value.array->insert(pos.m_it.array_iterator, std::forward(args)...); + result.m_it.array_iterator = m_value.array->begin() + insert_pos; + + // This could have been written as: + // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); + // but the return value of insert is missing in GCC 4.8, so it is written this way instead. + + set_parents(); + return result; + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } + + /// @brief inserts copies of element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, cnt, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts range of elements into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const_iterator first, const_iterator last) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) + { + JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); + } + + /// @brief inserts elements from initializer list into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, initializer_list_t ilist) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, ilist.begin(), ilist.end()); + } + + /// @brief inserts range of elements into object + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + void insert(const_iterator first, const_iterator last) + { + // insert only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", *this)); + } + + m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_reference j, bool merge_objects = false) + { + update(j.begin(), j.end(), merge_objects); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_iterator first, const_iterator last, bool merge_objects = false) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(first.m_object->type_name()), *first.m_object)); + } + + for (auto it = first; it != last; ++it) + { + if (merge_objects && it.value().is_object()) + { + auto it2 = m_value.object->find(it.key()); + if (it2 != m_value.object->end()) + { + it2->second.update(it.value(), true); + continue; + } + } + m_value.object->operator[](it.key()) = it.value(); +#if JSON_DIAGNOSTICS + m_value.object->operator[](it.key()).m_parent = this; +#endif + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(reference other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + std::swap(m_type, other.m_type); + std::swap(m_value, other.m_value); + + set_parents(); + other.set_parents(); + assert_invariant(); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + friend void swap(reference left, reference right) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + left.swap(right); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(array_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + std::swap(*(m_value.array), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(object_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + std::swap(*(m_value.object), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(string_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_string())) + { + std::swap(*(m_value.string), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(binary_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @} + + public: + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// + + /// @name lexicographical comparison operators + /// @{ + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + friend bool operator==(const_reference lhs, const_reference rhs) noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + return *lhs.m_value.array == *rhs.m_value.array; + + case value_t::object: + return *lhs.m_value.object == *rhs.m_value.object; + + case value_t::null: + return true; + + case value_t::string: + return *lhs.m_value.string == *rhs.m_value.string; + + case value_t::boolean: + return lhs.m_value.boolean == rhs.m_value.boolean; + + case value_t::number_integer: + return lhs.m_value.number_integer == rhs.m_value.number_integer; + + case value_t::number_unsigned: + return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; + + case value_t::number_float: + return lhs.m_value.number_float == rhs.m_value.number_float; + + case value_t::binary: + return *lhs.m_value.binary == *rhs.m_value.binary; + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); + } + + return false; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(const_reference lhs, ScalarType rhs) noexcept + { + return lhs == basic_json(rhs); + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) == rhs; + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs == rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs != basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) != rhs; + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + friend bool operator<(const_reference lhs, const_reference rhs) noexcept + { + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + // note parentheses are necessary, see + // https://github.com/nlohmann/json/issues/1530 + return (*lhs.m_value.array) < (*rhs.m_value.array); + + case value_t::object: + return (*lhs.m_value.object) < (*rhs.m_value.object); + + case value_t::null: + return false; + + case value_t::string: + return (*lhs.m_value.string) < (*rhs.m_value.string); + + case value_t::boolean: + return (lhs.m_value.boolean) < (rhs.m_value.boolean); + + case value_t::number_integer: + return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); + + case value_t::number_unsigned: + return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); + + case value_t::number_float: + return (lhs.m_value.number_float) < (rhs.m_value.number_float); + + case value_t::binary: + return (*lhs.m_value.binary) < (*rhs.m_value.binary); + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; + } + + // We only reach this line if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + return operator<(lhs_type, rhs_type); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(const_reference lhs, ScalarType rhs) noexcept + { + return lhs < basic_json(rhs); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) < rhs; + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + return !(rhs < lhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs <= basic_json(rhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) <= rhs; + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs <= rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(const_reference lhs, ScalarType rhs) noexcept + { + return lhs > basic_json(rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) > rhs; + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs >= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) >= rhs; + } + + /// @} + + /////////////////// + // serialization // + /////////////////// + + /// @name serialization + /// @{ +#ifndef JSON_NO_IO + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = o.width() > 0; + const auto indentation = pretty_print ? o.width() : 0; + + // reset width to 0 for subsequent calls to this stream + o.width(0); + + // do the actual serialization + serializer s(detail::output_adapter(o), o.fill()); + s.dump(j, pretty_print, false, static_cast(indentation)); + return o; + } + + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + /// @deprecated This function is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator<<(std::ostream&, const basic_json&) instead; that is, + /// replace calls like `j >> o;` with `o << j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } +#endif // JSON_NO_IO + /// @} + + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /// @brief deserialize from a compatible input + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(InputType&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::forward(i)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief deserialize from a pair of character iterators + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(IteratorType first, + IteratorType last, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) + static basic_json parse(detail::span_input_adapter&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(InputType&& i, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::forward(i)), nullptr, false, ignore_comments).accept(true); + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(IteratorType first, IteratorType last, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) + static bool accept(detail::span_input_adapter&& i, + const bool ignore_comments = false) + { + return parser(i.get(), nullptr, false, ignore_comments).accept(true); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(InputType&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::forward(i)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(3) + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::move(first), std::move(last)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + /// @deprecated This function is deprecated since 3.8.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// sax_parse(ptr, ptr + len) instead. + template + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = i.get(); + return format == input_format_t::json + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } +#ifndef JSON_NO_IO + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator>>(std::istream&, basic_json&) instead; that is, + /// replace calls like `j << i;` with `i >> j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + return operator>>(i, j); + } + + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + parser(detail::input_adapter(i)).parse(false, j); + return i; + } +#endif // JSON_NO_IO + /// @} + + /////////////////////////// + // convenience functions // + /////////////////////////// + + /// @brief return the type as string + /// @sa https://json.nlohmann.me/api/basic_json/type_name/ + JSON_HEDLEY_RETURNS_NON_NULL + const char* type_name() const noexcept + { + switch (m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::binary: + return "binary"; + case value_t::discarded: + return "discarded"; + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + default: + return "number"; + } + } + + + JSON_PRIVATE_UNLESS_TESTED: + ////////////////////// + // member variables // + ////////////////////// + + /// the type of the current element + value_t m_type = value_t::null; + + /// the value of the current element + json_value m_value = {}; + +#if JSON_DIAGNOSTICS + /// a pointer to a parent value (for debugging purposes) + basic_json* m_parent = nullptr; +#endif + + ////////////////////////////////////////// + // binary serialization/deserialization // + ////////////////////////////////////////// + + /// @name binary serialization/deserialization support + /// @{ + + public: + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static std::vector to_cbor(const basic_json& j) + { + std::vector result; + to_cbor(j, result); + return result; + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static std::vector to_msgpack(const basic_json& j) + { + std::vector result; + to_msgpack(j, result); + return result; + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static std::vector to_ubjson(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector result; + to_ubjson(j, result, use_size, use_type); + return result; + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static std::vector to_bson(const basic_json& j) + { + std::vector result; + to_bson(j, result); + return result; + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); + } + + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_msgpack(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_ubjson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_bson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + /// @} + + ////////////////////////// + // JSON Pointer support // + ////////////////////////// + + /// @name JSON Pointer functions + /// @{ + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + + /// @brief return flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/flatten/ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } + + /// @brief unflatten a previously flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/unflatten/ + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } + + /// @} + + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + + /// @brief applies a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + // make a working copy to apply the patch to + basic_json result = *this; + + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string & op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.empty()) + { + result = val; + return; + } + + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) + { + result.at(top_pointer); + } + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) + { + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = json_pointer::array_index(last_path); + if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) + { + // avoid undefined behavior + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", parent)); + } + + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + break; + } + + // if there exists a parent it cannot be primitive + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + }; + + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [this, &result](json_pointer & ptr) + { + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result.at(ptr); + + // remove child + if (parent.is_object()) + { + // perform range check + auto it = parent.find(last_path); + if (JSON_HEDLEY_LIKELY(it != parent.end())) + { + parent.erase(it); + } + else + { + JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found", *this)); + } + } + else if (parent.is_array()) + { + // note erase performs range check + parent.erase(json_pointer::array_index(last_path)); + } + }; + + // type check: top level value must be an array + if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", json_patch)); + } + + // iterate and apply the operations + for (const auto& val : json_patch) + { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json & + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'", val)); + } + + // check if result is of type string + if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'", val)); + } + + // no error: return value + return it->second; + }; + + // type check: every element of the array must be an object + if (JSON_HEDLEY_UNLIKELY(!val.is_object())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", val)); + } + + // collect mandatory members + const auto op = get_value("op", "op", true).template get(); + const auto path = get_value(op, "path", true).template get(); + json_pointer ptr(path); + + switch (get_op(op)) + { + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const auto from_path = get_value("move", "from", true).template get(); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const auto from_path = get_value("copy", "from", true).template get(); + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The copy is functionally identical to an "add" + // operation at the target location using the value + // specified in the "from" member. + operation_add(ptr, v); + break; + } + + case patch_operations::test: + { + bool success = false; + JSON_TRY + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (JSON_HEDLEY_UNLIKELY(!success)) + { + JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump(), val)); + } + + break; + } + + case patch_operations::invalid: + default: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid", val)); + } + } + } + + return result; + } + + /// @brief creates a diff as a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/diff/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json diff(const basic_json& source, const basic_json& target, + const std::string& path = "") + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + return result; + } + + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + std::size_t i = 0; + while (i < source.size() && i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // We now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + const auto end_index = static_cast(result.size()); + while (i < source.size()) + { + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/-"}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.cbegin(); it != source.cend(); ++it) + { + // escape the key name to be used in a JSON patch + const auto path_key = path + "/" + detail::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path_key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, {"path", path_key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.cbegin(); it != target.cend(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto path_key = path + "/" + detail::escape(it.key()); + result.push_back( + { + {"op", "add"}, {"path", path_key}, + {"value", it.value()} + }); + } + } + + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + break; + } + } + + return result; + } + + /// @} + + //////////////////////////////// + // JSON Merge Patch functions // + //////////////////////////////// + + /// @name JSON Merge Patch functions + /// @{ + + /// @brief applies a JSON Merge Patch + /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/ + void merge_patch(const basic_json& apply_patch) + { + if (apply_patch.is_object()) + { + if (!is_object()) + { + *this = object(); + } + for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) + { + if (it.value().is_null()) + { + erase(it.key()); + } + else + { + operator[](it.key()).merge_patch(it.value()); + } + } + } + else + { + *this = apply_patch; + } + } + + /// @} +}; + +/// @brief user-defined to_string function for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/to_string/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) +{ + return j.dump(); +} + +} // namespace nlohmann + +/////////////////////// +// nonmember support // +/////////////////////// + +namespace std // NOLINT(cert-dcl58-cpp) +{ + +/// @brief hash value for JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_hash/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct hash +{ + std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const + { + return nlohmann::detail::hash(j); + } +}; + +// specialization for std::less +template<> +struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679 +{ + /*! + @brief compare two value_t enum values + @since version 3.0.0 + */ + bool operator()(nlohmann::detail::value_t lhs, + nlohmann::detail::value_t rhs) const noexcept + { + return nlohmann::detail::operator<(lhs, rhs); + } +}; + +// C++20 prohibit function specialization in the std namespace. +#ifndef JSON_HAS_CPP_20 + +/// @brief exchanges the values of two JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name) + is_nothrow_move_constructible::value&& // NOLINT(misc-redundant-expression) + is_nothrow_move_assignable::value) +{ + j1.swap(j2); +} + +#endif + +} // namespace std + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +// #include + + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_CATCH +#undef JSON_THROW +#undef JSON_TRY +#undef JSON_PRIVATE_UNLESS_TESTED +#undef JSON_HAS_CPP_11 +#undef JSON_HAS_CPP_14 +#undef JSON_HAS_CPP_17 +#undef JSON_HAS_CPP_20 +#undef JSON_HAS_FILESYSTEM +#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL + +// #include + + +#undef JSON_HEDLEY_ALWAYS_INLINE +#undef JSON_HEDLEY_ARM_VERSION +#undef JSON_HEDLEY_ARM_VERSION_CHECK +#undef JSON_HEDLEY_ARRAY_PARAM +#undef JSON_HEDLEY_ASSUME +#undef JSON_HEDLEY_BEGIN_C_DECLS +#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#undef JSON_HEDLEY_CLANG_HAS_FEATURE +#undef JSON_HEDLEY_CLANG_HAS_WARNING +#undef JSON_HEDLEY_COMPCERT_VERSION +#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#undef JSON_HEDLEY_CONCAT +#undef JSON_HEDLEY_CONCAT3 +#undef JSON_HEDLEY_CONCAT3_EX +#undef JSON_HEDLEY_CONCAT_EX +#undef JSON_HEDLEY_CONST +#undef JSON_HEDLEY_CONSTEXPR +#undef JSON_HEDLEY_CONST_CAST +#undef JSON_HEDLEY_CPP_CAST +#undef JSON_HEDLEY_CRAY_VERSION +#undef JSON_HEDLEY_CRAY_VERSION_CHECK +#undef JSON_HEDLEY_C_DECL +#undef JSON_HEDLEY_DEPRECATED +#undef JSON_HEDLEY_DEPRECATED_FOR +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#undef JSON_HEDLEY_DIAGNOSTIC_POP +#undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#undef JSON_HEDLEY_DMC_VERSION +#undef JSON_HEDLEY_DMC_VERSION_CHECK +#undef JSON_HEDLEY_EMPTY_BASES +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#undef JSON_HEDLEY_END_C_DECLS +#undef JSON_HEDLEY_FLAGS +#undef JSON_HEDLEY_FLAGS_CAST +#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_BUILTIN +#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_EXTENSION +#undef JSON_HEDLEY_GCC_HAS_FEATURE +#undef JSON_HEDLEY_GCC_HAS_WARNING +#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#undef JSON_HEDLEY_GCC_VERSION +#undef JSON_HEDLEY_GCC_VERSION_CHECK +#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#undef JSON_HEDLEY_GNUC_HAS_FEATURE +#undef JSON_HEDLEY_GNUC_HAS_WARNING +#undef JSON_HEDLEY_GNUC_VERSION +#undef JSON_HEDLEY_GNUC_VERSION_CHECK +#undef JSON_HEDLEY_HAS_ATTRIBUTE +#undef JSON_HEDLEY_HAS_BUILTIN +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_HAS_EXTENSION +#undef JSON_HEDLEY_HAS_FEATURE +#undef JSON_HEDLEY_HAS_WARNING +#undef JSON_HEDLEY_IAR_VERSION +#undef JSON_HEDLEY_IAR_VERSION_CHECK +#undef JSON_HEDLEY_IBM_VERSION +#undef JSON_HEDLEY_IBM_VERSION_CHECK +#undef JSON_HEDLEY_IMPORT +#undef JSON_HEDLEY_INLINE +#undef JSON_HEDLEY_INTEL_CL_VERSION +#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#undef JSON_HEDLEY_INTEL_VERSION +#undef JSON_HEDLEY_INTEL_VERSION_CHECK +#undef JSON_HEDLEY_IS_CONSTANT +#undef JSON_HEDLEY_IS_CONSTEXPR_ +#undef JSON_HEDLEY_LIKELY +#undef JSON_HEDLEY_MALLOC +#undef JSON_HEDLEY_MCST_LCC_VERSION +#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#undef JSON_HEDLEY_MESSAGE +#undef JSON_HEDLEY_MSVC_VERSION +#undef JSON_HEDLEY_MSVC_VERSION_CHECK +#undef JSON_HEDLEY_NEVER_INLINE +#undef JSON_HEDLEY_NON_NULL +#undef JSON_HEDLEY_NO_ESCAPE +#undef JSON_HEDLEY_NO_RETURN +#undef JSON_HEDLEY_NO_THROW +#undef JSON_HEDLEY_NULL +#undef JSON_HEDLEY_PELLES_VERSION +#undef JSON_HEDLEY_PELLES_VERSION_CHECK +#undef JSON_HEDLEY_PGI_VERSION +#undef JSON_HEDLEY_PGI_VERSION_CHECK +#undef JSON_HEDLEY_PREDICT +#undef JSON_HEDLEY_PRINTF_FORMAT +#undef JSON_HEDLEY_PRIVATE +#undef JSON_HEDLEY_PUBLIC +#undef JSON_HEDLEY_PURE +#undef JSON_HEDLEY_REINTERPRET_CAST +#undef JSON_HEDLEY_REQUIRE +#undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#undef JSON_HEDLEY_REQUIRE_MSG +#undef JSON_HEDLEY_RESTRICT +#undef JSON_HEDLEY_RETURNS_NON_NULL +#undef JSON_HEDLEY_SENTINEL +#undef JSON_HEDLEY_STATIC_ASSERT +#undef JSON_HEDLEY_STATIC_CAST +#undef JSON_HEDLEY_STRINGIFY +#undef JSON_HEDLEY_STRINGIFY_EX +#undef JSON_HEDLEY_SUNPRO_VERSION +#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#undef JSON_HEDLEY_TINYC_VERSION +#undef JSON_HEDLEY_TINYC_VERSION_CHECK +#undef JSON_HEDLEY_TI_ARMCL_VERSION +#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL2000_VERSION +#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL430_VERSION +#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL6X_VERSION +#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL7X_VERSION +#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CLPRU_VERSION +#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#undef JSON_HEDLEY_TI_VERSION +#undef JSON_HEDLEY_TI_VERSION_CHECK +#undef JSON_HEDLEY_UNAVAILABLE +#undef JSON_HEDLEY_UNLIKELY +#undef JSON_HEDLEY_UNPREDICTABLE +#undef JSON_HEDLEY_UNREACHABLE +#undef JSON_HEDLEY_UNREACHABLE_RETURN +#undef JSON_HEDLEY_VERSION +#undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#undef JSON_HEDLEY_VERSION_DECODE_MINOR +#undef JSON_HEDLEY_VERSION_DECODE_REVISION +#undef JSON_HEDLEY_VERSION_ENCODE +#undef JSON_HEDLEY_WARNING +#undef JSON_HEDLEY_WARN_UNUSED_RESULT +#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#undef JSON_HEDLEY_FALL_THROUGH + + + +#endif // INCLUDE_NLOHMANN_JSON_HPP_ \ No newline at end of file diff --git a/include/serial/SerialPort.cpp b/include/serial/SerialPort.cpp new file mode 100644 index 0000000..2fff251 --- /dev/null +++ b/include/serial/SerialPort.cpp @@ -0,0 +1,131 @@ +/* +* Author: Manash Kumar Mandal +* Modified Library introduced in Arduino Playground which does not work +* This works perfectly +* LICENSE: MIT +*/ + +#include "SerialPort.hpp" + +SerialPort::SerialPort(const char *portName, int BAUD) +{ + this->connected = false; + + this->handler = CreateFileA(static_cast(portName), + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (this->handler == INVALID_HANDLE_VALUE) + { + if (GetLastError() == ERROR_FILE_NOT_FOUND) + { + std::cerr << "ERROR: Handle was not attached.Reason : " << portName << " not available\n"; + } + else + { + std::cerr << "ERROR!!!\n"; + } + } + else + { + DCB dcbSerialParameters = {0}; + + if (!GetCommState(this->handler, &dcbSerialParameters)) + { + std::cerr << "Failed to get current serial parameters\n"; + } + else + { + dcbSerialParameters.BaudRate = BAUD; + dcbSerialParameters.ByteSize = 8; + dcbSerialParameters.StopBits = ONESTOPBIT; + dcbSerialParameters.Parity = NOPARITY; + dcbSerialParameters.fDtrControl = DTR_CONTROL_ENABLE; + + if (!SetCommState(handler, &dcbSerialParameters)) + { + std::cout << "ALERT: could not set serial port parameters\n"; + } + else + { + this->connected = true; + PurgeComm(this->handler, PURGE_RXCLEAR | PURGE_TXCLEAR); + Sleep(ARDUINO_WAIT_TIME); + } + } + } +} + +SerialPort::~SerialPort() +{ + if (this->connected) + { + this->connected = false; + CloseHandle(this->handler); + } +} + +// Reading bytes from serial port to buffer; +// returns read bytes count, or if error occurs, returns 0 +int SerialPort::readSerialPort(const char *buffer, unsigned int buf_size) +{ + DWORD bytesRead{}; + unsigned int toRead = 0; + + ClearCommError(this->handler, &this->errors, &this->status); + + if (this->status.cbInQue > 0) + { + if (this->status.cbInQue > buf_size) + { + toRead = buf_size; + } + else + { + toRead = this->status.cbInQue; + } + } + + memset((void*) buffer, 0, buf_size); + + if (ReadFile(this->handler, (void*) buffer, toRead, &bytesRead, NULL)) + { + return bytesRead; + } + + return 0; +} + +// Sending provided buffer to serial port; +// returns true if succeed, false if not +bool SerialPort::writeSerialPort(const char *buffer, unsigned int buf_size) +{ + DWORD bytesSend; + + if (!WriteFile(this->handler, (void*) buffer, buf_size, &bytesSend, 0)) + { + ClearCommError(this->handler, &this->errors, &this->status); + return false; + } + + return true; +} + +// Checking if serial port is connected +bool SerialPort::isConnected() +{ + if (!ClearCommError(this->handler, &this->errors, &this->status)) + { + this->connected = false; + } + + return this->connected; +} + +void SerialPort::closeSerial() +{ + CloseHandle(this->handler); +} \ No newline at end of file diff --git a/include/serial/SerialPort.hpp b/include/serial/SerialPort.hpp new file mode 100644 index 0000000..a207d0c --- /dev/null +++ b/include/serial/SerialPort.hpp @@ -0,0 +1,31 @@ +/* +* Author: Manash Kumar Mandal +* Modified Library introduced in Arduino Playground which does not work +* This works perfectly +* LICENSE: MIT +*/ + +#pragma once + +#define ARDUINO_WAIT_TIME 2000 +#define MAX_DATA_LENGTH 255 + +#include +#include + +class SerialPort +{ +private: + HANDLE handler; + bool connected; + COMSTAT status; + DWORD errors; +public: + explicit SerialPort(const char *portName, int BAUD); + ~SerialPort(); + + int readSerialPort(const char *buffer, unsigned int buf_size); + bool writeSerialPort(const char *buffer, unsigned int buf_size); + bool isConnected(); + void closeSerial(); +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..2929525 --- /dev/null +++ b/main.cpp @@ -0,0 +1,333 @@ +#include +#include +#include +#include + +//#include "include/serial/SerialPort.hpp" +//#include "include/json.hpp" +#include "chordNote.h" +#include "song.h" + +//using json = nlohmann::json; +using namespace std; + +/*------------------------------ Constantes ---------------------------------*/ +#define BAUD 115200 // Frequence de transmission serielle +#define MSG_MAX_SIZE 1024 // Longueur maximale d'un message + + +/*------------------------- Prototypes de fonctions -------------------------*/ +//bool SendToSerial(SerialPort *arduino, json j_msg); +//bool RcvFromSerial(SerialPort *arduino, string &msg); + +/*---------------------------- Variables globales ---------------------------*/ +//SerialPort * arduino; //doit etre un objet global! +int led_state = 0; +//bool Fret1 = 0; +int Fret2 = 0; +int Fret3 = 0; +int Fret4 = 0; +int Fret5 = 0; +int JoyDir = 0; +int StrumUp = 0; +int StrumDown = 0; + +int main() +{ + string raw_msg; + + // Initialisation du port de communication + //string com; + //cout <<"Entrer le port de communication du Arduino: "; + //cin >> com; + + + + const int NB_SQUARES = 20; + ChordNote note1(0, 5000, 6000); + ChordNote note2(1, 6200, 6200); + ChordNote note3(2, 6600, 6600); + ChordNote note4(3, 6800, 6800); + ChordNote note5(0, 7000, 9000); + ChordNote note6(4, 7200, 7200); + ChordNote note7(1, 7400, 7400); + ChordNote note8(2, 8000, 8000); + ChordNote note9(3, 8600, 8600); + ChordNote note10(4, 9000, 9000); + + note1.change(1); + + const int FRAMERATE = 200; + int renderStart = FRAMERATE * NB_SQUARES; + note1.setRenderStart(renderStart); + note2.setRenderStart(renderStart); + note3.setRenderStart(renderStart); + note4.setRenderStart(renderStart); + note5.setRenderStart(renderStart); + note6.setRenderStart(renderStart); + note7.setRenderStart(renderStart); + note8.setRenderStart(renderStart); + note9.setRenderStart(renderStart); + note10.setRenderStart(renderStart); + + string displayArray[NB_SQUARES + 1][5]; + for (int i = 0; i < NB_SQUARES + 1; i++) + { + for (int j = 0; j < 5; j++) + { + displayArray[i][j] = " "; + } + } + + const int NB_NOTES = 5; + ChordNote song[NB_NOTES] = {note1, note2, note3, note4, note5}; + + //string com = "COM7"; + //arduino = new SerialPort(com.c_str(), BAUD); + + // if(!arduino->isConnected()){ + // cerr << "Impossible de se connecter au port "<< string(com.c_str()) <<". Fermeture du programme!" <(currentTime - startTime).count()); + + if(totalDiff > 10000)//End of song + { + isNotDone = false; + } + else + { + auto newCheckTime = chrono::steady_clock::now(); + double diffLastPrint = 0; + + diffLastPrint = double(std::chrono::duration_cast (newCheckTime - lastPrintTime).count()); + + double diffSinceBeginning = double(std::chrono::duration_cast (newCheckTime - startTime).count()); + + //TO ADD : CHECK NOTES INPUT + // Envoie message Arduino + // j_msg_send["led"] = led_state; + // if(!SendToSerial(arduino, j_msg_send)){ + // cerr << "Erreur lors de l'envoie du message. " << endl; + // } + // // Reception message Arduino + // j_msg_rcv.clear(); // effacer le message precedent + // if(!RcvFromSerial(arduino, raw_msg)){ + // cerr << "Erreur lors de la reception du message. " << endl; + // } + + // // Impression du message de l'Arduino si valide + // if(raw_msg.size()>0){ + // //cout << "raw_msg: " << raw_msg << endl; // debug + // // Transfert du message en json + // j_msg_rcv = json::parse(raw_msg); + // cout << "Message de l'Arduino: " << j_msg_rcv << endl; + // } + // if(j_msg_rcv==json::value_t::null) + // { + // cout << "DATA_NULL\n"; + // } + // else + // { + // //cout << "longueur " << j_msg_rcv.size() <<"\n"; + // //cout << "7 " << j_msg_rcv[7] <<"\n"; + // Fret1 = j_msg_rcv[0]; + // Fret2 = j_msg_rcv[1]; + // Fret3 = j_msg_rcv[2]; + // Fret4 = j_msg_rcv[3]; + // Fret5 = j_msg_rcv[4]; + // StrumUp = j_msg_rcv[5]; + // StrumDown = j_msg_rcv[6]; + // JoyDir = j_msg_rcv[7]; + + + // /*if(led_state == 10) //lorsque la dixieme led est allumee + // { + // start = std::chrono::steady_clock::now(); // debute le chrono + // } + + // if(Fret1 != 0) //verifie la valeur de fret1 + // { + // now = std::chrono::steady_clock::now(); + + // double elapsed_time_ms = double(std::chrono::duration_cast (now - start).count()); + // std::cout << "Temps ecouleyy : " << elapsed_time_ms/1e3 << " secondes" << std::endl; + // }*/ + // if(JoyDir == 4) + // { + // led_state+=1; + // } + + // if(JoyDir == 3) + // { + // led_state-=1; + // } + + // if(JoyDir == 2) + // { + // led_state=0; + // } + + // if(JoyDir == 1) + // { + // led_state=10; + // } + + // if (led_state > 10) + // { + // led_state = 0; + // } + + // if (led_state < 0) + // { + // led_state = 10; + // } + // } + + //Gestion affichage + if(diffLastPrint >= FRAMERATE) + { + system("cls"); + lastPrintTime = newCheckTime; + if (nextNoteIndex > 0) + { + int previousNoteRenderStart = song[nextNoteIndex-1].getRenderStart(); + int previousNoteLength = song[nextNoteIndex-1].getEnd() - song[nextNoteIndex-1].getStart(); + if ((diffSinceBeginning - previousNoteRenderStart) < previousNoteLength) + { + bool* notes = song[nextNoteIndex - 1].getNotes(); + for (int j = 0; j < 5; j++) + { + if (notes[j]) + { + displayArray[0][j] = "|"; + } + } + } + } + + if (abs(song[nextNoteIndex].getRenderStart() - diffSinceBeginning) < 25) + { + bool* notes = song[nextNoteIndex].getNotes(); + for (int j = 0; j < 5; j++) + { + if (notes[j]) + { + displayArray[0][j] = "X"; + } + } + nextNoteIndex++; + } + + //printing + for (int i = 0; i < NB_SQUARES + 1; i++) + { + for (int j = 0; j < 5; j++) + { + if (i == NB_SQUARES - 1) + { + cout << "|_" << displayArray[i][j] << "_"; + } + else + { + cout << "| " << displayArray[i][j] << " "; + } + } + cout << "|" << endl; + } + + + //Reordering + int reorderingIndex = NB_SQUARES; + while (reorderingIndex > 0) + { + string temp[5]; + for (int i = 0; i < 5; i++) + { + temp[i] = displayArray[reorderingIndex - 1][i]; + } + for (int i = 0; i < 5; i++) + { + displayArray[reorderingIndex ][i] = temp[i]; + } + reorderingIndex--; + } + displayArray[0][0] = " "; + displayArray[0][1] = " "; + displayArray[0][2] = " "; + displayArray[0][3] = " "; + displayArray[0][4] = " "; + + cout << endl; + cout << "Timestamp " << diffSinceBeginning << " ms" << endl; + } + } + } + + + return 0; +} + +// /*---------------------------Definition de fonctions ------------------------*/ +// bool SendToSerial(SerialPort *arduino, json j_msg){ +// // Return 0 if error +// string msg = j_msg.dump(); +// bool ret = arduino->writeSerialPort(msg.c_str(), msg.length()); +// return ret; +// } + + +// bool RcvFromSerial(SerialPort *arduino, string &msg){ +// // Return 0 if error +// // Message output in msg +// string str_buffer; +// char char_buffer[MSG_MAX_SIZE]; +// int buffer_size; + +// msg.clear(); // clear string +// // Read serialport until '\n' character (Blocking) + +// // Version fonctionnel dans VScode, mais non fonctionnel avec Visual Studio +// /* +// while(msg.back()!='\n'){ +// if(msg.size()>MSG_MAX_SIZE){ +// return false; +// } + +// buffer_size = arduino->readSerialPort(char_buffer, MSG_MAX_SIZE); +// str_buffer.assign(char_buffer, buffer_size); +// msg.append(str_buffer); +// } +// */ + +// // Version fonctionnelle dans VScode et Visual Studio +// buffer_size = arduino->readSerialPort(char_buffer, MSG_MAX_SIZE); +// str_buffer.assign(char_buffer, buffer_size); +// msg.append(str_buffer); + +// //msg.pop_back(); //remove '/n' from string + +// return true; +// } \ No newline at end of file diff --git a/song.cpp b/song.cpp index 0f34782..24d0b67 100644 --- a/song.cpp +++ b/song.cpp @@ -49,6 +49,6 @@ std::string Song::getAudioFile() { return audioFile; } -std::vector Song::getChords() { +std::vector Song::getChords() { return chords; } diff --git a/song.h b/song.h index e4b2389..3a33d84 100644 --- a/song.h +++ b/song.h @@ -1,7 +1,7 @@ #ifndef __SONG_H__ #define __SONG_H__ -#include "chord.h" +#include "chordNote.h" #include // Contains a song for a guitar hero clone @@ -11,20 +11,20 @@ class Song { std::string artist; int duration; // in ms std::string audioFile; // path to audio file - std::vector chords; + std::vector chords; public: Song(std::string chartFile); ~Song(); void consolidate(); // merges chords with the same start/end times // into a single chord - Chord operator[](int index); + ChordNote operator[](int index); int size(); std::string getTitle(); std::string getArtist(); int getDuration(); std::string getAudioFile(); - std::vector getChords(); + std::vector getChords(); }; #include "song.cpp" -- cgit v1.2.3 From 141fd9b9b5b02257521e41e71562bed6da2523dc Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 21 Mar 2023 00:37:04 -0400 Subject: Purification par le feu --- chordNote.h | 4 ---- song.cpp | 54 ------------------------------------------------------ song.h | 32 -------------------------------- 3 files changed, 90 deletions(-) delete mode 100644 song.cpp delete mode 100644 song.h (limited to 'song.cpp') diff --git a/chordNote.h b/chordNote.h index 33a7010..c6b833a 100644 --- a/chordNote.h +++ b/chordNote.h @@ -1,8 +1,6 @@ #ifndef __CHORDNOTE_H__ #define __CHORDNOTE_H__ -#include - // Chords are used to represent a set of notes that are played together. // For this guitar hero implementation, a single note is technically a chord. // This analogy is used to make sure that simultaneous notes are always grouped @@ -30,13 +28,11 @@ class ChordNote { ChordNote(int btn, int startTime, int endTime); ~ChordNote(); void change(int button); // change note in existing chord - void setEnd(int endTime); // set the end time of the chord void setRenderStart(int renderTime); // sets when to start rendering bool* getNotes(); // get the notes in the chord int getStart(); // get the start time of the chord int getEnd(); // get the end time of the chord int getRenderStart(); // get the render time of the chord - std::regex getRegex(); // regex for this chord // compares the player's input to // the expected chord }; diff --git a/song.cpp b/song.cpp deleted file mode 100644 index 24d0b67..0000000 --- a/song.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "song.h" - -Song::Song(std::string chartFile) { - // TODO: import and parse chartFile -} - -Song::~Song() {}; - -void Song::consolidate() { - int totalSize = chords.size(); - // Check each chord against every other chord - for (int i=0; i Song::getChords() { - return chords; -} diff --git a/song.h b/song.h deleted file mode 100644 index c8f08a1..0000000 --- a/song.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __SONG_H__ -#define __SONG_H__ - -#include "chordNote.h" -#include - -// Contains a song for a guitar hero clone -class Song { - private: - std::string title; - std::string artist; - int duration; // in ms - std::string audioFile; // path to audio file - std::vector chords; - public: - Song(std::string chartFile); - ~Song(); - void consolidate(); // merges chords with the same start/end times - // into a single chord - ChordNote operator[](int index); - int size(); - - std::string getTitle(); - std::string getArtist(); - int getDuration(); - std::string getAudioFile(); - std::vector getChords(); -}; - -//#include "song.cpp" -#endif // __SONG_H__ - -- cgit v1.2.3 From 1acc49b21d850e035a2517930e6738b873953047 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 21 Mar 2023 02:32:05 -0400 Subject: Manual merge of chartFile branch --- chordNote.cpp | 106 +- chordNote.h | 55 +- common.cpp | 13 + common.h | 13 + main.cpp | 19 + song.cpp | 325 + song.h | 59 + songs/Maynard-Ferguson-Birdland/notes.chart | 5493 ++++++++ .../notes.chart | 5010 +++++++ .../Maynard-Ferguson-Theme-From-Shaft/notes.chart | 6123 +++++++++ songs/Owane-Rock-Is-Too-Heavy/notes.chart | 13401 +++++++++++++++++++ songs/Stevie-Wonder-Contusion/notes.chart | 2914 ++++ .../notes.chart | 5141 +++++++ timestamp.cpp | 21 + timestamp.h | 21 + 15 files changed, 38662 insertions(+), 52 deletions(-) create mode 100644 common.cpp create mode 100644 common.h create mode 100644 song.cpp create mode 100644 song.h create mode 100644 songs/Maynard-Ferguson-Birdland/notes.chart create mode 100644 songs/Maynard-Ferguson-Country-Road-(James-Taylor-Cover)/notes.chart create mode 100644 songs/Maynard-Ferguson-Theme-From-Shaft/notes.chart create mode 100644 songs/Owane-Rock-Is-Too-Heavy/notes.chart create mode 100644 songs/Stevie-Wonder-Contusion/notes.chart create mode 100644 songs/Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)/notes.chart create mode 100644 timestamp.cpp create mode 100644 timestamp.h (limited to 'song.cpp') diff --git a/chordNote.cpp b/chordNote.cpp index e912a97..8f0f6ab 100644 --- a/chordNote.cpp +++ b/chordNote.cpp @@ -1,52 +1,98 @@ #include "chordNote.h" -ChordNote::ChordNote(int btn, int startTime, int endTime) { - start = startTime; - end = endTime; - for (int i=0; i<5; i++) { - notes[i] = false; - } - notes[btn] = true; -}; - -ChordNote::~ChordNote() {}; +// Constructors, Destructors & Operators {{{ -void ChordNote::toggle(int button) { - notes[button] = !notes[button]; +// All notes are known +ChordNote::ChordNote(bool notes[5], int start, int end): + start(start), end(end){ + for(int i=0; i<5; i++) this->notes[i] = notes[i]; }; -void ChordNote::setEnd(int endTime) { - end = endTime; +// Used when chords are created from chartfiles +ChordNote::ChordNote(int note, int start, int end): + start(start), end(end){ + for(int i=0; i<5; i++) (notes[i] = (i==note)); }; -void ChordNote::setRenderStart(int renderTime) { - renderStart = start - renderTime; +// Copy constructor +ChordNote::ChordNote(const ChordNote& chord): + start(chord.start), end(chord.end){ + for(int i=0; i<5; i++) notes[i] = chord.notes[i]; }; -bool* ChordNote::getNotes() { +// Destructor +ChordNote::~ChordNote() {}; + +// Assignment operator +ChordNote& ChordNote::operator=(const ChordNote& other) { + std::copy(other.notes, other.notes + 5, notes); + const_cast(start) = other.start; + const_cast(end) = other.end; + return *this; +} + +// }}} + +// Getters {{{ + +bool* ChordNote::getNotes(){ return notes; }; -int ChordNote::getStart() { +int ChordNote::getStart(){ return start; -}; +} -int ChordNote::getEnd() { +int ChordNote::getEnd(){ return end; -}; +} + int ChordNote::getRenderStart() { return renderStart; }; -std::regex ChordNote::getRegex() { - // empty string - std::string regex = ""; - // true becomes "t" and false becomes "f" - // this is used to create a string of 5 characters - // which can be used as a regex +// }}} + +// Setters {{{ + +void ChordNote::setRenderStart(int renderTime) { + renderStart = start - renderTime; +} + +// }}} + +// Modifiers {{{ + +// Toggle a note on/off +bool ChordNote::toggle(int note){ + notes[note] = !notes[note]; + return notes[note]; +} + +// Merge two chords together +void ChordNote::merge(ChordNote chord){ for (int i=0; i<5; i++) { - regex += notes[i] ? "t" : "f"; + this->notes[i] = this->notes[i] || chord.has(i); } - return std::regex(regex); -}; +} + +// }}} + +// Misc {{{ + +// Check if a note is on (used in merge) +bool ChordNote::has(int note){ + return notes[note]; +} + +// Print Info about the chord (used for debugging) +void ChordNote::print(){ + std::cout << "ChordNote: "; + for(int i=0; i<5; i++) std::cout << (notes[i])? "T" : "F"; + std::cout << "Start: " << start << " End: " << end << std::endl; +} + +// }}} + +// vim: syntax=cpp.doxygen diff --git a/chordNote.h b/chordNote.h index 315bf24..bdf8564 100644 --- a/chordNote.h +++ b/chordNote.h @@ -1,41 +1,52 @@ -#ifndef __CHORDNOTE_H__ -#define __CHORDNOTE_H__ +#ifndef CHORDNOTE_H +#define CHORDNOTE_H // Chords are used to represent a set of notes that are played together. // For this guitar hero implementation, a single note is technically a chord. // This analogy is used to make sure that simultaneous notes are always grouped // under a single chord since they have information in common (start/end time). +// Fret Definitions {{{ #define FRET1 0 // green #define FRET2 1 // red #define FRET3 2 // yellow #define FRET4 3 // blue #define FRET5 4 // orange - +// }}} class ChordNote { private: - bool notes[5]; // which buttons are pressed - int start; // when to play in ms (relative to song start) - int end; // when to stop playing in ms (relative to song start) - int renderStart; // when to render (no need to define on construction) - public: + const int start; // Time in Nanoseconds + const int end; // 0 if not set + bool notes[5]; // Which notes are in the chord + int renderStart; // Time in Nanoseconds // Chords are initialized with a single button. // Other notes are added as notes with the same "start" are encountered // in .chart files. - // End time is initialized to 0 but can be changed if the .chart indicates - // that the chord is held for longer than the default 1/16th note. - ChordNote(int btn, int startTime, int endTime); - ~ChordNote(); - void toggle(int button); // change note in existing chord - void setRenderStart(int renderTime); // sets when to start rendering - bool* getNotes(); // get the notes in the chord - int getStart(); // get the start time of the chord - int getEnd(); // get the end time of the chord - int getRenderStart(); // get the render time of the chord - // compares the player's input to - // the expected chord + // End time is initialized to 0 but can be changed if the .chart file + // indicates otherwise. + public: + // Constructors, Destructors & Operators: + ChordNote(bool noteStates[5], int start, int end=0); // All known notes + ChordNote(int note, int start, int end=0); // For chartiles + ChordNote(const ChordNote& chord); // Copy constructor + ChordNote& operator=(const ChordNote& other); // Assignment operator + ~ChordNote(); // Destructor + // Getters: + bool* getNotes(); // All notes in the chord + int getStart(); // Start time of the chord + int getEnd(); // End time of the chord + int getRenderStart(); // Start time for rendering + // Setters: + void setRenterStart(int renderTime); // When it needs to start rendering + // Modifiers: + bool toggle(int note); // Add/remove a note in a chord + void merge(ChordNote chord); // Merge two chords (OR on every note) + // Misc: + bool has(int note); // check if a note is in the chord + void print(); // For debugging }; -//#include "chordNote.cpp" -#endif // __CHORDNOTE_H__ +#include "chordNote.cpp" +#endif // CHORDNOTE_H +// vim: syntax=cpp.doxygen diff --git a/common.cpp b/common.cpp new file mode 100644 index 0000000..5838766 --- /dev/null +++ b/common.cpp @@ -0,0 +1,13 @@ +#include "common.h" + +// Timing calculations {{{ + +// NanoSeconds per Tick +int nspt(const int nbpm, const int resolution){ + // nbpm: 133000 = 133bpm + // resolution: Tick per beat + return 60000000000 / (nbpm * resolution); +} + +// }}} +// vim: syntax=cpp.doxygen diff --git a/common.h b/common.h new file mode 100644 index 0000000..991303f --- /dev/null +++ b/common.h @@ -0,0 +1,13 @@ +#ifndef COMMON_H +#define COMMON_H + +// Timing calculations {{{ + +// NanoSecond per tick +int nspt(const int nbpm, const int resolution); + +// }}} + +#include "common.cpp" +#endif // COMMON_H +// vim: syntax=cpp.doxygen diff --git a/main.cpp b/main.cpp index 9c8c1b7..e71e464 100644 --- a/main.cpp +++ b/main.cpp @@ -57,6 +57,25 @@ bool isThreadOver = false; int main() { + + vector repertoire; //Liste des chansons disponibles: + vector songFolders; //Liste des dossiers chansons disponibles: + songFolders.push_back("/Maynard-Ferguson-Birdland/"); + songFolders.push_back("/Maynard-Ferguson-Country-Road-(James-Taylor-Cover)/"); + songFolders.push_back("/Maynard-Ferguson-Theme-From-Shaft/"); + songFolders.push_back("/Owane-Rock-Is-Too-Heavy/"); + songFolders.push_back("/Stevie-Wonder-Contusion/"); + songFolders.push_back("/Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)/"+chartFile); + + string songRoot = "./songs"; + string chartFile = "notes.chart"; + for (int i = 0; i < songFolders.size(); i++) + { + repertoire.push_back(Song(songRoot + songFolders[i] + chartFile)); + } + + + string displayString; // Initialisation du port de communication diff --git a/song.cpp b/song.cpp new file mode 100644 index 0000000..cdffddc --- /dev/null +++ b/song.cpp @@ -0,0 +1,325 @@ +#include +#include +#include +#include +#include + +#include "song.h" +#include "timestamp.h" +#include "common.h" + +Song::Song(std::string chartFile): chartFile(chartFile){ + parseInfo(); + parseSync(); + /* for(int i = 0; i < 4; i++){ */ + /* // Mark the difficulty as available if it has chords */ + /* difficulty[i] = parseChords(i); */ + /* } */ +} + +void Song::print(){ + std::cout << "Title: " << title << "\n" + << "Artist: " << artist << "\n" + << "Album: " << album << "\n" + << "Year: " << year << "\n" + << "Charter: " << album << "\n" + << "Resolution: " << resolution << "\n"; +} + +Song::~Song(){ +} + +void Song::parseInfo(){ + // String based information + std::string search[5]= { + "Name", "Artist", "Album", + "Year", "Charter" + }; + std::string *values[5] = { + &title, &artist, &album, + &year, &charter}; + std::string boilerplate[5] = { + "Untitled", "Unknown artist", "Unknown album", + "Unknown year", "Unknown charter" + }; + bool insideSong = false; // true while inside the "Song" info delimiter + // open the chart file + std::ifstream file(chartFile); + if (!file.is_open()) { + std::cerr << "There was a problem opening the file"; + return; + } + std::string line; + while (getline(file,line)){ + insideSong = line.find("[Song]"); + if (insideSong) // We can start searching for info fields once inside + while (getline(file,line)){ + // For every pattern check if this line contains it + for (int i=0; i<5; i++){ + if (line.find(search[i]) != std::string::npos){ + // If it does, find the pattern contained inside two quotes + std::size_t start = line.find("\""); + std::size_t end = line.find("\"", start+1); + // Match the pattern to the value + *values[i] = line.substr(start+1, end-start-1); + break; + } + } + // Resolution is not inside quotes and must be assigned to an int + if (line.find("Resolution") != std::string::npos) { + resolution = std::stoi( line.substr(line.find_last_of(' ')) ); + } + // Year value often has a comma inside. Let's fix that: + if (year.size() > 4 ) + year = year.substr(year.find(' ')+1); + if (line.find("[SyncTrack]") != std::string::npos) break; + } + } + file.close(); +}; + +void Song::parseSync(){ + // We want to prevent offsets in timings. + // Timeline will store timings in nanoseconds and the different chords + // will round down to the lower millisecond. + long int currentTime = 0; // ns + // Open the chart file + std::ifstream file(chartFile); + if (!file.is_open()) { + std::cerr << "There was a problem opening the file"; + return; + } + int lineNb = 0; + std::string line; + while (getline(file,line)){ + lineNb++; + // We are only interested in the SyncTrack + if (line.find("[SyncTrack]") != std::string::npos) + while (getline(file,line)) { + lineNb++; + std::regex pattern("([0-9]+) = B ([0-9]+)"); + std::smatch match; + if (std::regex_search(line, match, pattern)){ + // We found a match, let's parse the integers + int tick = std::stoi(match[1]); + int nbpm = std::stoi(match[2]); + if (tick == 0){ + // First timestamp, we need to add a default one + timestamps.push_back(Timestamp(0, tick, nbpm)); + } else { + // We can calculate the time passed since the last timestamp + // and add it to the current time and create a new timestamp + int tickDiff = tick - timestamps.back().getTick(); + long int timeDiff = nspt(nbpm, resolution) * tickDiff; + currentTime += timeDiff; + #ifdef DEBUG + if (currentTime < 0) { + std::cerr << "---------------------\n" + << "NEGATIVE TIMESTAMP:\n" + << "Last Timestamp:" + << " tick=" << timestamps.back().getTick() + << " bpm=" << timestamps.back().getBPM() + << " time=" << timestamps.back().getTime() << "ns\n" + << "Current Timestamp:" + << " tick=" << tick + << " bpm=" << nbpm + << " time=" << currentTime << "ns\n" + << "Other:" + << " tickDiff=" << tickDiff << std::endl; + } + #endif // DEBUG + timestamps.push_back(Timestamp(currentTime, tick, nbpm)); + #ifdef DEBUG + std::cout << "BPM: " << timestamps.back().getNbpm() << " " + << "Tick: " << timestamps.back().getTick() << " " + << "Line: " << lineNb << " " + << "TickDiff: " << tickDiff << " " + << "TimeDiff: " << timeDiff << "ns " + << "Current time: " << currentTime << std::endl; + #endif // DEBUG + } + } + if (line.find("[Events]") != std::string::npos) break; + } + } + file.close(); +}; + +void Song::printTimestamps(){ + for (int i=0; i *chordDifficulties[4]={&easy,&medium,&hard,&expert}; + // List of patterns to stringPattern + const std::string patterns[4] = { + "EasySingle", "MediumSingle", "HardSingle", "ExpertSingle" + }; + // We set the stringPattern to match depending on the difficulty + /* std::string stringPattern = patterns[difficulty]; */ + std::string stringPattern = "ExpertSingle"; + // We set a chord vector to store point to the correct difficulty vector + /* std::vector*chords=(std::vector*)chordDifficulties[difficulty]; */ + std::vector*chords = &expert; + // We open the chart file + std::ifstream file(chartFile); + if (!file.is_open()) { + std::cerr << "There was a problem opening the file"; + return false; + } + std::string line; + while (getline(file,line)){ + // We want to find the correct difficulty + if (line.find(stringPattern) != std::string::npos){ + // We found the correct difficulty, let's parse the chords + while (getline(file,line)){ + // Notes in chords have this format: ` tick = N fret duration` + // We want to match the tick, fret and duration using regex + std::regex pattern("([0-9]+) = N ([0-4]+) ([0-9]+)"); + std::smatch match; + if (std::regex_search(line, match, pattern)){ + // We found a match, let's parse the integers + int tick = std::stoi(match[1]); + int fret = std::stoi(match[2]); + int duration= std::stoi(match[3]); + // We need to find the timestamp with the closest tick that's smaller + int timestampIndex = 0; + for (int i=0; ipush_back(ChordNote(fret, chordTime, chordEnd)); + } + else if (line.find("[") != std::string::npos) return true; + } + } + } + return false; +}; + + +void Song::consolidateChords(int difficulty){ + // TODO: make this fuction use the difficulty parameter + std::vector*chords = &expert; + // Number of chords in the vector + int chordSize = chords->size(); + // Go through all the chords + for (int i=0; iat(i); + // Check if any other chord past the current one + // has the same start and end time + for (int j=i+1; jat(j); + if (currentChord.getStart() == nextChord.getStart() && + currentChord.getEnd() == nextChord.getEnd()){ + // If so: + // - add the fret to the current chord + // - remove the next one + // - decrement the chordSize + // - decrement the j counter + #ifdef DEBUG + std::cout << "----------------------------\n" + << "Chords merged: "; + currentChord.print(); + std::cout << " + "; + nextChord.print(); + std::cout << " ="; + #endif // DEBUG + currentChord.merge(nextChord); + #ifdef DEBUG + currentChord.print(); + #endif + chords->erase(chords->begin()+j); + chordSize--; + j--; + } + } + // Shrink the vector to the new size + chords->shrink_to_fit(); + } +} + +void Song::printChords(int difficulty){ + for (int i=0; i +#include + +#include "chordNote.h" +#include "timestamp.h" + +#define DIFFICULTY_EASY 0 +#define DIFFICULTY_MEDIUM 1 +#define DIFFICULTY_HARD 2 +#define DIFFICULTY_EXPERT 3 + +class Song{ + public: + Song(std::string chartFile); + ~Song(); + + void parseInfo(); // info from "Song" section + void parseSync(); // timestamps from "SyncTrack" section + bool parseChords(int difficulty); // chords from "Events" section + + void print(); + void printTimestamps(); + void printChords(int difficulty); + + void consolidateChords(int difficulty); // Merge chords with same start/end times + + std::string getChartFile(); + std::string getTitle(); + std::string getArtist(); + std::string getCharter(); + std::string getAlbum(); + std::string getYear(); + std::string getGenre(); + std::string getAudioFile(); + + private: + const std::string chartFile; + std::string title; + std::string artist; + std::string charter; + std::string album; + std::string year; + std::string genre; + std::string audioFile; + bool difficulty[4]; // Which difficulties are available + int resolution; + std::vector timestamps; + std::vector easy; + std::vector medium; + std::vector hard; + std::vector expert; +}; + +#include "song.cpp" +#endif // SONG_H +// vim: syntax=cpp.doxygen diff --git a/songs/Maynard-Ferguson-Birdland/notes.chart b/songs/Maynard-Ferguson-Birdland/notes.chart new file mode 100644 index 0000000..37f55c7 --- /dev/null +++ b/songs/Maynard-Ferguson-Birdland/notes.chart @@ -0,0 +1,5493 @@ +[Song] +{ + Name = "Birdland" + Artist = "Maynard Ferguson" + Charter = "GuitarZero132" + Album = "Carnival" + Year = ", 1978" + Offset = 0 + Resolution = 192 + Player2 = bass + Difficulty = 4 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "Jazz Fusion" + MediaType = "cd" + MusicStream = "song.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 166000 + 1056 = B 165000 + 1344 = B 175000 + 1536 = B 167000 + 2112 = B 166000 + 2304 = TS 5 + 2688 = B 172000 + 3264 = TS 4 + 3264 = B 165000 + 3456 = B 165000 + 4032 = B 172000 + 4608 = B 154000 + 4800 = B 175000 + 4992 = B 168000 + 5376 = B 186000 + 5568 = B 187000 + 6144 = B 167000 + 6336 = B 167000 + 6528 = B 159000 + 6720 = B 181000 + 6912 = B 159000 + 7104 = B 169000 + 7296 = B 165000 + 7488 = B 167000 + 7680 = B 167000 + 9408 = B 165000 + 9792 = B 169000 + 9984 = B 166000 + 10176 = B 166000 + 11136 = B 169000 + 11520 = B 169000 + 12096 = B 155000 + 12288 = B 166000 + 12384 = B 176000 + 12480 = B 170000 + 13248 = B 166000 + 13632 = B 158000 + 13824 = B 166000 + 14400 = B 168000 + 14976 = B 166000 + 15552 = B 166000 + 15936 = B 172000 + 16128 = B 165000 + 16512 = B 166000 + 17472 = B 171000 + 18048 = B 165000 + 18240 = B 165000 + 18432 = B 161000 + 18624 = B 166000 + 19776 = B 167000 + 20160 = B 167000 + 20928 = B 169000 + 21888 = B 174000 + 22080 = B 167000 + 23232 = B 165000 + 23616 = B 169000 + 24000 = B 167000 + 25536 = B 160000 + 26304 = B 167000 + 27072 = B 162000 + 27264 = B 169000 + 27648 = B 164000 + 28224 = B 170000 + 28608 = B 166000 + 31104 = B 174000 + 31488 = B 160000 + 31680 = B 173000 + 32064 = B 165000 + 32832 = B 167000 + 33600 = B 168000 + 34368 = B 168000 + 34752 = B 167000 + 35904 = B 169000 + 36480 = B 167000 + 37824 = B 160000 + 38016 = B 165000 + 38592 = B 161000 + 38784 = B 167000 + 39168 = B 168000 + 40512 = B 165000 + 40896 = B 168000 + 41664 = B 169000 + 42048 = B 164000 + 42240 = B 165000 + 42624 = B 166000 + 43200 = B 168000 + 43776 = B 166000 + 44160 = B 168000 + 44544 = B 166000 + 45120 = B 168000 + 45504 = B 166000 + 46848 = B 164000 + 47232 = B 168000 + 47808 = B 170000 + 48576 = B 166000 + 48960 = B 163000 + 49344 = B 161000 + 49536 = B 181000 + 49728 = B 168000 + 50016 = B 164000 + 50112 = B 160000 + 50496 = B 168000 + 50880 = B 166000 + 52224 = B 168000 + 52800 = B 168000 + 53376 = B 165000 + 54336 = B 166000 + 54720 = B 168000 + 55488 = B 167000 + 56064 = B 167000 + 56640 = B 164000 + 56832 = B 164000 + 57216 = B 165000 + 57600 = B 168000 + 58176 = B 169000 + 58560 = B 168000 + 58752 = B 167000 + 59520 = B 166000 + 59904 = B 168000 + 60672 = B 168000 + 60864 = B 167000 + 61824 = B 167000 + 62400 = B 168000 + 63360 = B 164000 + 63936 = B 169000 + 64704 = B 157000 + 64896 = B 169000 + 65472 = B 168000 + 66240 = B 166000 + 67584 = B 169000 + 67776 = B 167000 + 68352 = B 170000 + 68736 = B 166000 + 68928 = B 159000 + 69312 = B 155000 + 69504 = B 163000 + 69888 = B 177000 + 70464 = B 155000 + 70848 = B 165000 + 71424 = B 181000 + 71808 = B 163000 + 72384 = B 169000 + 72576 = B 161000 + 72864 = B 178000 + 73536 = B 157000 + 73920 = B 157000 + 74112 = B 158000 + 74304 = B 173000 + 74592 = B 179000 + 74688 = B 184000 + 74880 = B 179000 + 75072 = B 166000 + 75456 = B 162000 + 75648 = B 164000 + 76608 = B 171000 + 76992 = B 168000 + 77952 = B 164000 + 78912 = B 166000 + 79296 = B 168000 + 80064 = B 170000 + 80448 = B 166000 + 81600 = B 170000 + 81984 = B 165000 + 82944 = B 163000 + 83136 = B 169000 + 83712 = B 161000 + 83904 = B 163000 + 84288 = B 168000 + 84672 = B 158000 + 84864 = B 174000 + 85056 = B 164000 + 85440 = B 169000 + 85824 = B 166000 + 86208 = B 164000 + 86784 = B 168000 + 87552 = B 165000 + 87744 = B 170000 + 88128 = B 164000 + 88320 = B 168000 + 92352 = B 164000 + 92544 = B 169000 + 93024 = B 159000 + 93312 = B 180000 + 93792 = B 154000 + 94080 = B 167000 + 94560 = B 160000 + 94848 = B 166000 + 96096 = B 161000 + 96288 = B 166000 + 96768 = B 167000 + 97152 = B 169000 + 97536 = B 168000 + 98112 = B 159000 + 98304 = B 165000 + 98688 = B 164000 + 99648 = B 173000 + 100032 = B 168000 + 100800 = B 168000 + 103296 = B 168000 + 103488 = B 166000 + 103680 = B 168000 + 105216 = B 167000 + 106176 = B 165000 + 106944 = B 169000 + 107712 = B 167000 + 108096 = B 155000 + 108288 = B 168000 + 109248 = B 169000 + 110016 = B 166000 + 111360 = B 169000 + 111552 = B 166000 + 112704 = B 167000 + 113664 = B 167000 + 114816 = B 166000 + 116160 = B 168000 + 116928 = B 165000 + 117696 = B 172000 + 118272 = B 167000 + 118464 = B 165000 + 119232 = B 166000 + 120768 = B 163000 + 121728 = B 165000 + 122112 = B 163000 + 122688 = B 168000 + 125568 = B 170000 + 126912 = B 165000 + 127296 = B 163000 + 127680 = B 170000 + 128448 = B 157000 + 128640 = B 166000 + 129984 = B 170000 + 130368 = B 165000 + 130560 = B 166000 + 131520 = B 165000 + 132864 = B 167000 + 133056 = B 168000 + 133632 = B 166000 + 134592 = B 168000 + 135936 = B 171000 + 136512 = B 166000 + 136896 = B 165000 + 138048 = B 167000 + 140352 = B 165000 + 140544 = B 168000 + 140928 = B 166000 + 141120 = B 166000 + 142080 = B 173000 + 142272 = B 168000 + 142848 = B 157000 + 143040 = B 166000 + 144768 = B 171000 + 145344 = B 167000 + 146112 = B 166000 + 146880 = B 167000 + 147264 = B 168000 + 147840 = B 169000 + 148224 = B 165000 + 148608 = B 167000 + 149184 = B 166000 + 150336 = B 167000 + 150720 = B 169000 + 151872 = B 166000 + 152256 = B 166000 + 153216 = B 169000 + 153600 = B 166000 + 153984 = B 169000 + 154752 = B 166000 + 155712 = B 166000 + 156672 = B 168000 + 157056 = B 170000 + 157440 = B 167000 + 158016 = B 166000 + 158976 = B 164000 + 159360 = B 169000 + 160512 = B 156000 + 160704 = B 167000 + 161472 = B 163000 + 161664 = B 166000 + 162624 = B 175000 + 162816 = B 172000 + 163200 = B 166000 + 163776 = B 167000 + 164736 = B 166000 + 165120 = B 166000 + 165504 = B 167000 + 167616 = B 160000 + 168000 = B 171000 + 168192 = B 168000 + 168576 = B 163000 + 168768 = B 176000 + 168960 = B 165000 + 170304 = B 177000 + 170592 = B 167000 + 172224 = B 163000 + 172608 = B 172000 + 172800 = B 162000 + 173184 = B 171000 + 173376 = B 172000 + 173568 = B 166000 + 173760 = B 168000 + 175296 = B 165000 +} +[Events] +{ + 1536 = E "section Intro" + 7104 = E "section Low Riff" + 13248 = E "section Trombone Enters" + 19392 = E "section Saxophone Enters" + 25536 = E "section Loud Part 1" + 31680 = E "section Riff 1" + 37824 = E "section Verse 1" + 43968 = E "section Piano Interlude" + 50112 = E "section Chorus 1a" + 56256 = E "section Chorus 1b" + 63168 = E "section Bridge 1" + 69312 = E "section Horn Break" + 75456 = E "section Funky Riff" + 81600 = E "section Saxophone Solo A" + 87744 = E "section Saxophone Solo B" + 93888 = E "section Solo Bridge" + 100032 = E "section Guitar Solo A" + 106176 = E "section Guitar Solo B" + 111552 = E "section Guitar Solo C" + 118464 = E "section Bridge 2a" + 124608 = E "section Bridge 2b" + 130752 = E "section Riff 2" + 136896 = E "section Chorus 2a" + 143040 = E "section Chorus 2b" + 149184 = E "section Trumpet Solo A" + 155328 = E "section Trumpet Solo B" + 161472 = E "section Trumpet Solo C" + 167616 = E "section Trumpet Solo D" +} +[ExpertSingle] +{ + 1536 = N 1 336 + 1536 = N 6 0 + 1920 = N 2 240 + 1920 = N 6 0 + 2208 = N 3 0 + 2208 = N 6 0 + 2256 = N 4 816 + 2256 = N 6 0 + 3264 = N 0 240 + 3264 = N 6 0 + 3552 = N 2 240 + 3552 = N 6 0 + 3840 = N 2 0 + 3840 = N 6 0 + 3888 = N 3 720 + 3888 = N 6 0 + 4800 = N 2 240 + 4800 = N 6 0 + 5088 = N 2 240 + 5088 = N 6 0 + 5376 = N 2 1584 + 5376 = N 6 0 + 7008 = N 7 432 + 7488 = N 0 240 + 7776 = N 2 720 + 8544 = N 7 432 + 9024 = N 0 144 + 9216 = N 2 0 + 9312 = N 4 720 + 10080 = N 7 432 + 10080 = S 2 1152 + 10560 = N 0 240 + 10848 = N 2 720 + 11616 = N 7 432 + 12096 = N 0 144 + 12288 = N 2 0 + 12384 = N 4 720 + 13152 = N 3 144 + 13152 = N 6 0 + 13344 = N 2 0 + 13344 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13536 = N 2 0 + 13536 = N 6 0 + 13632 = N 1 144 + 13632 = N 6 0 + 13824 = N 0 0 + 13824 = N 6 0 + 13920 = N 1 240 + 13920 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 14400 = N 1 0 + 14400 = N 6 0 + 14592 = N 2 0 + 14592 = N 6 0 + 14688 = N 3 240 + 14688 = N 6 0 + 14976 = N 2 0 + 14976 = N 6 0 + 15168 = N 1 0 + 15168 = N 6 0 + 15360 = N 0 0 + 15360 = N 6 0 + 15456 = N 7 0 + 15648 = N 1 528 + 15648 = N 6 0 + 16224 = N 3 144 + 16224 = N 6 0 + 16416 = N 2 0 + 16416 = N 6 0 + 16512 = N 3 0 + 16512 = N 6 0 + 16608 = N 2 0 + 16608 = N 6 0 + 16704 = N 1 144 + 16704 = N 6 0 + 16896 = N 0 0 + 16896 = N 6 0 + 16992 = N 1 240 + 16992 = N 6 0 + 17280 = N 0 0 + 17280 = N 6 0 + 17472 = N 1 0 + 17472 = N 6 0 + 17664 = N 2 0 + 17664 = N 6 0 + 17760 = N 3 240 + 17760 = N 6 0 + 18048 = N 2 0 + 18048 = N 6 0 + 18240 = N 1 0 + 18240 = N 6 0 + 18432 = N 0 0 + 18432 = N 6 0 + 18528 = N 7 0 + 18720 = N 1 240 + 18720 = N 6 0 + 19008 = N 1 0 + 19008 = N 6 0 + 19104 = N 2 0 + 19104 = N 6 0 + 19200 = N 3 0 + 19200 = N 6 0 + 19296 = N 4 144 + 19296 = N 6 0 + 19488 = N 3 0 + 19488 = N 6 0 + 19584 = N 4 0 + 19584 = N 6 0 + 19680 = N 3 0 + 19680 = N 6 0 + 19776 = N 2 144 + 19776 = N 6 0 + 19968 = N 1 0 + 19968 = N 6 0 + 20064 = N 2 240 + 20064 = N 6 0 + 20352 = N 1 0 + 20352 = N 6 0 + 20544 = N 2 0 + 20544 = N 6 0 + 20736 = N 3 0 + 20736 = N 6 0 + 20832 = N 4 240 + 20832 = N 6 0 + 21120 = N 3 0 + 21120 = N 6 0 + 21312 = N 2 0 + 21312 = N 6 0 + 21504 = N 0 0 + 21504 = N 6 0 + 21600 = N 1 0 + 21600 = N 6 0 + 21792 = N 1 240 + 21792 = N 6 0 + 22080 = N 1 0 + 22080 = N 6 0 + 22080 = S 2 3072 + 22176 = N 2 0 + 22176 = N 6 0 + 22272 = N 3 0 + 22272 = N 6 0 + 22368 = N 4 144 + 22368 = N 6 0 + 22560 = N 3 0 + 22560 = N 6 0 + 22656 = N 4 0 + 22656 = N 6 0 + 22752 = N 3 0 + 22752 = N 6 0 + 22848 = N 2 144 + 22848 = N 6 0 + 23040 = N 1 0 + 23040 = N 6 0 + 23136 = N 2 144 + 23136 = N 6 0 + 23328 = N 3 0 + 23328 = N 6 0 + 23376 = N 2 0 + 23376 = N 6 0 + 23424 = N 1 0 + 23424 = N 6 0 + 23616 = N 2 0 + 23616 = N 6 0 + 23808 = N 3 0 + 23808 = N 6 0 + 23904 = N 4 144 + 23904 = N 6 0 + 24096 = N 3 0 + 24096 = N 6 0 + 24144 = N 4 0 + 24144 = N 6 0 + 24192 = N 3 0 + 24192 = N 6 0 + 24384 = N 2 0 + 24384 = N 6 0 + 24576 = N 0 0 + 24576 = N 6 0 + 24672 = N 1 0 + 24672 = N 6 0 + 24864 = N 1 528 + 24864 = N 6 0 + 25440 = N 3 240 + 25440 = N 6 0 + 25728 = N 2 0 + 25728 = N 6 0 + 25824 = N 2 0 + 25824 = N 6 0 + 26208 = N 2 240 + 26208 = N 6 0 + 26496 = N 1 0 + 26496 = N 6 0 + 26592 = N 1 0 + 26592 = N 6 0 + 26976 = N 2 144 + 26976 = N 6 0 + 27168 = N 2 0 + 27168 = N 6 0 + 27264 = N 0 0 + 27264 = N 6 0 + 27360 = N 0 0 + 27360 = N 6 0 + 27744 = N 2 240 + 27744 = N 6 0 + 28032 = N 1 0 + 28032 = N 6 0 + 28128 = N 1 0 + 28128 = N 6 0 + 28512 = N 2 240 + 28512 = N 6 0 + 28800 = N 1 0 + 28800 = N 6 0 + 28896 = N 1 0 + 28896 = N 6 0 + 29280 = N 3 240 + 29280 = N 6 0 + 29568 = N 2 576 + 29568 = N 6 0 + 30240 = N 0 0 + 30240 = N 6 0 + 30336 = N 1 0 + 30336 = N 6 0 + 30432 = N 2 0 + 30432 = N 6 0 + 30528 = N 3 0 + 30528 = N 6 0 + 30576 = N 4 0 + 30576 = N 6 0 + 30720 = N 1 0 + 30720 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 30960 = N 3 0 + 30960 = N 6 0 + 31104 = N 2 384 + 31104 = N 6 0 + 31584 = N 1 1632 + 31584 = N 6 0 + 33696 = N 1 0 + 33696 = N 6 0 + 33792 = N 2 0 + 33792 = N 6 0 + 33888 = N 4 240 + 33888 = N 6 0 + 34176 = N 2 0 + 34176 = N 6 0 + 34368 = N 1 0 + 34368 = N 6 0 + 34656 = N 0 0 + 34656 = N 6 0 + 34944 = N 0 0 + 34944 = N 6 0 + 35232 = N 1 0 + 35232 = N 6 0 + 35328 = N 2 0 + 35328 = N 6 0 + 35424 = N 4 240 + 35424 = N 6 0 + 35712 = N 2 0 + 35712 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36192 = N 1 0 + 36192 = N 6 0 + 36480 = N 1 0 + 36480 = N 6 0 + 36672 = S 2 960 + 36768 = N 1 0 + 36768 = N 6 0 + 36864 = N 2 0 + 36864 = N 6 0 + 36960 = N 4 240 + 36960 = N 6 0 + 37248 = N 2 0 + 37248 = N 6 0 + 37440 = N 1 0 + 37440 = N 6 0 + 37824 = N 0 240 + 37824 = N 6 0 + 38112 = N 0 336 + 38112 = N 6 0 + 38496 = N 0 0 + 38496 = N 6 0 + 38544 = N 0 0 + 38544 = N 6 0 + 38592 = N 1 144 + 38592 = N 6 0 + 38784 = N 0 0 + 38784 = N 6 0 + 38880 = N 2 624 + 38880 = N 6 0 + 39552 = N 3 0 + 39552 = N 6 0 + 39600 = N 2 0 + 39600 = N 6 0 + 39648 = N 1 0 + 39648 = N 6 0 + 40896 = N 0 240 + 40896 = N 6 0 + 41184 = N 0 336 + 41184 = N 6 0 + 41568 = N 0 0 + 41568 = N 6 0 + 41664 = N 1 144 + 41664 = N 6 0 + 41856 = N 0 0 + 41856 = N 6 0 + 41952 = N 2 240 + 41952 = N 6 0 + 42240 = N 3 624 + 42240 = N 6 0 + 42912 = N 4 0 + 42912 = N 6 0 + 43008 = N 3 0 + 43008 = N 6 0 + 43056 = N 4 0 + 43056 = N 6 0 + 43104 = N 3 0 + 43104 = N 6 0 + 43152 = N 4 0 + 43152 = N 6 0 + 43200 = N 3 0 + 43200 = N 6 0 + 43248 = N 4 0 + 43248 = N 6 0 + 43296 = N 3 0 + 43296 = N 6 0 + 43344 = N 4 0 + 43344 = N 6 0 + 43392 = N 3 0 + 43392 = N 6 0 + 43440 = N 4 0 + 43440 = N 6 0 + 43488 = N 3 0 + 43488 = N 6 0 + 43536 = N 4 0 + 43536 = N 6 0 + 43584 = N 3 0 + 43584 = N 6 0 + 43632 = N 4 0 + 43632 = N 6 0 + 43680 = N 3 0 + 43680 = N 6 0 + 43728 = N 4 0 + 43728 = N 6 0 + 43776 = N 3 0 + 43776 = N 6 0 + 43872 = N 2 0 + 43872 = N 6 0 + 43968 = N 4 0 + 43968 = N 6 0 + 45456 = N 1 0 + 45504 = N 2 336 + 45888 = N 1 1344 + 45888 = N 5 0 + 48288 = N 3 144 + 48480 = N 0 0 + 49920 = S 2 1536 + 50016 = N 2 240 + 50016 = N 6 0 + 50304 = N 4 0 + 50304 = N 6 0 + 50496 = N 0 0 + 50496 = N 6 0 + 50784 = N 0 240 + 50784 = N 6 0 + 51072 = N 2 0 + 51072 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51552 = N 4 816 + 51552 = N 6 0 + 52416 = N 3 0 + 52416 = N 6 0 + 52512 = N 2 0 + 52512 = N 6 0 + 52704 = N 1 0 + 52704 = N 6 0 + 52896 = N 0 0 + 52896 = N 6 0 + 53088 = N 2 240 + 53088 = N 6 0 + 53376 = N 4 0 + 53376 = N 6 0 + 53568 = N 0 0 + 53568 = N 6 0 + 53856 = N 1 240 + 53856 = N 6 0 + 54144 = N 2 0 + 54144 = N 6 0 + 54336 = N 0 0 + 54336 = N 6 0 + 54624 = N 3 816 + 54624 = N 6 0 + 55488 = N 3 0 + 55488 = N 6 0 + 55584 = N 4 0 + 55584 = N 6 0 + 55776 = N 2 0 + 55776 = N 6 0 + 55968 = N 0 0 + 55968 = N 6 0 + 56160 = N 2 240 + 56160 = N 6 0 + 56448 = N 3 0 + 56448 = N 6 0 + 56640 = N 4 0 + 56640 = N 6 0 + 56928 = N 0 240 + 56928 = N 6 0 + 57216 = N 1 0 + 57216 = N 6 0 + 57408 = N 3 0 + 57408 = N 6 0 + 57696 = N 2 816 + 57696 = N 6 0 + 58560 = N 3 0 + 58560 = N 6 0 + 58656 = N 2 0 + 58656 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 59040 = N 0 0 + 59040 = N 6 0 + 59232 = N 2 240 + 59232 = N 6 0 + 59520 = N 3 0 + 59520 = N 6 0 + 59712 = N 4 0 + 59712 = N 6 0 + 60000 = N 0 240 + 60000 = N 6 0 + 60288 = N 1 0 + 60288 = N 6 0 + 60480 = N 3 0 + 60480 = N 6 0 + 60768 = N 2 816 + 60768 = N 6 0 + 61632 = N 3 0 + 61632 = N 6 0 + 61728 = N 2 0 + 61728 = N 6 0 + 61920 = N 1 0 + 61920 = N 6 0 + 62112 = N 0 0 + 62112 = N 6 0 + 62304 = N 0 816 + 62304 = N 6 0 + 63168 = N 0 144 + 63360 = N 1 0 + 63456 = N 2 0 + 63552 = N 3 0 + 63648 = N 4 1008 + 64704 = N 0 144 + 64704 = S 2 960 + 64896 = N 1 0 + 64992 = N 2 0 + 65088 = N 3 0 + 65376 = N 7 720 + 66144 = N 0 240 + 66432 = N 1 0 + 66528 = N 2 0 + 66624 = N 3 0 + 66720 = N 4 1008 + 67776 = N 0 144 + 67968 = N 1 0 + 68064 = N 2 0 + 68160 = N 3 0 + 68448 = N 7 864 + 74784 = N 1 0 + 74784 = S 2 1536 + 74880 = N 2 0 + 74976 = N 3 0 + 75072 = N 2 0 + 75168 = N 3 0 + 75264 = N 4 0 + 75360 = N 2 240 + 75648 = N 0 0 + 75744 = N 1 0 + 75840 = N 2 0 + 75936 = N 4 0 + 76128 = N 3 528 + 76704 = N 0 0 + 76800 = N 1 0 + 76896 = N 2 0 + 76992 = N 3 0 + 77088 = N 4 0 + 77184 = N 3 0 + 77280 = N 2 0 + 77376 = N 3 0 + 77472 = N 2 0 + 77664 = N 1 144 + 77856 = N 4 0 + 77952 = N 3 0 + 78048 = N 0 0 + 78144 = N 2 0 + 78240 = N 0 0 + 78336 = N 1 0 + 78432 = N 2 240 + 78720 = N 0 0 + 78816 = N 1 0 + 78912 = N 2 0 + 79008 = N 4 0 + 79200 = N 3 528 + 79776 = N 0 0 + 79872 = N 1 0 + 79968 = N 2 0 + 80064 = N 3 0 + 80160 = N 4 0 + 80256 = N 3 0 + 80352 = N 2 0 + 80448 = N 3 0 + 80544 = N 2 0 + 80736 = N 1 144 + 81120 = N 0 0 + 81120 = N 6 0 + 81120 = E solo + 81168 = N 1 0 + 81168 = N 6 0 + 81216 = N 0 0 + 81216 = N 6 0 + 81264 = N 1 0 + 81264 = N 6 0 + 81312 = N 2 0 + 81312 = N 6 0 + 81360 = N 3 0 + 81360 = N 6 0 + 81408 = N 0 0 + 81408 = N 6 0 + 81456 = N 1 0 + 81456 = N 6 0 + 81504 = N 2 0 + 81504 = N 6 0 + 81552 = N 3 0 + 81552 = N 6 0 + 81600 = N 4 240 + 81600 = N 6 0 + 81888 = N 1 0 + 81888 = N 6 0 + 81936 = N 2 0 + 81936 = N 6 0 + 81984 = N 3 288 + 81984 = N 6 0 + 82320 = N 0 0 + 82320 = N 6 0 + 82368 = N 1 0 + 82368 = N 6 0 + 82464 = N 2 144 + 82464 = N 6 0 + 82656 = N 0 0 + 82656 = N 6 0 + 82752 = N 1 336 + 82752 = N 6 0 + 83136 = N 2 0 + 83136 = N 6 0 + 83160 = N 3 0 + 83160 = N 6 0 + 83232 = N 2 0 + 83232 = N 6 0 + 83328 = N 1 144 + 83328 = N 6 0 + 83520 = N 1 0 + 83520 = N 6 0 + 83544 = N 2 0 + 83544 = N 6 0 + 83616 = N 1 0 + 83616 = N 6 0 + 83712 = N 0 144 + 83712 = N 6 0 + 83904 = N 4 0 + 83904 = N 6 0 + 83952 = N 3 0 + 83952 = N 6 0 + 84000 = N 2 0 + 84000 = N 6 0 + 84096 = N 3 0 + 84096 = N 6 0 + 84144 = N 2 0 + 84144 = N 6 0 + 84192 = N 1 0 + 84192 = N 6 0 + 84288 = N 2 0 + 84288 = N 6 0 + 84336 = N 1 0 + 84336 = N 6 0 + 84384 = N 0 0 + 84384 = N 6 0 + 84480 = N 4 0 + 84480 = N 6 0 + 84528 = N 3 0 + 84528 = N 6 0 + 84576 = N 2 0 + 84576 = N 6 0 + 84672 = N 3 0 + 84672 = N 6 0 + 84720 = N 2 0 + 84720 = N 6 0 + 84768 = N 1 0 + 84768 = N 6 0 + 84816 = N 4 0 + 84816 = N 6 0 + 84864 = N 3 0 + 84864 = N 6 0 + 84912 = N 2 0 + 84912 = N 6 0 + 84960 = N 1 0 + 84960 = N 6 0 + 85008 = N 0 0 + 85008 = N 6 0 + 85056 = N 1 0 + 85056 = N 6 0 + 85104 = N 3 0 + 85104 = N 6 0 + 85152 = N 2 0 + 85152 = N 6 0 + 85200 = N 1 0 + 85200 = N 6 0 + 85248 = N 0 0 + 85248 = N 6 0 + 85296 = N 1 0 + 85296 = N 6 0 + 85824 = N 0 0 + 85824 = N 6 0 + 85872 = N 2 0 + 85872 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 85968 = N 2 0 + 85968 = N 6 0 + 86016 = N 3 0 + 86016 = N 6 0 + 86064 = N 1 0 + 86064 = N 6 0 + 86112 = N 2 0 + 86112 = N 6 0 + 86160 = N 3 0 + 86160 = N 6 0 + 86208 = N 4 0 + 86208 = N 6 0 + 86256 = N 2 0 + 86256 = N 6 0 + 86304 = N 3 0 + 86304 = N 6 0 + 86352 = N 4 0 + 86352 = N 6 0 + 86400 = N 1 0 + 86400 = N 6 0 + 86448 = N 2 0 + 86448 = N 6 0 + 86496 = N 3 0 + 86496 = N 6 0 + 86544 = N 4 0 + 86544 = N 6 0 + 86592 = N 3 0 + 86592 = N 6 0 + 86640 = N 2 0 + 86640 = N 6 0 + 86688 = N 1 0 + 86688 = N 6 0 + 86736 = N 0 0 + 86736 = N 6 0 + 86784 = N 1 0 + 86784 = N 6 0 + 86832 = N 3 0 + 86832 = N 6 0 + 86880 = N 2 0 + 86880 = N 6 0 + 86928 = N 0 0 + 86928 = N 6 0 + 86976 = N 1 0 + 86976 = N 6 0 + 87024 = N 2 0 + 87024 = N 6 0 + 87072 = N 4 0 + 87072 = N 6 0 + 87120 = N 3 0 + 87120 = N 6 0 + 87168 = N 2 0 + 87168 = N 6 0 + 87216 = N 1 0 + 87216 = N 6 0 + 87264 = N 4 0 + 87264 = N 6 0 + 87312 = N 3 0 + 87312 = N 6 0 + 87360 = N 2 0 + 87360 = N 6 0 + 87408 = N 1 0 + 87408 = N 6 0 + 87456 = N 0 0 + 87456 = N 6 0 + 87744 = N 1 0 + 87744 = N 6 0 + 87744 = S 2 768 + 87792 = N 2 0 + 87792 = N 6 0 + 87840 = N 3 0 + 87840 = N 6 0 + 87904 = N 3 144 + 87904 = N 6 0 + 88080 = N 3 0 + 88080 = N 6 0 + 88128 = N 1 0 + 88128 = N 6 0 + 88200 = N 3 0 + 88200 = N 6 0 + 88296 = N 3 168 + 88296 = N 6 0 + 88512 = N 3 144 + 88512 = N 6 0 + 88704 = N 3 192 + 88704 = N 6 0 + 88944 = N 3 0 + 88944 = N 6 0 + 88992 = N 4 0 + 88992 = N 6 0 + 89040 = N 2 0 + 89040 = N 6 0 + 89088 = N 3 0 + 89088 = N 6 0 + 89136 = N 2 0 + 89136 = N 6 0 + 89184 = N 1 0 + 89184 = N 6 0 + 89232 = N 3 0 + 89232 = N 6 0 + 89280 = N 2 0 + 89280 = N 6 0 + 89328 = N 1 0 + 89328 = N 6 0 + 89376 = N 0 0 + 89376 = N 6 0 + 89424 = N 4 0 + 89424 = N 6 0 + 89472 = N 3 0 + 89472 = N 6 0 + 89520 = N 2 0 + 89520 = N 6 0 + 89568 = N 1 0 + 89568 = N 6 0 + 89616 = N 0 0 + 89616 = N 6 0 + 89664 = N 4 0 + 89664 = N 6 0 + 89712 = N 4 0 + 89712 = N 6 0 + 89760 = N 3 0 + 89760 = N 6 0 + 89808 = N 4 0 + 89808 = N 6 0 + 89856 = N 3 0 + 89856 = N 6 0 + 89904 = N 2 0 + 89904 = N 6 0 + 89952 = N 1 0 + 89952 = N 6 0 + 90000 = N 0 0 + 90000 = N 6 0 + 90048 = N 2 0 + 90048 = N 6 0 + 90096 = N 1 0 + 90096 = N 6 0 + 90144 = N 0 0 + 90144 = N 6 0 + 90192 = N 2 0 + 90192 = N 6 0 + 90240 = N 1 0 + 90240 = N 6 0 + 90816 = N 0 0 + 90816 = N 6 0 + 90864 = N 1 0 + 90864 = N 6 0 + 90912 = N 2 0 + 90912 = N 6 0 + 90960 = N 3 0 + 90960 = N 6 0 + 91008 = N 0 0 + 91008 = N 6 0 + 91200 = N 1 0 + 91200 = N 6 0 + 91248 = N 2 0 + 91248 = N 6 0 + 91296 = N 3 0 + 91296 = N 6 0 + 91344 = N 4 0 + 91344 = N 6 0 + 91392 = N 0 0 + 91392 = N 6 0 + 91440 = N 1 0 + 91440 = N 6 0 + 91488 = N 2 0 + 91488 = N 6 0 + 91536 = N 3 0 + 91536 = N 6 0 + 91584 = N 2 0 + 91584 = N 6 0 + 91776 = N 1 0 + 91776 = N 6 0 + 91808 = N 2 0 + 91808 = N 6 0 + 91840 = N 3 0 + 91840 = N 6 0 + 91872 = N 2 0 + 91872 = N 6 0 + 91904 = N 3 0 + 91904 = N 6 0 + 91936 = N 4 0 + 91936 = N 6 0 + 91968 = N 0 0 + 91968 = N 6 0 + 92064 = N 1 0 + 92064 = N 6 0 + 92112 = N 4 0 + 92112 = N 6 0 + 92160 = N 3 0 + 92160 = N 6 0 + 92208 = N 0 0 + 92208 = N 6 0 + 92256 = N 1 0 + 92256 = N 6 0 + 92304 = N 2 0 + 92304 = N 6 0 + 92352 = N 1 0 + 92352 = N 6 0 + 92400 = N 2 0 + 92400 = N 6 0 + 92448 = N 3 0 + 92448 = N 6 0 + 92496 = N 4 0 + 92496 = N 6 0 + 92544 = N 4 0 + 92544 = N 6 0 + 92640 = N 0 0 + 92640 = N 6 0 + 92688 = N 1 0 + 92688 = N 6 0 + 92736 = N 2 0 + 92736 = N 6 0 + 92784 = N 1 0 + 92784 = N 6 0 + 92832 = N 2 0 + 92832 = N 6 0 + 92880 = N 3 0 + 92880 = N 6 0 + 92928 = N 0 0 + 92928 = N 6 0 + 92992 = N 1 0 + 92992 = N 6 0 + 93056 = N 2 0 + 93056 = N 6 0 + 93120 = N 3 0 + 93120 = N 6 0 + 93216 = N 4 528 + 93216 = N 6 0 + 93792 = N 3 240 + 93792 = N 6 0 + 93792 = E soloend + 94080 = N 2 0 + 94080 = N 6 0 + 94176 = N 2 0 + 94176 = N 6 0 + 94560 = N 2 240 + 94560 = N 6 0 + 94848 = N 1 0 + 94848 = N 6 0 + 94944 = N 1 0 + 94944 = N 6 0 + 95328 = N 2 144 + 95328 = N 6 0 + 95520 = N 2 0 + 95520 = N 6 0 + 95616 = N 0 0 + 95616 = N 6 0 + 95712 = N 0 0 + 95712 = N 6 0 + 96096 = N 2 240 + 96096 = N 6 0 + 96384 = N 1 0 + 96384 = N 6 0 + 96480 = N 1 0 + 96480 = N 6 0 + 96864 = N 2 240 + 96864 = N 6 0 + 97152 = N 1 0 + 97152 = N 6 0 + 97248 = N 1 0 + 97248 = N 6 0 + 97632 = N 3 240 + 97632 = N 6 0 + 97920 = N 2 576 + 97920 = N 6 0 + 98592 = N 0 0 + 98592 = N 6 0 + 98688 = N 1 0 + 98688 = N 6 0 + 98784 = N 2 0 + 98784 = N 6 0 + 98880 = N 3 0 + 98880 = N 6 0 + 98928 = N 4 0 + 98928 = N 6 0 + 99072 = N 1 0 + 99072 = N 6 0 + 99264 = N 3 0 + 99264 = N 6 0 + 99456 = N 2 384 + 99456 = N 6 0 + 99936 = N 3 816 + 99936 = S 2 2304 + 99936 = E solo + 100800 = N 4 528 + 100800 = N 5 0 + 101376 = N 3 0 + 101472 = N 2 0 + 101568 = N 0 0 + 101664 = N 1 0 + 101664 = N 5 0 + 101760 = N 4 0 + 101856 = N 3 720 + 102624 = N 0 432 + 103104 = N 3 0 + 103200 = N 4 144 + 103200 = N 5 0 + 103392 = N 3 0 + 103392 = N 5 0 + 103488 = N 2 144 + 103680 = N 2 0 + 103776 = N 2 288 + 104352 = N 0 0 + 104400 = N 1 0 + 104448 = N 2 0 + 104496 = N 0 0 + 104544 = N 1 0 + 104592 = N 2 0 + 104640 = N 3 0 + 104736 = N 4 0 + 104832 = N 4 0 + 104928 = N 0 0 + 105024 = N 0 0 + 105120 = N 1 0 + 105120 = N 5 0 + 105216 = N 1 0 + 105312 = N 2 0 + 105312 = N 5 0 + 105408 = N 2 0 + 105504 = N 3 0 + 105600 = N 3 0 + 105696 = N 2 0 + 105792 = N 1 0 + 105840 = N 2 0 + 105888 = N 4 0 + 105984 = N 1 0 + 106032 = N 2 0 + 106080 = N 4 0 + 106176 = N 1 0 + 106224 = N 2 0 + 106272 = N 4 0 + 106320 = N 1 0 + 106368 = N 2 0 + 106416 = N 4 0 + 106464 = N 1 0 + 106512 = N 2 0 + 106560 = N 4 0 + 106608 = N 1 0 + 106656 = N 2 0 + 106704 = N 4 0 + 106752 = N 1 0 + 106800 = N 2 0 + 106848 = N 4 0 + 106896 = N 2 112 + 107040 = N 3 192 + 107424 = N 0 0 + 107472 = N 0 0 + 107520 = N 0 0 + 107568 = N 0 0 + 107616 = N 0 0 + 107664 = N 0 0 + 107712 = N 3 144 + 107712 = N 5 0 + 107904 = N 0 0 + 107952 = N 0 0 + 108000 = N 0 0 + 108048 = N 0 0 + 108096 = N 2 0 + 108096 = N 5 0 + 108192 = N 0 0 + 108240 = N 0 0 + 108288 = N 0 0 + 108384 = N 3 0 + 108480 = N 0 0 + 108528 = N 0 0 + 108576 = N 0 0 + 108672 = N 2 192 + 108960 = N 0 0 + 109056 = N 0 0 + 109152 = N 4 0 + 109200 = N 4 0 + 109248 = N 4 0 + 109440 = N 4 0 + 109488 = N 3 0 + 109536 = N 2 0 + 109584 = N 1 0 + 109632 = N 0 0 + 109728 = N 3 0 + 109776 = N 2 0 + 109824 = N 1 0 + 109872 = N 0 0 + 109920 = N 1 0 + 109968 = N 2 0 + 110016 = N 3 0 + 110064 = N 2 0 + 110112 = N 1 0 + 110160 = N 2 0 + 110208 = N 3 0 + 110304 = N 4 0 + 110400 = N 2 0 + 110448 = N 3 0 + 110496 = N 4 0 + 110544 = N 2 0 + 110592 = N 3 0 + 110640 = N 4 0 + 110688 = N 2 0 + 110736 = N 3 0 + 110784 = N 4 0 + 110832 = N 2 0 + 110880 = N 3 0 + 110928 = N 4 0 + 110976 = N 3 0 + 111072 = N 4 0 + 111168 = N 3 0 + 111192 = N 2 0 + 111264 = N 1 0 + 111312 = N 2 0 + 111360 = N 1 0 + 111456 = N 0 256 + 111744 = N 0 720 + 111744 = N 1 720 + 112512 = N 2 0 + 112512 = N 3 0 + 112608 = N 1 0 + 112704 = N 2 0 + 112800 = N 3 144 + 112992 = N 4 0 + 113184 = N 3 0 + 113280 = N 4 0 + 113328 = N 3 0 + 113376 = N 2 0 + 113424 = N 1 0 + 113472 = N 0 0 + 113568 = N 3 0 + 113616 = N 2 0 + 113664 = N 1 0 + 113712 = N 0 0 + 113760 = N 1 0 + 113808 = N 0 0 + 113856 = N 2 0 + 113904 = N 3 0 + 113952 = N 1 0 + 114048 = N 3 0 + 114144 = N 1 0 + 114240 = N 2 0 + 114240 = N 3 0 + 114336 = N 1 0 + 114432 = N 3 0 + 114528 = N 1 0 + 114576 = N 1 0 + 114624 = N 1 0 + 114720 = N 2 0 + 114768 = N 3 0 + 114816 = N 4 0 + 114912 = N 0 0 + 114960 = N 1 0 + 115008 = N 2 0 + 115104 = N 1 0 + 115152 = N 2 0 + 115200 = N 3 0 + 115248 = N 4 0 + 115296 = N 2 0 + 115344 = N 3 0 + 115392 = N 0 0 + 115440 = N 1 0 + 115488 = N 2 0 + 115584 = N 1 0 + 115680 = N 2 0 + 115776 = N 3 0 + 115872 = N 2 0 + 115872 = N 5 0 + 115968 = N 1 0 + 116064 = N 1 0 + 116088 = N 2 136 + 116256 = N 2 0 + 116288 = N 3 352 + 116736 = S 2 1536 + 116928 = N 4 0 + 116976 = N 3 0 + 117024 = N 2 0 + 117072 = N 1 0 + 117120 = N 2 0 + 117168 = N 1 0 + 117216 = N 0 0 + 117312 = N 3 0 + 117360 = N 1 0 + 117408 = N 0 0 + 117456 = N 1 0 + 117504 = N 2 0 + 117552 = N 3 0 + 117600 = N 2 0 + 117648 = N 3 0 + 117696 = N 2 0 + 117792 = E soloend + 118560 = N 0 0 + 118560 = N 6 0 + 118656 = N 1 0 + 118656 = N 6 0 + 118752 = N 2 0 + 118752 = N 6 0 + 118848 = N 3 0 + 118848 = N 6 0 + 118944 = N 4 0 + 118944 = N 6 0 + 119136 = N 0 336 + 119136 = N 6 0 + 119520 = N 0 384 + 119520 = N 6 0 + 120096 = N 2 0 + 120096 = N 6 0 + 120144 = N 3 112 + 120144 = N 6 0 + 120288 = N 0 144 + 120288 = N 6 0 + 120480 = N 1 144 + 120480 = N 6 0 + 120672 = N 2 0 + 120672 = N 6 0 + 120720 = N 3 0 + 120720 = N 6 0 + 120768 = N 4 0 + 120768 = N 6 0 + 121248 = N 0 0 + 121248 = N 6 0 + 121344 = N 1 0 + 121344 = N 6 0 + 121440 = N 2 528 + 121440 = N 6 0 + 122016 = N 2 0 + 122016 = N 6 0 + 122112 = N 4 0 + 122112 = N 6 0 + 122208 = N 3 624 + 122208 = N 6 0 + 122880 = N 2 0 + 122880 = N 6 0 + 122976 = N 1 864 + 122976 = N 6 0 + 124032 = N 1 0 + 124032 = N 6 0 + 124080 = N 2 0 + 124080 = N 6 0 + 124176 = N 3 0 + 124176 = N 6 0 + 124224 = N 4 0 + 124224 = N 6 0 + 124320 = N 4 144 + 124320 = N 6 0 + 124512 = N 3 0 + 124512 = N 6 0 + 124640 = N 4 0 + 124640 = N 6 0 + 124672 = N 3 0 + 124672 = N 6 0 + 124704 = N 2 0 + 124704 = N 6 0 + 124800 = N 3 192 + 124800 = N 6 0 + 125568 = N 3 0 + 125568 = N 6 0 + 125616 = N 3 0 + 125616 = N 6 0 + 125664 = N 1 0 + 125664 = N 6 0 + 125760 = N 2 0 + 125760 = N 6 0 + 125856 = N 2 144 + 125856 = N 6 0 + 126048 = N 0 240 + 126048 = N 6 0 + 126336 = N 3 0 + 126336 = N 6 0 + 126432 = N 4 0 + 126432 = N 6 0 + 126528 = N 1 0 + 126528 = N 6 0 + 126624 = N 2 0 + 126624 = N 6 0 + 126720 = N 0 0 + 126720 = N 6 0 + 126768 = N 1 0 + 126768 = N 6 0 + 126816 = N 2 0 + 126816 = N 6 0 + 126864 = N 3 0 + 126864 = N 6 0 + 126912 = N 4 0 + 126912 = N 6 0 + 127200 = N 3 0 + 127200 = N 6 0 + 127296 = N 2 0 + 127296 = N 6 0 + 127344 = N 1 0 + 127344 = N 6 0 + 127392 = N 0 0 + 127392 = N 6 0 + 127488 = N 1 0 + 127488 = N 6 0 + 127584 = N 2 0 + 127584 = N 6 0 + 127680 = N 3 0 + 127680 = N 6 0 + 127728 = N 2 0 + 127728 = N 6 0 + 127776 = N 3 0 + 127776 = N 6 0 + 127968 = N 4 0 + 127968 = N 6 0 + 128064 = N 3 0 + 128064 = N 6 0 + 128160 = N 1 0 + 128160 = N 6 0 + 128256 = N 0 0 + 128256 = N 6 0 + 128352 = N 1 336 + 128352 = N 6 0 + 128736 = N 0 0 + 128736 = N 6 0 + 128784 = N 1 0 + 128784 = N 6 0 + 128832 = N 0 0 + 128832 = N 6 0 + 128880 = N 1 0 + 128880 = N 6 0 + 128928 = N 2 0 + 128928 = N 6 0 + 128976 = N 3 0 + 128976 = N 6 0 + 129024 = N 2 0 + 129024 = N 6 0 + 129072 = N 3 0 + 129072 = N 6 0 + 129120 = N 4 0 + 129120 = N 6 0 + 129312 = N 2 0 + 129312 = N 6 0 + 129360 = N 1 0 + 129360 = N 6 0 + 129408 = N 0 0 + 129408 = N 6 0 + 129456 = N 1 0 + 129456 = N 6 0 + 129504 = N 2 0 + 129504 = N 6 0 + 129552 = N 3 0 + 129552 = N 6 0 + 129600 = N 4 0 + 129600 = N 6 0 + 129648 = N 3 0 + 129648 = N 6 0 + 129696 = N 2 0 + 129696 = N 6 0 + 129744 = N 3 0 + 129744 = N 6 0 + 129792 = N 4 0 + 129792 = N 6 0 + 129840 = N 0 0 + 129840 = N 6 0 + 129888 = N 1 0 + 129888 = N 6 0 + 129936 = N 2 0 + 129936 = N 6 0 + 129984 = N 3 432 + 129984 = N 6 0 + 130464 = N 4 288 + 130464 = N 6 0 + 131232 = N 1 0 + 131232 = N 6 0 + 131328 = N 2 0 + 131328 = N 6 0 + 131424 = N 4 240 + 131424 = N 6 0 + 131712 = N 2 0 + 131712 = N 6 0 + 131904 = N 1 0 + 131904 = N 6 0 + 132192 = N 1 0 + 132192 = N 6 0 + 132480 = N 1 0 + 132480 = N 6 0 + 132768 = N 1 0 + 132768 = N 6 0 + 132768 = S 2 1440 + 132864 = N 2 0 + 132864 = N 6 0 + 132960 = N 4 240 + 132960 = N 6 0 + 133248 = N 2 0 + 133248 = N 6 0 + 133440 = N 1 0 + 133440 = N 6 0 + 133728 = N 0 0 + 133728 = N 6 0 + 134016 = N 0 0 + 134016 = N 6 0 + 134304 = N 1 0 + 134304 = N 6 0 + 134400 = N 2 0 + 134400 = N 6 0 + 134496 = N 4 240 + 134496 = N 6 0 + 134784 = N 2 0 + 134784 = N 6 0 + 134976 = N 1 0 + 134976 = N 6 0 + 135264 = N 1 0 + 135264 = N 6 0 + 135552 = N 1 0 + 135552 = N 6 0 + 135840 = N 1 0 + 135840 = N 6 0 + 135936 = N 2 0 + 135936 = N 6 0 + 136032 = N 4 240 + 136032 = N 6 0 + 136320 = N 2 0 + 136320 = N 6 0 + 136512 = N 1 0 + 136512 = N 6 0 + 136800 = N 2 240 + 136800 = N 6 0 + 137088 = N 4 0 + 137088 = N 6 0 + 137280 = N 0 0 + 137280 = N 6 0 + 137568 = N 0 240 + 137568 = N 6 0 + 137856 = N 2 0 + 137856 = N 6 0 + 138048 = N 0 0 + 138048 = N 6 0 + 138336 = N 4 816 + 138336 = N 6 0 + 139200 = N 3 0 + 139200 = N 6 0 + 139296 = N 2 0 + 139296 = N 6 0 + 139488 = N 1 0 + 139488 = N 6 0 + 139680 = N 0 0 + 139680 = N 6 0 + 139872 = N 2 240 + 139872 = N 6 0 + 140160 = N 4 0 + 140160 = N 6 0 + 140352 = N 0 0 + 140352 = N 6 0 + 140640 = N 1 240 + 140640 = N 6 0 + 140928 = N 2 0 + 140928 = N 6 0 + 141120 = N 0 0 + 141120 = N 6 0 + 141408 = N 3 816 + 141408 = N 6 0 + 142272 = N 3 0 + 142272 = N 6 0 + 142368 = N 4 0 + 142368 = N 6 0 + 142560 = N 2 0 + 142560 = N 6 0 + 142752 = N 0 0 + 142752 = N 6 0 + 142944 = N 2 240 + 142944 = N 6 0 + 143232 = N 3 0 + 143232 = N 6 0 + 143424 = N 4 0 + 143424 = N 6 0 + 143712 = N 0 240 + 143712 = N 6 0 + 144000 = N 1 0 + 144000 = N 6 0 + 144192 = N 3 0 + 144192 = N 6 0 + 144480 = N 2 816 + 144480 = N 6 0 + 145344 = N 3 0 + 145344 = N 6 0 + 145440 = N 2 0 + 145440 = N 6 0 + 145632 = N 1 0 + 145632 = N 6 0 + 145824 = N 0 0 + 145824 = N 6 0 + 146016 = N 2 240 + 146016 = N 6 0 + 146016 = S 2 1344 + 146304 = N 3 0 + 146304 = N 6 0 + 146496 = N 4 0 + 146496 = N 6 0 + 146784 = N 0 240 + 146784 = N 6 0 + 147072 = N 1 0 + 147072 = N 6 0 + 147264 = N 3 0 + 147264 = N 6 0 + 147552 = N 2 1440 + 147552 = N 6 0 + 149472 = N 3 0 + 149472 = N 6 0 + 149472 = E solo + 149520 = N 4 0 + 149520 = N 6 0 + 149664 = N 3 0 + 149664 = N 6 0 + 149760 = N 2 0 + 149760 = N 6 0 + 149856 = N 1 0 + 149856 = N 6 0 + 149952 = N 0 144 + 149952 = N 6 0 + 150144 = N 1 0 + 150144 = N 6 0 + 150336 = N 2 0 + 150336 = N 6 0 + 150432 = N 1 0 + 150432 = N 6 0 + 150528 = N 0 0 + 150528 = N 6 0 + 150624 = N 1 0 + 150624 = N 6 0 + 150720 = N 2 0 + 150720 = N 6 0 + 150816 = N 3 0 + 150816 = N 6 0 + 150912 = N 3 0 + 150912 = N 6 0 + 151008 = N 4 0 + 151008 = N 6 0 + 151104 = N 3 0 + 151104 = N 6 0 + 151200 = N 2 0 + 151200 = N 6 0 + 151296 = N 1 0 + 151296 = N 6 0 + 151392 = N 0 144 + 151392 = N 6 0 + 151584 = N 1 288 + 151584 = N 6 0 + 152928 = N 1 0 + 152928 = N 6 0 + 152976 = N 2 0 + 152976 = N 6 0 + 153024 = N 3 0 + 153024 = N 6 0 + 153120 = N 4 0 + 153120 = N 6 0 + 153216 = N 3 0 + 153216 = N 6 0 + 153312 = N 2 0 + 153312 = N 6 0 + 153408 = N 3 0 + 153408 = N 6 0 + 153504 = N 1 0 + 153504 = N 6 0 + 153696 = N 0 240 + 153696 = N 6 0 + 153984 = N 1 0 + 153984 = N 6 0 + 154176 = N 2 0 + 154176 = N 6 0 + 154304 = N 3 0 + 154304 = N 6 0 + 154464 = N 4 144 + 154464 = N 6 0 + 154656 = N 2 0 + 154656 = N 6 0 + 154752 = N 1 0 + 154752 = N 6 0 + 154848 = N 0 240 + 154848 = N 6 0 + 155136 = N 1 0 + 155136 = N 6 0 + 156384 = N 0 0 + 156384 = N 6 0 + 156480 = N 1 0 + 156480 = N 6 0 + 156576 = N 2 0 + 156576 = N 6 0 + 156672 = N 3 0 + 156672 = N 6 0 + 156768 = N 2 0 + 156768 = N 6 0 + 156816 = N 3 0 + 156816 = N 6 0 + 156864 = N 4 912 + 156864 = N 6 0 + 157824 = N 3 0 + 157824 = N 6 0 + 157824 = S 2 1280 + 157920 = N 2 96 + 157920 = N 6 0 + 158064 = N 3 0 + 158064 = N 6 0 + 158112 = N 1 0 + 158112 = N 6 0 + 158208 = N 2 0 + 158208 = N 6 0 + 158304 = N 0 0 + 158304 = N 6 0 + 158400 = N 1 240 + 158400 = N 6 0 + 158688 = N 0 288 + 158688 = N 6 0 + 160320 = N 1 0 + 160320 = N 6 0 + 160368 = N 2 0 + 160368 = N 6 0 + 160416 = N 3 0 + 160416 = N 6 0 + 160464 = N 2 112 + 160464 = N 6 0 + 160608 = N 1 0 + 160608 = N 6 0 + 160656 = N 2 0 + 160656 = N 6 0 + 160704 = N 3 144 + 160704 = N 6 0 + 160896 = N 1 0 + 160896 = N 6 0 + 160944 = N 2 0 + 160944 = N 6 0 + 160992 = N 4 0 + 160992 = N 6 0 + 161040 = N 3 0 + 161040 = N 6 0 + 161088 = N 2 0 + 161088 = N 6 0 + 161136 = N 3 0 + 161136 = N 6 0 + 161184 = N 1 0 + 161184 = N 6 0 + 161232 = N 3 192 + 161232 = N 6 0 + 161472 = N 1 0 + 161472 = N 6 0 + 161520 = N 2 0 + 161520 = N 6 0 + 161568 = N 3 0 + 161568 = N 6 0 + 161664 = N 4 0 + 161664 = N 6 0 + 161712 = N 3 0 + 161712 = N 6 0 + 161760 = N 2 0 + 161760 = N 6 0 + 161808 = N 1 0 + 161808 = N 6 0 + 161856 = N 0 0 + 161856 = N 6 0 + 161904 = N 0 0 + 161904 = N 6 0 + 161952 = N 1 0 + 161952 = N 6 0 + 162000 = N 1 0 + 162000 = N 6 0 + 162048 = N 2 0 + 162048 = N 6 0 + 162096 = N 3 0 + 162096 = N 6 0 + 162144 = N 2 0 + 162144 = N 6 0 + 162240 = N 1 0 + 162240 = N 6 0 + 162288 = N 0 0 + 162288 = N 6 0 + 162336 = N 1 0 + 162336 = N 6 0 + 162384 = N 2 0 + 162384 = N 6 0 + 162432 = N 3 0 + 162432 = N 6 0 + 162528 = N 2 0 + 162528 = N 6 0 + 162576 = N 1 0 + 162576 = N 6 0 + 162624 = N 0 0 + 162624 = N 6 0 + 162672 = N 1 0 + 162672 = N 6 0 + 162720 = N 2 0 + 162720 = N 6 0 + 162768 = N 3 0 + 162768 = N 6 0 + 162816 = N 2 0 + 162816 = N 6 0 + 162864 = N 3 16 + 162864 = N 6 0 + 162912 = N 4 240 + 162912 = N 6 0 + 163200 = N 2 144 + 163200 = N 6 0 + 164448 = N 2 0 + 164448 = N 6 0 + 164496 = N 3 0 + 164496 = N 6 0 + 164544 = N 4 0 + 164544 = N 6 0 + 164640 = N 3 0 + 164640 = N 6 0 + 164736 = N 2 0 + 164736 = N 6 0 + 164784 = N 3 0 + 164784 = N 6 0 + 164832 = N 1 0 + 164832 = N 6 0 + 164928 = N 2 0 + 164928 = N 6 0 + 165024 = N 1 0 + 165024 = N 6 0 + 165120 = N 2 0 + 165120 = N 6 0 + 165216 = N 1 0 + 165216 = N 6 0 + 165312 = N 0 0 + 165312 = N 6 0 + 165408 = N 4 0 + 165408 = N 6 0 + 165504 = N 3 0 + 165504 = N 6 0 + 165600 = N 4 0 + 165600 = N 6 0 + 165696 = N 3 0 + 165696 = N 6 0 + 165792 = N 2 0 + 165792 = N 6 0 + 165888 = N 1 0 + 165888 = N 6 0 + 165984 = N 0 0 + 165984 = N 6 0 + 166080 = N 4 0 + 166080 = N 6 0 + 166176 = N 3 0 + 166176 = N 6 0 + 166368 = N 2 144 + 166368 = N 6 0 + 166560 = N 1 0 + 166560 = N 6 0 + 166656 = N 2 0 + 166656 = N 6 0 + 166752 = N 2 0 + 166752 = N 6 0 + 166848 = N 0 144 + 166848 = N 6 0 + 167040 = N 1 336 + 167040 = N 6 0 + 167424 = N 0 192 + 167424 = N 6 0 + 168960 = N 2 0 + 168960 = N 6 0 + 168984 = N 3 0 + 168984 = N 6 0 + 169056 = N 2 432 + 169056 = N 6 0 + 169536 = N 3 0 + 169536 = N 6 0 + 169632 = N 4 0 + 169632 = N 6 0 + 169728 = N 3 144 + 169728 = N 6 0 + 169920 = N 2 144 + 169920 = N 6 0 + 170112 = N 1 144 + 170112 = N 6 0 + 170304 = N 2 240 + 170304 = N 6 0 + 170592 = N 3 0 + 170592 = N 6 0 + 170688 = N 2 0 + 170688 = N 6 0 + 170736 = N 1 0 + 170736 = N 6 0 + 170784 = N 0 0 + 170784 = N 6 0 + 171360 = N 1 0 + 171360 = N 6 0 + 171456 = N 2 0 + 171456 = N 6 0 + 171504 = N 3 0 + 171504 = N 6 0 + 171552 = N 1 144 + 171552 = N 6 0 + 171744 = N 2 0 + 171744 = N 6 0 + 171792 = N 3 0 + 171792 = N 6 0 + 171840 = N 1 144 + 171840 = N 6 0 + 172032 = N 2 0 + 172032 = N 6 0 + 172064 = N 3 0 + 172064 = N 6 0 + 172096 = N 2 0 + 172096 = N 6 0 + 172128 = N 1 0 + 172128 = N 6 0 + 172224 = N 2 0 + 172224 = N 6 0 + 172256 = N 3 0 + 172256 = N 6 0 + 172288 = N 2 0 + 172288 = N 6 0 + 172320 = N 1 144 + 172320 = N 6 0 + 172512 = N 2 0 + 172512 = N 6 0 + 172544 = N 3 0 + 172544 = N 6 0 + 172576 = N 2 0 + 172576 = N 6 0 + 172608 = N 1 0 + 172608 = N 6 0 + 172704 = N 1 0 + 172704 = N 6 0 + 172752 = N 2 0 + 172752 = N 6 0 + 172800 = N 3 0 + 172800 = N 6 0 + 172848 = N 0 0 + 172848 = N 6 0 + 172896 = N 1 0 + 172896 = N 6 0 + 172944 = N 2 0 + 172944 = N 6 0 + 172992 = N 3 0 + 172992 = N 6 0 + 173040 = N 4 0 + 173040 = N 6 0 + 173088 = N 3 192 + 173088 = N 6 0 + 174048 = N 1 0 + 174048 = N 6 0 + 174144 = N 2 0 + 174144 = N 6 0 + 174168 = N 3 0 + 174168 = N 6 0 + 174240 = N 1 0 + 174240 = N 6 0 + 174336 = N 3 0 + 174336 = N 6 0 + 174432 = N 1 0 + 174432 = N 6 0 + 174528 = N 3 0 + 174528 = N 6 0 + 174624 = N 1 0 + 174624 = N 6 0 + 174720 = N 3 144 + 174720 = N 6 0 + 174912 = N 4 192 + 174912 = N 6 0 + 175776 = N 1 0 + 175776 = N 6 0 + 175872 = N 2 0 + 175872 = N 6 0 + 175904 = N 3 0 + 175904 = N 6 0 + 175968 = N 1 144 + 175968 = N 6 0 + 176160 = N 3 0 + 176160 = N 6 0 + 176208 = N 4 0 + 176208 = N 6 0 + 176256 = N 2 0 + 176256 = N 6 0 + 176304 = N 1 0 + 176304 = N 6 0 + 176352 = N 2 0 + 176352 = N 6 0 + 176400 = N 1 0 + 176400 = N 6 0 + 176448 = N 4 0 + 176448 = N 6 0 + 176544 = N 3 192 + 176544 = N 6 0 + 176736 = E soloend +} +[HardSingle] +{ + 1536 = N 1 336 + 1536 = N 6 0 + 1920 = N 2 240 + 1920 = N 6 0 + 2208 = N 4 864 + 2208 = N 6 0 + 3264 = N 0 240 + 3264 = N 6 0 + 3552 = N 2 240 + 3552 = N 6 0 + 3840 = N 3 768 + 3840 = N 6 0 + 4800 = N 2 240 + 4800 = N 6 0 + 5088 = N 2 240 + 5088 = N 6 0 + 5376 = N 2 1584 + 5376 = N 6 0 + 7008 = N 0 448 + 7488 = N 1 240 + 7776 = N 2 720 + 8544 = N 0 448 + 9024 = N 1 144 + 9216 = N 2 0 + 9312 = N 4 720 + 10080 = N 0 448 + 10080 = S 2 1152 + 10560 = N 1 240 + 10848 = N 2 720 + 11616 = N 0 448 + 12096 = N 1 144 + 12288 = N 2 0 + 12384 = N 4 720 + 13152 = N 3 144 + 13152 = N 6 0 + 13344 = N 2 0 + 13344 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13536 = N 2 0 + 13536 = N 6 0 + 13632 = N 1 144 + 13632 = N 6 0 + 13824 = N 0 0 + 13824 = N 6 0 + 13920 = N 1 240 + 13920 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 14400 = N 1 0 + 14400 = N 6 0 + 14592 = N 2 0 + 14592 = N 6 0 + 14688 = N 3 240 + 14688 = N 6 0 + 14976 = N 2 0 + 14976 = N 6 0 + 15168 = N 3 0 + 15168 = N 6 0 + 15360 = N 1 0 + 15360 = N 6 0 + 15456 = N 0 0 + 15456 = N 6 0 + 15648 = N 1 528 + 15648 = N 6 0 + 16224 = N 3 144 + 16224 = N 6 0 + 16416 = N 2 0 + 16416 = N 6 0 + 16512 = N 3 0 + 16512 = N 6 0 + 16608 = N 2 0 + 16608 = N 6 0 + 16704 = N 1 144 + 16704 = N 6 0 + 16896 = N 0 0 + 16896 = N 6 0 + 16992 = N 1 240 + 16992 = N 6 0 + 17280 = N 0 0 + 17280 = N 6 0 + 17472 = N 1 0 + 17472 = N 6 0 + 17664 = N 2 0 + 17664 = N 6 0 + 17760 = N 3 240 + 17760 = N 6 0 + 18048 = N 2 0 + 18048 = N 6 0 + 18240 = N 3 0 + 18240 = N 6 0 + 18432 = N 1 0 + 18432 = N 6 0 + 18528 = N 0 0 + 18528 = N 6 0 + 18720 = N 1 240 + 18720 = N 6 0 + 19008 = N 1 0 + 19008 = N 6 0 + 19104 = N 2 0 + 19104 = N 6 0 + 19200 = N 3 0 + 19200 = N 6 0 + 19296 = N 4 144 + 19296 = N 6 0 + 19488 = N 3 0 + 19488 = N 6 0 + 19584 = N 4 0 + 19584 = N 6 0 + 19680 = N 3 0 + 19680 = N 6 0 + 19776 = N 2 144 + 19776 = N 6 0 + 19968 = N 1 0 + 19968 = N 6 0 + 20064 = N 2 240 + 20064 = N 6 0 + 20352 = N 1 0 + 20352 = N 6 0 + 20544 = N 2 0 + 20544 = N 6 0 + 20736 = N 3 0 + 20736 = N 6 0 + 20832 = N 4 240 + 20832 = N 6 0 + 21120 = N 3 0 + 21120 = N 6 0 + 21312 = N 2 0 + 21312 = N 6 0 + 21504 = N 0 0 + 21504 = N 6 0 + 21600 = N 1 0 + 21600 = N 6 0 + 21792 = N 1 240 + 21792 = N 6 0 + 22080 = N 1 0 + 22080 = N 6 0 + 22080 = S 2 3072 + 22176 = N 2 0 + 22176 = N 6 0 + 22272 = N 3 0 + 22272 = N 6 0 + 22368 = N 4 144 + 22368 = N 6 0 + 22560 = N 3 0 + 22560 = N 6 0 + 22656 = N 4 0 + 22656 = N 6 0 + 22752 = N 3 0 + 22752 = N 6 0 + 22848 = N 2 144 + 22848 = N 6 0 + 23040 = N 1 0 + 23040 = N 6 0 + 23136 = N 2 240 + 23136 = N 6 0 + 23424 = N 1 0 + 23424 = N 6 0 + 23616 = N 2 0 + 23616 = N 6 0 + 23808 = N 3 0 + 23808 = N 6 0 + 23904 = N 4 240 + 23904 = N 6 0 + 24192 = N 3 0 + 24192 = N 6 0 + 24384 = N 2 0 + 24384 = N 6 0 + 24576 = N 0 0 + 24576 = N 6 0 + 24672 = N 1 0 + 24672 = N 6 0 + 24864 = N 1 528 + 24864 = N 6 0 + 25440 = N 3 240 + 25440 = N 6 0 + 25728 = N 2 0 + 25728 = N 6 0 + 25824 = N 2 0 + 25824 = N 6 0 + 26208 = N 2 240 + 26208 = N 6 0 + 26496 = N 1 0 + 26496 = N 6 0 + 26592 = N 1 0 + 26592 = N 6 0 + 26976 = N 2 144 + 26976 = N 6 0 + 27168 = N 2 0 + 27168 = N 6 0 + 27264 = N 0 0 + 27264 = N 6 0 + 27360 = N 0 0 + 27360 = N 6 0 + 27744 = N 2 240 + 27744 = N 6 0 + 28032 = N 1 0 + 28032 = N 6 0 + 28128 = N 1 0 + 28128 = N 6 0 + 28512 = N 2 240 + 28512 = N 6 0 + 28800 = N 1 0 + 28800 = N 6 0 + 28896 = N 1 0 + 28896 = N 6 0 + 29280 = N 3 240 + 29280 = N 6 0 + 29568 = N 2 576 + 29568 = N 6 0 + 30240 = N 0 0 + 30240 = N 6 0 + 30336 = N 1 0 + 30336 = N 6 0 + 30432 = N 2 0 + 30432 = N 6 0 + 30528 = N 4 0 + 30528 = N 6 0 + 30720 = N 1 0 + 30720 = N 6 0 + 30912 = N 3 0 + 30912 = N 6 0 + 31104 = N 2 384 + 31104 = N 6 0 + 31584 = N 1 1632 + 31584 = N 6 0 + 33696 = N 1 0 + 33696 = N 6 0 + 33792 = N 2 0 + 33792 = N 6 0 + 33888 = N 4 240 + 33888 = N 6 0 + 34176 = N 2 0 + 34176 = N 6 0 + 34368 = N 1 0 + 34368 = N 6 0 + 34656 = N 0 0 + 34656 = N 6 0 + 34944 = N 0 0 + 34944 = N 6 0 + 35232 = N 1 0 + 35232 = N 6 0 + 35328 = N 2 0 + 35328 = N 6 0 + 35424 = N 4 240 + 35424 = N 6 0 + 35712 = N 2 0 + 35712 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36192 = N 1 0 + 36192 = N 6 0 + 36480 = N 1 0 + 36480 = N 6 0 + 36672 = S 2 960 + 36768 = N 1 0 + 36768 = N 6 0 + 36864 = N 2 0 + 36864 = N 6 0 + 36960 = N 4 240 + 36960 = N 6 0 + 37248 = N 2 0 + 37248 = N 6 0 + 37440 = N 1 0 + 37440 = N 6 0 + 37824 = N 0 240 + 37824 = N 6 0 + 38112 = N 0 336 + 38112 = N 6 0 + 38496 = N 0 0 + 38496 = N 6 0 + 38592 = N 1 144 + 38592 = N 6 0 + 38784 = N 0 0 + 38784 = N 6 0 + 38880 = N 2 768 + 38880 = N 6 0 + 40896 = N 0 240 + 40896 = N 6 0 + 41184 = N 0 336 + 41184 = N 6 0 + 41568 = N 0 0 + 41568 = N 6 0 + 41664 = N 1 144 + 41664 = N 6 0 + 41856 = N 0 0 + 41856 = N 6 0 + 41952 = N 2 240 + 41952 = N 6 0 + 42240 = N 3 1728 + 42240 = N 6 0 + 45456 = N 1 0 + 45504 = N 2 336 + 45888 = N 1 1344 + 45888 = N 5 0 + 48288 = N 3 144 + 48480 = N 0 0 + 49920 = S 2 1536 + 50016 = N 2 240 + 50016 = N 6 0 + 50304 = N 4 0 + 50304 = N 6 0 + 50496 = N 0 0 + 50496 = N 6 0 + 50784 = N 0 240 + 50784 = N 6 0 + 51072 = N 2 0 + 51072 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51552 = N 4 816 + 51552 = N 6 0 + 52416 = N 3 0 + 52416 = N 6 0 + 52512 = N 2 0 + 52512 = N 6 0 + 52704 = N 1 0 + 52704 = N 6 0 + 52896 = N 0 0 + 52896 = N 6 0 + 53088 = N 2 240 + 53088 = N 6 0 + 53376 = N 4 0 + 53376 = N 6 0 + 53568 = N 0 0 + 53568 = N 6 0 + 53856 = N 1 240 + 53856 = N 6 0 + 54144 = N 2 0 + 54144 = N 6 0 + 54336 = N 0 0 + 54336 = N 6 0 + 54624 = N 3 816 + 54624 = N 6 0 + 55488 = N 3 0 + 55488 = N 6 0 + 55584 = N 4 0 + 55584 = N 6 0 + 55776 = N 2 0 + 55776 = N 6 0 + 55968 = N 0 0 + 55968 = N 6 0 + 56160 = N 2 240 + 56160 = N 6 0 + 56448 = N 3 0 + 56448 = N 6 0 + 56640 = N 4 0 + 56640 = N 6 0 + 56928 = N 0 240 + 56928 = N 6 0 + 57216 = N 1 0 + 57216 = N 6 0 + 57408 = N 3 0 + 57408 = N 6 0 + 57696 = N 2 816 + 57696 = N 6 0 + 58560 = N 3 0 + 58560 = N 6 0 + 58656 = N 2 0 + 58656 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 59040 = N 0 0 + 59040 = N 6 0 + 59232 = N 2 240 + 59232 = N 6 0 + 59520 = N 3 0 + 59520 = N 6 0 + 59712 = N 4 0 + 59712 = N 6 0 + 60000 = N 0 240 + 60000 = N 6 0 + 60288 = N 1 0 + 60288 = N 6 0 + 60480 = N 3 0 + 60480 = N 6 0 + 60768 = N 2 816 + 60768 = N 6 0 + 61632 = N 3 0 + 61632 = N 6 0 + 61728 = N 2 0 + 61728 = N 6 0 + 61920 = N 1 0 + 61920 = N 6 0 + 62112 = N 0 0 + 62112 = N 6 0 + 62304 = N 0 816 + 62304 = N 6 0 + 63168 = N 2 144 + 63360 = N 1 0 + 63456 = N 2 0 + 63552 = N 3 0 + 63648 = N 4 1008 + 64704 = N 2 160 + 64704 = S 2 960 + 64896 = N 1 0 + 64992 = N 2 0 + 65088 = N 3 0 + 65376 = N 0 736 + 66144 = N 2 240 + 66432 = N 1 0 + 66528 = N 2 0 + 66624 = N 3 0 + 66720 = N 4 1008 + 67776 = N 2 160 + 67968 = N 1 0 + 68064 = N 2 0 + 68160 = N 3 0 + 68448 = N 0 864 + 74784 = N 1 0 + 74784 = S 2 1536 + 74880 = N 2 0 + 74976 = N 3 0 + 75072 = N 2 0 + 75168 = N 3 0 + 75264 = N 4 0 + 75360 = N 2 240 + 75648 = N 0 0 + 75744 = N 1 0 + 75840 = N 2 0 + 75936 = N 4 0 + 76128 = N 3 528 + 76704 = N 0 0 + 76800 = N 1 0 + 76896 = N 2 0 + 76992 = N 3 0 + 77088 = N 4 0 + 77184 = N 3 0 + 77280 = N 2 0 + 77376 = N 3 0 + 77472 = N 2 0 + 77664 = N 1 144 + 77856 = N 4 0 + 77952 = N 3 0 + 78048 = N 0 0 + 78144 = N 2 0 + 78240 = N 0 0 + 78336 = N 1 0 + 78432 = N 2 240 + 78720 = N 0 0 + 78816 = N 1 0 + 78912 = N 2 0 + 79008 = N 4 0 + 79200 = N 3 528 + 79776 = N 0 0 + 79872 = N 1 0 + 79968 = N 2 0 + 80064 = N 3 0 + 80160 = N 4 0 + 80256 = N 3 0 + 80352 = N 2 0 + 80448 = N 3 0 + 80544 = N 2 0 + 80736 = N 1 144 + 81120 = E solo + 81216 = N 0 0 + 81216 = N 6 0 + 81312 = N 1 0 + 81312 = N 6 0 + 81408 = N 2 0 + 81408 = N 6 0 + 81504 = N 3 0 + 81504 = N 6 0 + 81600 = N 4 240 + 81600 = N 6 0 + 81888 = N 1 0 + 81888 = N 6 0 + 81984 = N 3 288 + 81984 = N 6 0 + 82368 = N 1 0 + 82368 = N 6 0 + 82464 = N 2 144 + 82464 = N 6 0 + 82656 = N 0 0 + 82656 = N 6 0 + 82752 = N 1 336 + 82752 = N 6 0 + 83136 = N 3 0 + 83136 = N 6 0 + 83232 = N 2 0 + 83232 = N 6 0 + 83328 = N 1 144 + 83328 = N 6 0 + 83520 = N 2 0 + 83520 = N 6 0 + 83616 = N 1 0 + 83616 = N 6 0 + 83712 = N 0 144 + 83712 = N 6 0 + 83904 = N 4 0 + 83904 = N 6 0 + 83952 = N 3 0 + 83952 = N 6 0 + 84000 = N 2 0 + 84000 = N 6 0 + 84096 = N 3 0 + 84096 = N 6 0 + 84144 = N 2 0 + 84144 = N 6 0 + 84192 = N 1 0 + 84192 = N 6 0 + 84288 = N 2 0 + 84288 = N 6 0 + 84336 = N 1 0 + 84336 = N 6 0 + 84384 = N 0 0 + 84384 = N 6 0 + 84480 = N 4 0 + 84480 = N 6 0 + 84528 = N 3 0 + 84528 = N 6 0 + 84576 = N 2 0 + 84576 = N 6 0 + 84672 = N 3 0 + 84672 = N 6 0 + 84720 = N 2 0 + 84720 = N 6 0 + 84768 = N 1 0 + 84768 = N 6 0 + 84864 = N 2 0 + 84864 = N 6 0 + 84912 = N 1 0 + 84912 = N 6 0 + 84960 = N 0 0 + 84960 = N 6 0 + 85056 = N 1 0 + 85056 = N 6 0 + 85104 = N 3 0 + 85104 = N 6 0 + 85152 = N 2 0 + 85152 = N 6 0 + 85200 = N 1 0 + 85200 = N 6 0 + 85248 = N 2 0 + 85248 = N 6 0 + 85296 = N 1 0 + 85296 = N 6 0 + 85824 = N 0 0 + 85824 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 85968 = N 2 0 + 85968 = N 6 0 + 86016 = N 3 0 + 86016 = N 6 0 + 86064 = N 1 0 + 86064 = N 6 0 + 86112 = N 2 0 + 86112 = N 6 0 + 86160 = N 3 0 + 86160 = N 6 0 + 86208 = N 4 0 + 86208 = N 6 0 + 86304 = N 0 0 + 86304 = N 6 0 + 86352 = N 1 0 + 86352 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86448 = N 3 0 + 86448 = N 6 0 + 86496 = N 2 0 + 86496 = N 6 0 + 86592 = N 3 0 + 86592 = N 6 0 + 86640 = N 2 0 + 86640 = N 6 0 + 86688 = N 1 0 + 86688 = N 6 0 + 86736 = N 0 0 + 86736 = N 6 0 + 86784 = N 1 0 + 86784 = N 6 0 + 86976 = N 2 0 + 86976 = N 6 0 + 87024 = N 3 0 + 87024 = N 6 0 + 87072 = N 4 0 + 87072 = N 6 0 + 87120 = N 3 0 + 87120 = N 6 0 + 87168 = N 2 0 + 87168 = N 6 0 + 87264 = N 1 0 + 87264 = N 6 0 + 87360 = N 2 0 + 87360 = N 6 0 + 87408 = N 1 0 + 87408 = N 6 0 + 87456 = N 0 0 + 87456 = N 6 0 + 87744 = N 1 0 + 87744 = N 6 0 + 87744 = S 2 768 + 87792 = N 3 0 + 87792 = N 6 0 + 87904 = N 3 176 + 87904 = N 6 0 + 88128 = N 1 0 + 88128 = N 6 0 + 88200 = N 3 0 + 88200 = N 6 0 + 88296 = N 3 168 + 88296 = N 6 0 + 88512 = N 3 144 + 88512 = N 6 0 + 88704 = N 3 192 + 88704 = N 6 0 + 88992 = N 4 0 + 88992 = N 6 0 + 89088 = N 3 0 + 89088 = N 6 0 + 89136 = N 2 0 + 89136 = N 6 0 + 89184 = N 1 0 + 89184 = N 6 0 + 89280 = N 4 0 + 89280 = N 6 0 + 89328 = N 3 0 + 89328 = N 6 0 + 89376 = N 2 0 + 89376 = N 6 0 + 89424 = N 4 0 + 89424 = N 6 0 + 89472 = N 3 0 + 89472 = N 6 0 + 89520 = N 2 0 + 89520 = N 6 0 + 89568 = N 1 0 + 89568 = N 6 0 + 89616 = N 0 0 + 89616 = N 6 0 + 89664 = N 1 0 + 89664 = N 6 0 + 89760 = N 3 0 + 89760 = N 6 0 + 89808 = N 4 0 + 89808 = N 6 0 + 89856 = N 3 0 + 89856 = N 6 0 + 89904 = N 2 0 + 89904 = N 6 0 + 89952 = N 1 0 + 89952 = N 6 0 + 90048 = N 2 0 + 90048 = N 6 0 + 90096 = N 1 0 + 90096 = N 6 0 + 90144 = N 0 0 + 90144 = N 6 0 + 90192 = N 2 0 + 90192 = N 6 0 + 90240 = N 1 0 + 90240 = N 6 0 + 90816 = N 0 0 + 90816 = N 6 0 + 90912 = N 1 0 + 90912 = N 6 0 + 90960 = N 2 0 + 90960 = N 6 0 + 91008 = N 0 0 + 91008 = N 6 0 + 91200 = N 0 0 + 91200 = N 6 0 + 91248 = N 1 0 + 91248 = N 6 0 + 91296 = N 2 0 + 91296 = N 6 0 + 91392 = N 1 0 + 91392 = N 6 0 + 91440 = N 2 0 + 91440 = N 6 0 + 91488 = N 3 0 + 91488 = N 6 0 + 91584 = N 2 0 + 91584 = N 6 0 + 91776 = N 1 0 + 91776 = N 6 0 + 91824 = N 2 0 + 91824 = N 6 0 + 91872 = N 3 0 + 91872 = N 6 0 + 91968 = N 0 0 + 91968 = N 6 0 + 92064 = N 1 0 + 92064 = N 6 0 + 92160 = N 3 0 + 92160 = N 6 0 + 92256 = N 0 0 + 92256 = N 6 0 + 92352 = N 1 0 + 92352 = N 6 0 + 92448 = N 2 0 + 92448 = N 6 0 + 92544 = N 3 0 + 92544 = N 6 0 + 92640 = N 0 0 + 92640 = N 6 0 + 92736 = N 0 0 + 92736 = N 6 0 + 92832 = N 1 0 + 92832 = N 6 0 + 92928 = N 2 0 + 92928 = N 6 0 + 92992 = N 3 0 + 92992 = N 6 0 + 93056 = N 4 688 + 93056 = N 6 0 + 93792 = N 3 240 + 93792 = N 6 0 + 93792 = E soloend + 94080 = N 2 0 + 94080 = N 6 0 + 94176 = N 2 0 + 94176 = N 6 0 + 94560 = N 2 240 + 94560 = N 6 0 + 94848 = N 1 0 + 94848 = N 6 0 + 94944 = N 1 0 + 94944 = N 6 0 + 95328 = N 2 144 + 95328 = N 6 0 + 95520 = N 2 0 + 95520 = N 6 0 + 95616 = N 0 0 + 95616 = N 6 0 + 95712 = N 0 0 + 95712 = N 6 0 + 96096 = N 2 240 + 96096 = N 6 0 + 96384 = N 1 0 + 96384 = N 6 0 + 96480 = N 1 0 + 96480 = N 6 0 + 96864 = N 2 240 + 96864 = N 6 0 + 97152 = N 1 0 + 97152 = N 6 0 + 97248 = N 1 0 + 97248 = N 6 0 + 97632 = N 3 240 + 97632 = N 6 0 + 97920 = N 2 576 + 97920 = N 6 0 + 98592 = N 0 0 + 98592 = N 6 0 + 98688 = N 1 0 + 98688 = N 6 0 + 98784 = N 2 0 + 98784 = N 6 0 + 98880 = N 4 0 + 98880 = N 6 0 + 99072 = N 1 0 + 99072 = N 6 0 + 99264 = N 3 0 + 99264 = N 6 0 + 99456 = N 2 384 + 99456 = N 6 0 + 99936 = N 3 816 + 99936 = S 2 2304 + 99936 = E solo + 100800 = N 4 528 + 100800 = N 5 0 + 101376 = N 3 0 + 101472 = N 2 0 + 101568 = N 0 0 + 101664 = N 1 0 + 101664 = N 5 0 + 101760 = N 4 0 + 101856 = N 3 720 + 102624 = N 0 432 + 103104 = N 3 0 + 103200 = N 4 144 + 103200 = N 5 0 + 103392 = N 3 0 + 103392 = N 5 0 + 103488 = N 2 144 + 103680 = N 2 0 + 103776 = N 2 0 + 104352 = N 0 0 + 104400 = N 1 0 + 104448 = N 2 0 + 104544 = N 1 0 + 104592 = N 2 0 + 104640 = N 3 0 + 104736 = N 4 0 + 104832 = N 4 0 + 104928 = N 0 0 + 105024 = N 0 0 + 105120 = N 1 0 + 105120 = N 5 0 + 105216 = N 1 0 + 105312 = N 2 0 + 105312 = N 5 0 + 105408 = N 2 0 + 105504 = N 3 0 + 105600 = N 3 0 + 105696 = N 2 0 + 105792 = N 1 0 + 105840 = N 2 0 + 105888 = N 3 0 + 105984 = N 1 0 + 106032 = N 2 0 + 106080 = N 3 0 + 106176 = N 1 0 + 106224 = N 2 0 + 106272 = N 3 0 + 106320 = N 1 0 + 106368 = N 2 0 + 106416 = N 3 0 + 106464 = N 1 0 + 106512 = N 2 0 + 106560 = N 3 0 + 106608 = N 1 0 + 106656 = N 2 0 + 106704 = N 3 0 + 106752 = N 1 0 + 106800 = N 2 0 + 106848 = N 3 0 + 106896 = N 2 112 + 107040 = N 3 192 + 107424 = N 1 0 + 107472 = N 1 0 + 107520 = N 1 0 + 107568 = N 1 0 + 107616 = N 1 0 + 107664 = N 1 0 + 107712 = N 3 144 + 107904 = N 1 0 + 107952 = N 1 0 + 108000 = N 1 0 + 108048 = N 1 0 + 108096 = N 2 0 + 108192 = N 1 0 + 108240 = N 1 0 + 108288 = N 1 0 + 108384 = N 3 0 + 108480 = N 1 0 + 108528 = N 1 0 + 108576 = N 1 0 + 108672 = N 2 192 + 108960 = N 1 0 + 109056 = N 1 0 + 109152 = N 4 0 + 109248 = N 4 0 + 109440 = N 4 0 + 109488 = N 3 0 + 109536 = N 2 0 + 109632 = N 1 0 + 109728 = N 3 0 + 109776 = N 2 0 + 109824 = N 1 0 + 109920 = N 0 0 + 109968 = N 1 0 + 110016 = N 2 0 + 110112 = N 1 0 + 110208 = N 2 0 + 110304 = N 3 0 + 110400 = N 1 0 + 110448 = N 2 0 + 110496 = N 3 0 + 110544 = N 1 0 + 110592 = N 2 0 + 110640 = N 3 0 + 110688 = N 1 0 + 110736 = N 2 0 + 110784 = N 3 0 + 110832 = N 1 0 + 110880 = N 2 0 + 110928 = N 3 0 + 110976 = N 2 0 + 111072 = N 3 0 + 111168 = N 2 0 + 111264 = N 1 0 + 111360 = N 1 0 + 111456 = N 0 256 + 111744 = N 0 720 + 111744 = N 1 720 + 112512 = N 2 0 + 112512 = N 3 0 + 112608 = N 1 0 + 112704 = N 2 0 + 112800 = N 3 144 + 112992 = N 4 0 + 113184 = N 3 0 + 113280 = N 4 0 + 113328 = N 3 0 + 113376 = N 2 0 + 113472 = N 1 0 + 113568 = N 3 0 + 113616 = N 2 0 + 113664 = N 1 0 + 113712 = N 0 0 + 113760 = N 1 0 + 113856 = N 2 0 + 113952 = N 1 0 + 114048 = N 3 0 + 114144 = N 1 0 + 114240 = N 3 0 + 114336 = N 1 0 + 114432 = N 3 0 + 114528 = N 1 0 + 114624 = N 1 0 + 114720 = N 0 0 + 114816 = N 2 0 + 114912 = N 0 0 + 115008 = N 1 0 + 115056 = N 0 0 + 115104 = N 1 0 + 115152 = N 2 0 + 115200 = N 3 0 + 115296 = N 2 0 + 115392 = N 0 0 + 115440 = N 1 0 + 115488 = N 2 0 + 115584 = N 1 0 + 115680 = N 2 0 + 115776 = N 3 0 + 115872 = N 2 0 + 115872 = N 5 0 + 115968 = N 1 0 + 116064 = N 2 144 + 116064 = N 5 0 + 116256 = N 2 0 + 116288 = N 3 352 + 116736 = S 2 1536 + 116928 = N 4 0 + 116976 = N 3 0 + 117024 = N 2 0 + 117072 = N 1 0 + 117120 = N 2 0 + 117168 = N 1 0 + 117216 = N 0 0 + 117312 = N 3 0 + 117360 = N 1 0 + 117408 = N 0 0 + 117456 = N 1 0 + 117504 = N 2 0 + 117552 = N 3 0 + 117600 = N 2 0 + 117648 = N 3 0 + 117696 = N 2 0 + 117792 = E soloend + 118560 = N 0 0 + 118560 = N 6 0 + 118656 = N 1 0 + 118656 = N 6 0 + 118752 = N 2 0 + 118752 = N 6 0 + 118848 = N 3 0 + 118848 = N 6 0 + 118944 = N 4 0 + 118944 = N 6 0 + 119136 = N 0 336 + 119136 = N 6 0 + 119520 = N 0 384 + 119520 = N 6 0 + 120096 = N 3 144 + 120096 = N 6 0 + 120288 = N 0 144 + 120288 = N 6 0 + 120480 = N 1 144 + 120480 = N 6 0 + 120672 = N 2 0 + 120672 = N 6 0 + 120720 = N 3 0 + 120720 = N 6 0 + 120768 = N 4 0 + 120768 = N 6 0 + 121248 = N 0 0 + 121248 = N 6 0 + 121344 = N 1 0 + 121344 = N 6 0 + 121440 = N 2 528 + 121440 = N 6 0 + 122016 = N 2 0 + 122016 = N 6 0 + 122112 = N 4 0 + 122112 = N 6 0 + 122208 = N 3 624 + 122208 = N 6 0 + 122880 = N 2 0 + 122880 = N 6 0 + 122976 = N 1 864 + 122976 = N 6 0 + 124032 = N 1 0 + 124032 = N 6 0 + 124080 = N 2 0 + 124080 = N 6 0 + 124176 = N 3 0 + 124176 = N 6 0 + 124224 = N 4 0 + 124224 = N 6 0 + 124320 = N 4 144 + 124320 = N 6 0 + 124512 = N 3 144 + 124512 = N 6 0 + 124704 = N 2 0 + 124704 = N 6 0 + 124800 = N 3 192 + 124800 = N 6 0 + 125568 = N 3 0 + 125568 = N 6 0 + 125664 = N 1 0 + 125664 = N 6 0 + 125760 = N 2 0 + 125760 = N 6 0 + 125856 = N 2 144 + 125856 = N 6 0 + 126048 = N 0 240 + 126048 = N 6 0 + 126336 = N 3 0 + 126336 = N 6 0 + 126432 = N 4 0 + 126432 = N 6 0 + 126528 = N 1 0 + 126528 = N 6 0 + 126624 = N 2 0 + 126624 = N 6 0 + 126720 = N 0 0 + 126720 = N 6 0 + 126768 = N 1 0 + 126768 = N 6 0 + 126816 = N 2 0 + 126816 = N 6 0 + 126912 = N 3 0 + 126912 = N 6 0 + 127200 = N 2 0 + 127200 = N 6 0 + 127296 = N 1 0 + 127296 = N 6 0 + 127392 = N 0 0 + 127392 = N 6 0 + 127488 = N 1 0 + 127488 = N 6 0 + 127584 = N 2 0 + 127584 = N 6 0 + 127680 = N 3 0 + 127680 = N 6 0 + 127728 = N 2 0 + 127728 = N 6 0 + 127776 = N 3 0 + 127776 = N 6 0 + 127968 = N 4 0 + 127968 = N 6 0 + 128064 = N 3 0 + 128064 = N 6 0 + 128160 = N 1 0 + 128160 = N 6 0 + 128256 = N 0 0 + 128256 = N 6 0 + 128352 = N 1 336 + 128352 = N 6 0 + 128736 = N 0 0 + 128736 = N 6 0 + 128784 = N 1 0 + 128784 = N 6 0 + 128832 = N 0 0 + 128832 = N 6 0 + 128880 = N 1 0 + 128880 = N 6 0 + 128928 = N 2 0 + 128928 = N 6 0 + 128976 = N 3 0 + 128976 = N 6 0 + 129024 = N 2 0 + 129024 = N 6 0 + 129072 = N 3 0 + 129072 = N 6 0 + 129120 = N 4 0 + 129120 = N 6 0 + 129312 = N 2 0 + 129312 = N 6 0 + 129360 = N 1 0 + 129360 = N 6 0 + 129408 = N 0 0 + 129408 = N 6 0 + 129456 = N 1 0 + 129456 = N 6 0 + 129504 = N 2 0 + 129504 = N 6 0 + 129552 = N 3 0 + 129552 = N 6 0 + 129600 = N 4 0 + 129600 = N 6 0 + 129648 = N 3 0 + 129648 = N 6 0 + 129696 = N 2 0 + 129696 = N 6 0 + 129744 = N 3 0 + 129744 = N 6 0 + 129792 = N 4 0 + 129792 = N 6 0 + 129840 = N 0 0 + 129840 = N 6 0 + 129888 = N 1 0 + 129888 = N 6 0 + 129936 = N 2 0 + 129936 = N 6 0 + 129984 = N 3 432 + 129984 = N 6 0 + 130464 = N 4 288 + 130464 = N 6 0 + 131232 = N 1 0 + 131232 = N 6 0 + 131328 = N 2 0 + 131328 = N 6 0 + 131424 = N 4 240 + 131424 = N 6 0 + 131712 = N 2 0 + 131712 = N 6 0 + 131904 = N 1 0 + 131904 = N 6 0 + 132192 = N 1 0 + 132192 = N 6 0 + 132480 = N 1 0 + 132480 = N 6 0 + 132768 = N 1 0 + 132768 = N 6 0 + 132768 = S 2 1440 + 132864 = N 2 0 + 132864 = N 6 0 + 132960 = N 4 240 + 132960 = N 6 0 + 133248 = N 2 0 + 133248 = N 6 0 + 133440 = N 1 0 + 133440 = N 6 0 + 133728 = N 0 0 + 133728 = N 6 0 + 134016 = N 0 0 + 134016 = N 6 0 + 134304 = N 1 0 + 134304 = N 6 0 + 134400 = N 2 0 + 134400 = N 6 0 + 134496 = N 4 240 + 134496 = N 6 0 + 134784 = N 2 0 + 134784 = N 6 0 + 134976 = N 1 0 + 134976 = N 6 0 + 135264 = N 1 0 + 135264 = N 6 0 + 135552 = N 1 0 + 135552 = N 6 0 + 135840 = N 1 0 + 135840 = N 6 0 + 135936 = N 2 0 + 135936 = N 6 0 + 136032 = N 4 240 + 136032 = N 6 0 + 136320 = N 2 0 + 136320 = N 6 0 + 136512 = N 1 0 + 136512 = N 6 0 + 136800 = N 2 240 + 136800 = N 6 0 + 137088 = N 4 0 + 137088 = N 6 0 + 137280 = N 0 0 + 137280 = N 6 0 + 137568 = N 0 240 + 137568 = N 6 0 + 137856 = N 2 0 + 137856 = N 6 0 + 138048 = N 0 0 + 138048 = N 6 0 + 138336 = N 4 816 + 138336 = N 6 0 + 139200 = N 3 0 + 139200 = N 6 0 + 139296 = N 2 0 + 139296 = N 6 0 + 139488 = N 1 0 + 139488 = N 6 0 + 139680 = N 0 0 + 139680 = N 6 0 + 139872 = N 2 240 + 139872 = N 6 0 + 140160 = N 4 0 + 140160 = N 6 0 + 140352 = N 0 0 + 140352 = N 6 0 + 140640 = N 1 240 + 140640 = N 6 0 + 140928 = N 2 0 + 140928 = N 6 0 + 141120 = N 0 0 + 141120 = N 6 0 + 141408 = N 3 816 + 141408 = N 6 0 + 142272 = N 3 0 + 142272 = N 6 0 + 142368 = N 4 0 + 142368 = N 6 0 + 142560 = N 2 0 + 142560 = N 6 0 + 142752 = N 0 0 + 142752 = N 6 0 + 142944 = N 2 240 + 142944 = N 6 0 + 143232 = N 3 0 + 143232 = N 6 0 + 143424 = N 4 0 + 143424 = N 6 0 + 143712 = N 0 240 + 143712 = N 6 0 + 144000 = N 1 0 + 144000 = N 6 0 + 144192 = N 3 0 + 144192 = N 6 0 + 144480 = N 2 816 + 144480 = N 6 0 + 145344 = N 3 0 + 145344 = N 6 0 + 145440 = N 2 0 + 145440 = N 6 0 + 145632 = N 1 0 + 145632 = N 6 0 + 145824 = N 0 0 + 145824 = N 6 0 + 146016 = N 2 240 + 146016 = N 6 0 + 146016 = S 2 1344 + 146304 = N 3 0 + 146304 = N 6 0 + 146496 = N 4 0 + 146496 = N 6 0 + 146784 = N 0 240 + 146784 = N 6 0 + 147072 = N 1 0 + 147072 = N 6 0 + 147264 = N 3 0 + 147264 = N 6 0 + 147552 = N 2 1440 + 147552 = N 6 0 + 149472 = N 4 0 + 149472 = N 6 0 + 149472 = E solo + 149664 = N 3 0 + 149664 = N 6 0 + 149760 = N 2 0 + 149760 = N 6 0 + 149856 = N 1 0 + 149856 = N 6 0 + 149952 = N 0 144 + 149952 = N 6 0 + 150144 = N 1 0 + 150144 = N 6 0 + 150336 = N 2 0 + 150336 = N 6 0 + 150432 = N 1 0 + 150432 = N 6 0 + 150528 = N 0 0 + 150528 = N 6 0 + 150624 = N 1 0 + 150624 = N 6 0 + 150720 = N 2 0 + 150720 = N 6 0 + 150816 = N 3 0 + 150816 = N 6 0 + 150912 = N 3 0 + 150912 = N 6 0 + 151008 = N 4 0 + 151008 = N 6 0 + 151104 = N 3 0 + 151104 = N 6 0 + 151200 = N 2 0 + 151200 = N 6 0 + 151296 = N 1 0 + 151296 = N 6 0 + 151392 = N 0 144 + 151392 = N 6 0 + 151584 = N 1 288 + 151584 = N 6 0 + 152928 = N 2 0 + 152928 = N 6 0 + 153024 = N 3 0 + 153024 = N 6 0 + 153120 = N 4 0 + 153120 = N 6 0 + 153216 = N 3 0 + 153216 = N 6 0 + 153312 = N 2 0 + 153312 = N 6 0 + 153408 = N 3 0 + 153408 = N 6 0 + 153504 = N 1 0 + 153504 = N 6 0 + 153696 = N 0 240 + 153696 = N 6 0 + 153984 = N 1 0 + 153984 = N 6 0 + 154176 = N 2 0 + 154176 = N 6 0 + 154304 = N 3 0 + 154304 = N 6 0 + 154464 = N 4 144 + 154464 = N 6 0 + 154656 = N 2 0 + 154656 = N 6 0 + 154752 = N 1 0 + 154752 = N 6 0 + 154848 = N 0 240 + 154848 = N 6 0 + 155136 = N 1 0 + 155136 = N 6 0 + 156384 = N 0 0 + 156384 = N 6 0 + 156480 = N 1 0 + 156480 = N 6 0 + 156576 = N 2 0 + 156576 = N 6 0 + 156672 = N 3 0 + 156672 = N 6 0 + 156864 = N 4 912 + 156864 = N 6 0 + 157824 = N 3 0 + 157824 = N 6 0 + 157824 = S 2 1280 + 157920 = N 2 96 + 157920 = N 6 0 + 158064 = N 3 0 + 158064 = N 6 0 + 158112 = N 1 0 + 158112 = N 6 0 + 158208 = N 2 0 + 158208 = N 6 0 + 158304 = N 0 0 + 158304 = N 6 0 + 158400 = N 1 240 + 158400 = N 6 0 + 158688 = N 0 288 + 158688 = N 6 0 + 160320 = N 3 0 + 160320 = N 6 0 + 160416 = N 2 144 + 160416 = N 6 0 + 160608 = N 1 0 + 160608 = N 6 0 + 160704 = N 2 144 + 160704 = N 6 0 + 160896 = N 1 0 + 160896 = N 6 0 + 160992 = N 3 0 + 160992 = N 6 0 + 161088 = N 2 0 + 161088 = N 6 0 + 161184 = N 1 0 + 161184 = N 6 0 + 161232 = N 2 192 + 161232 = N 6 0 + 161472 = N 2 0 + 161472 = N 6 0 + 161568 = N 4 0 + 161568 = N 6 0 + 161664 = N 3 0 + 161664 = N 6 0 + 161760 = N 2 0 + 161760 = N 6 0 + 161856 = N 1 0 + 161856 = N 6 0 + 161952 = N 2 0 + 161952 = N 6 0 + 162048 = N 3 0 + 162048 = N 6 0 + 162144 = N 2 0 + 162144 = N 6 0 + 162240 = N 1 0 + 162240 = N 6 0 + 162336 = N 2 0 + 162336 = N 6 0 + 162432 = N 3 0 + 162432 = N 6 0 + 162528 = N 2 0 + 162528 = N 6 0 + 162624 = N 1 0 + 162624 = N 6 0 + 162720 = N 2 0 + 162720 = N 6 0 + 162816 = N 3 0 + 162816 = N 6 0 + 162912 = N 4 240 + 162912 = N 6 0 + 163200 = N 2 144 + 163200 = N 6 0 + 164448 = N 3 0 + 164448 = N 6 0 + 164544 = N 4 0 + 164544 = N 6 0 + 164640 = N 3 0 + 164640 = N 6 0 + 164736 = N 2 0 + 164736 = N 6 0 + 164832 = N 1 0 + 164832 = N 6 0 + 164928 = N 2 0 + 164928 = N 6 0 + 165024 = N 1 0 + 165024 = N 6 0 + 165120 = N 2 0 + 165120 = N 6 0 + 165216 = N 1 0 + 165216 = N 6 0 + 165312 = N 0 0 + 165312 = N 6 0 + 165408 = N 4 0 + 165408 = N 6 0 + 165504 = N 3 0 + 165504 = N 6 0 + 165600 = N 4 0 + 165600 = N 6 0 + 165696 = N 3 0 + 165696 = N 6 0 + 165792 = N 2 0 + 165792 = N 6 0 + 165888 = N 1 0 + 165888 = N 6 0 + 165984 = N 0 0 + 165984 = N 6 0 + 166080 = N 4 0 + 166080 = N 6 0 + 166176 = N 3 0 + 166176 = N 6 0 + 166368 = N 2 144 + 166368 = N 6 0 + 166560 = N 1 0 + 166560 = N 6 0 + 166656 = N 2 0 + 166656 = N 6 0 + 166752 = N 2 0 + 166752 = N 6 0 + 166848 = N 0 144 + 166848 = N 6 0 + 167040 = N 1 336 + 167040 = N 6 0 + 167424 = N 0 192 + 167424 = N 6 0 + 168960 = N 3 0 + 168960 = N 6 0 + 169056 = N 2 432 + 169056 = N 6 0 + 169536 = N 3 0 + 169536 = N 6 0 + 169632 = N 4 0 + 169632 = N 6 0 + 169728 = N 3 144 + 169728 = N 6 0 + 169920 = N 2 144 + 169920 = N 6 0 + 170112 = N 1 144 + 170112 = N 6 0 + 170304 = N 2 240 + 170304 = N 6 0 + 170592 = N 3 0 + 170592 = N 6 0 + 170688 = N 2 0 + 170688 = N 6 0 + 170736 = N 1 0 + 170736 = N 6 0 + 170784 = N 0 0 + 170784 = N 6 0 + 171360 = N 1 0 + 171360 = N 6 0 + 171456 = N 2 0 + 171456 = N 6 0 + 171552 = N 1 144 + 171552 = N 6 0 + 171744 = N 2 0 + 171744 = N 6 0 + 171840 = N 1 144 + 171840 = N 6 0 + 172032 = N 2 0 + 172032 = N 6 0 + 172128 = N 1 0 + 172128 = N 6 0 + 172224 = N 2 0 + 172224 = N 6 0 + 172320 = N 1 144 + 172320 = N 6 0 + 172512 = N 2 0 + 172512 = N 6 0 + 172608 = N 1 0 + 172608 = N 6 0 + 172800 = N 2 0 + 172800 = N 6 0 + 172896 = N 1 0 + 172896 = N 6 0 + 172944 = N 2 0 + 172944 = N 6 0 + 172992 = N 3 0 + 172992 = N 6 0 + 173040 = N 4 0 + 173040 = N 6 0 + 173088 = N 3 192 + 173088 = N 6 0 + 174048 = N 1 0 + 174048 = N 6 0 + 174144 = N 3 0 + 174144 = N 6 0 + 174240 = N 1 0 + 174240 = N 6 0 + 174336 = N 3 0 + 174336 = N 6 0 + 174432 = N 1 0 + 174432 = N 6 0 + 174528 = N 3 0 + 174528 = N 6 0 + 174624 = N 1 0 + 174624 = N 6 0 + 174720 = N 3 144 + 174720 = N 6 0 + 174912 = N 4 192 + 174912 = N 6 0 + 175776 = N 2 0 + 175776 = N 6 0 + 175872 = N 3 0 + 175872 = N 6 0 + 175968 = N 2 144 + 175968 = N 6 0 + 176160 = N 3 0 + 176160 = N 6 0 + 176256 = N 2 0 + 176256 = N 6 0 + 176304 = N 1 0 + 176304 = N 6 0 + 176352 = N 2 0 + 176352 = N 6 0 + 176400 = N 1 0 + 176400 = N 6 0 + 176448 = N 3 0 + 176448 = N 6 0 + 176544 = N 2 192 + 176544 = N 6 0 + 176832 = E soloend +} +[MediumSingle] +{ + 1536 = N 1 336 + 1536 = N 6 0 + 1920 = N 2 240 + 1920 = N 6 0 + 2208 = N 3 864 + 2208 = N 6 0 + 3264 = N 0 240 + 3264 = N 6 0 + 3552 = N 1 240 + 3552 = N 6 0 + 3840 = N 2 912 + 3840 = N 6 0 + 4800 = N 1 240 + 4800 = N 6 0 + 5088 = N 1 240 + 5088 = N 6 0 + 5376 = N 1 1584 + 5376 = N 6 0 + 7008 = N 0 432 + 7488 = N 1 240 + 7776 = N 2 720 + 8544 = N 0 432 + 9024 = N 1 144 + 9216 = N 2 0 + 9312 = N 3 720 + 10080 = N 0 432 + 10080 = S 2 1152 + 10560 = N 1 240 + 10848 = N 2 720 + 11616 = N 0 432 + 12096 = N 1 144 + 12288 = N 2 0 + 12384 = N 3 720 + 13152 = N 2 144 + 13152 = N 6 0 + 13440 = N 2 0 + 13440 = N 6 0 + 13632 = N 1 144 + 13632 = N 6 0 + 13920 = N 1 240 + 13920 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 14400 = N 1 0 + 14400 = N 6 0 + 14688 = N 2 240 + 14688 = N 6 0 + 14976 = N 2 0 + 14976 = N 6 0 + 15168 = N 1 0 + 15168 = N 6 0 + 15456 = N 0 0 + 15456 = N 6 0 + 15648 = N 1 528 + 15648 = N 6 0 + 16224 = N 2 144 + 16224 = N 6 0 + 16512 = N 2 0 + 16512 = N 6 0 + 16704 = N 1 144 + 16704 = N 6 0 + 16992 = N 1 240 + 16992 = N 6 0 + 17280 = N 0 0 + 17280 = N 6 0 + 17472 = N 1 0 + 17472 = N 6 0 + 17760 = N 2 240 + 17760 = N 6 0 + 18048 = N 2 0 + 18048 = N 6 0 + 18240 = N 1 0 + 18240 = N 6 0 + 18528 = N 0 0 + 18528 = N 6 0 + 18720 = N 1 240 + 18720 = N 6 0 + 19008 = N 1 0 + 19008 = N 6 0 + 19296 = N 3 144 + 19296 = N 6 0 + 19584 = N 3 0 + 19584 = N 6 0 + 19776 = N 2 144 + 19776 = N 6 0 + 20064 = N 2 240 + 20064 = N 6 0 + 20352 = N 1 0 + 20352 = N 6 0 + 20544 = N 2 0 + 20544 = N 6 0 + 20832 = N 3 240 + 20832 = N 6 0 + 21120 = N 3 0 + 21120 = N 6 0 + 21312 = N 2 0 + 21312 = N 6 0 + 21600 = N 1 0 + 21600 = N 6 0 + 21792 = N 1 240 + 21792 = N 6 0 + 22080 = N 1 0 + 22080 = N 6 0 + 22080 = S 2 3072 + 22368 = N 3 144 + 22368 = N 6 0 + 22656 = N 3 0 + 22656 = N 6 0 + 22848 = N 2 144 + 22848 = N 6 0 + 23136 = N 2 240 + 23136 = N 6 0 + 23424 = N 1 0 + 23424 = N 6 0 + 23616 = N 2 0 + 23616 = N 6 0 + 23904 = N 3 240 + 23904 = N 6 0 + 24192 = N 3 0 + 24192 = N 6 0 + 24384 = N 2 0 + 24384 = N 6 0 + 24672 = N 1 0 + 24672 = N 6 0 + 24864 = N 1 528 + 24864 = N 6 0 + 25440 = N 3 240 + 25440 = N 6 0 + 25728 = N 2 0 + 25728 = N 6 0 + 26208 = N 2 240 + 26208 = N 6 0 + 26496 = N 1 0 + 26496 = N 6 0 + 26976 = N 2 144 + 26976 = N 6 0 + 27264 = N 0 0 + 27264 = N 6 0 + 27744 = N 2 240 + 27744 = N 6 0 + 28032 = N 1 0 + 28032 = N 6 0 + 28512 = N 2 240 + 28512 = N 6 0 + 28800 = N 1 0 + 28800 = N 6 0 + 29280 = N 3 240 + 29280 = N 6 0 + 29568 = N 2 576 + 29568 = N 6 0 + 30336 = N 1 0 + 30336 = N 6 0 + 30528 = N 3 0 + 30528 = N 6 0 + 30720 = N 0 0 + 30720 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31104 = N 1 384 + 31104 = N 6 0 + 31584 = N 0 1632 + 31584 = N 6 0 + 33696 = N 1 0 + 33696 = N 6 0 + 33888 = N 3 240 + 33888 = N 6 0 + 34176 = N 2 0 + 34176 = N 6 0 + 34368 = N 1 0 + 34368 = N 6 0 + 34656 = N 0 0 + 34656 = N 6 0 + 34944 = N 0 0 + 34944 = N 6 0 + 35232 = N 1 0 + 35232 = N 6 0 + 35424 = N 3 240 + 35424 = N 6 0 + 35712 = N 2 0 + 35712 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36192 = N 1 0 + 36192 = N 6 0 + 36480 = N 1 0 + 36480 = N 6 0 + 36672 = S 2 960 + 36768 = N 1 0 + 36768 = N 6 0 + 36960 = N 3 240 + 36960 = N 6 0 + 37248 = N 2 0 + 37248 = N 6 0 + 37440 = N 1 0 + 37440 = N 6 0 + 37824 = N 0 240 + 37824 = N 6 0 + 38112 = N 0 336 + 38112 = N 6 0 + 38592 = N 1 144 + 38592 = N 6 0 + 38880 = N 2 768 + 38880 = N 6 0 + 40896 = N 0 240 + 40896 = N 6 0 + 41184 = N 0 336 + 41184 = N 6 0 + 41664 = N 1 144 + 41664 = N 6 0 + 41952 = N 2 240 + 41952 = N 6 0 + 42240 = N 3 1728 + 42240 = N 6 0 + 45504 = N 2 336 + 45888 = N 1 1344 + 45888 = N 5 0 + 48288 = N 3 144 + 48480 = N 0 0 + 49920 = S 2 1536 + 50016 = N 2 240 + 50016 = N 6 0 + 50304 = N 3 0 + 50304 = N 6 0 + 50496 = N 0 0 + 50496 = N 6 0 + 50784 = N 0 240 + 50784 = N 6 0 + 51072 = N 2 0 + 51072 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51552 = N 3 816 + 51552 = N 6 0 + 52416 = N 2 0 + 52416 = N 6 0 + 52704 = N 1 0 + 52704 = N 6 0 + 52896 = N 0 0 + 52896 = N 6 0 + 53088 = N 2 240 + 53088 = N 6 0 + 53376 = N 3 0 + 53376 = N 6 0 + 53568 = N 0 0 + 53568 = N 6 0 + 53856 = N 1 240 + 53856 = N 6 0 + 54144 = N 2 0 + 54144 = N 6 0 + 54336 = N 0 0 + 54336 = N 6 0 + 54624 = N 3 816 + 54624 = N 6 0 + 55488 = N 3 0 + 55488 = N 6 0 + 55776 = N 2 0 + 55776 = N 6 0 + 55968 = N 0 0 + 55968 = N 6 0 + 56160 = N 1 240 + 56160 = N 6 0 + 56448 = N 2 0 + 56448 = N 6 0 + 56640 = N 3 0 + 56640 = N 6 0 + 56928 = N 0 240 + 56928 = N 6 0 + 57216 = N 1 0 + 57216 = N 6 0 + 57408 = N 2 0 + 57408 = N 6 0 + 57696 = N 1 816 + 57696 = N 6 0 + 58560 = N 2 0 + 58560 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 59040 = N 0 0 + 59040 = N 6 0 + 59232 = N 1 240 + 59232 = N 6 0 + 59520 = N 2 0 + 59520 = N 6 0 + 59712 = N 3 0 + 59712 = N 6 0 + 60000 = N 0 240 + 60000 = N 6 0 + 60288 = N 1 0 + 60288 = N 6 0 + 60480 = N 2 0 + 60480 = N 6 0 + 60768 = N 1 816 + 60768 = N 6 0 + 61632 = N 2 0 + 61632 = N 6 0 + 61920 = N 1 0 + 61920 = N 6 0 + 62112 = N 0 0 + 62112 = N 6 0 + 62304 = N 0 816 + 62304 = N 6 0 + 63168 = N 1 144 + 63360 = N 2 0 + 63648 = N 3 1008 + 64704 = N 1 0 + 64704 = S 2 960 + 64896 = N 2 0 + 65088 = N 3 0 + 65376 = N 0 720 + 66144 = N 1 240 + 66432 = N 2 0 + 66720 = N 3 1008 + 67776 = N 1 0 + 67968 = N 2 0 + 68160 = N 3 0 + 68448 = N 0 864 + 74784 = S 2 1536 + 74880 = N 0 0 + 75072 = N 1 0 + 75360 = N 2 240 + 75648 = N 1 0 + 75840 = N 2 0 + 76128 = N 3 528 + 76800 = N 1 0 + 76992 = N 3 0 + 77184 = N 2 0 + 77376 = N 1 0 + 77664 = N 0 144 + 77952 = N 3 0 + 78144 = N 2 0 + 78336 = N 1 0 + 78432 = N 2 240 + 78720 = N 1 0 + 78912 = N 2 0 + 79200 = N 3 528 + 79872 = N 2 0 + 80064 = N 3 0 + 80256 = N 2 0 + 80448 = N 1 0 + 80736 = N 0 144 + 81120 = E solo + 81216 = N 1 0 + 81216 = N 6 0 + 81408 = N 2 0 + 81408 = N 6 0 + 81600 = N 3 240 + 81600 = N 6 0 + 81984 = N 2 288 + 81984 = N 6 0 + 82368 = N 1 0 + 82368 = N 6 0 + 82752 = N 0 336 + 82752 = N 6 0 + 83136 = N 3 0 + 83136 = N 6 0 + 83328 = N 2 0 + 83328 = N 6 0 + 83520 = N 1 0 + 83520 = N 6 0 + 83712 = N 0 0 + 83712 = N 6 0 + 83904 = N 3 0 + 83904 = N 6 0 + 84000 = N 2 0 + 84000 = N 6 0 + 84096 = N 3 0 + 84096 = N 6 0 + 84192 = N 1 0 + 84192 = N 6 0 + 84288 = N 2 0 + 84288 = N 6 0 + 84384 = N 1 0 + 84384 = N 6 0 + 84480 = N 0 0 + 84480 = N 6 0 + 84672 = N 3 0 + 84672 = N 6 0 + 84768 = N 2 0 + 84768 = N 6 0 + 84864 = N 1 0 + 84864 = N 6 0 + 84960 = N 2 0 + 84960 = N 6 0 + 85056 = N 1 0 + 85056 = N 6 0 + 85152 = N 0 0 + 85152 = N 6 0 + 85248 = N 1 0 + 85248 = N 6 0 + 85824 = N 0 0 + 85824 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 86016 = N 2 0 + 86016 = N 6 0 + 86112 = N 3 0 + 86112 = N 6 0 + 86208 = N 2 0 + 86208 = N 6 0 + 86304 = N 1 0 + 86304 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86496 = N 3 0 + 86496 = N 6 0 + 86592 = N 2 0 + 86592 = N 6 0 + 86688 = N 1 0 + 86688 = N 6 0 + 86784 = N 0 0 + 86784 = N 6 0 + 86976 = N 2 0 + 86976 = N 6 0 + 87072 = N 3 0 + 87072 = N 6 0 + 87168 = N 2 0 + 87168 = N 6 0 + 87264 = N 1 0 + 87264 = N 6 0 + 87360 = N 2 0 + 87360 = N 6 0 + 87456 = N 0 0 + 87456 = N 6 0 + 87744 = N 1 0 + 87744 = N 6 0 + 87744 = S 2 768 + 87912 = N 2 176 + 87912 = N 6 0 + 88128 = N 1 0 + 88128 = N 6 0 + 88296 = N 2 168 + 88296 = N 6 0 + 88512 = N 2 144 + 88512 = N 6 0 + 88704 = N 2 192 + 88704 = N 6 0 + 88992 = N 3 0 + 88992 = N 6 0 + 89088 = N 2 0 + 89088 = N 6 0 + 89184 = N 1 0 + 89184 = N 6 0 + 89280 = N 2 0 + 89280 = N 6 0 + 89376 = N 1 0 + 89376 = N 6 0 + 89472 = N 2 0 + 89472 = N 6 0 + 89568 = N 1 0 + 89568 = N 6 0 + 89664 = N 0 0 + 89664 = N 6 0 + 89760 = N 3 0 + 89760 = N 6 0 + 89856 = N 3 0 + 89856 = N 6 0 + 89952 = N 2 0 + 89952 = N 6 0 + 90048 = N 1 0 + 90048 = N 6 0 + 90144 = N 0 0 + 90144 = N 6 0 + 90240 = N 1 0 + 90240 = N 6 0 + 90816 = N 1 0 + 90816 = N 6 0 + 90912 = N 2 0 + 90912 = N 6 0 + 91008 = N 1 0 + 91008 = N 6 0 + 91200 = N 0 0 + 91200 = N 6 0 + 91296 = N 1 0 + 91296 = N 6 0 + 91392 = N 2 0 + 91392 = N 6 0 + 91488 = N 3 0 + 91488 = N 6 0 + 91584 = N 2 0 + 91584 = N 6 0 + 91776 = N 1 0 + 91776 = N 6 0 + 91968 = N 0 0 + 91968 = N 6 0 + 92160 = N 1 0 + 92160 = N 6 0 + 92352 = N 2 0 + 92352 = N 6 0 + 92544 = N 3 0 + 92544 = N 6 0 + 92736 = N 0 0 + 92736 = N 6 0 + 92832 = N 1 0 + 92832 = N 6 0 + 92928 = N 2 0 + 92928 = N 6 0 + 93056 = N 3 688 + 93056 = N 6 0 + 93792 = N 3 240 + 93792 = N 6 0 + 93792 = E soloend + 94080 = N 2 0 + 94080 = N 6 0 + 94560 = N 2 240 + 94560 = N 6 0 + 94848 = N 1 0 + 94848 = N 6 0 + 95328 = N 2 144 + 95328 = N 6 0 + 95616 = N 0 0 + 95616 = N 6 0 + 96096 = N 2 240 + 96096 = N 6 0 + 96384 = N 1 0 + 96384 = N 6 0 + 96864 = N 2 240 + 96864 = N 6 0 + 97152 = N 1 0 + 97152 = N 6 0 + 97632 = N 3 240 + 97632 = N 6 0 + 97920 = N 2 576 + 97920 = N 6 0 + 98688 = N 1 0 + 98688 = N 6 0 + 98880 = N 3 0 + 98880 = N 6 0 + 99072 = N 0 0 + 99072 = N 6 0 + 99264 = N 2 0 + 99264 = N 6 0 + 99456 = N 1 384 + 99456 = N 6 0 + 99936 = N 2 1392 + 99936 = S 2 2304 + 99936 = E solo + 101376 = N 1 0 + 101568 = N 0 0 + 101760 = N 3 0 + 101856 = N 2 720 + 102624 = N 0 432 + 103104 = N 3 336 + 103488 = N 2 144 + 103680 = N 2 0 + 103776 = N 2 0 + 104352 = N 0 0 + 104448 = N 1 0 + 104640 = N 2 0 + 104832 = N 3 0 + 105024 = N 0 0 + 105216 = N 1 0 + 105408 = N 2 0 + 105600 = N 3 0 + 105792 = N 1 0 + 105984 = N 1 0 + 106176 = N 1 0 + 106320 = N 1 0 + 106464 = N 1 0 + 106608 = N 1 0 + 106752 = N 1 0 + 106896 = N 2 0 + 107040 = N 3 192 + 107424 = N 0 0 + 107520 = N 0 0 + 107616 = N 0 0 + 107712 = N 2 144 + 107904 = N 0 0 + 108000 = N 0 0 + 108096 = N 1 0 + 108192 = N 0 0 + 108288 = N 0 0 + 108384 = N 2 0 + 108480 = N 0 0 + 108576 = N 0 0 + 108672 = N 1 192 + 109056 = N 0 0 + 109248 = N 3 0 + 109440 = N 2 0 + 109632 = N 1 0 + 109824 = N 0 0 + 110016 = N 1 0 + 110208 = N 2 0 + 110400 = N 1 0 + 110544 = N 1 0 + 110688 = N 1 0 + 110832 = N 1 0 + 110976 = N 2 0 + 111168 = N 1 0 + 111360 = N 0 352 + 111744 = N 0 720 + 111744 = N 1 720 + 112512 = N 2 0 + 112608 = N 1 0 + 112704 = N 2 0 + 112800 = N 3 144 + 113280 = N 3 0 + 113376 = N 2 0 + 113472 = N 1 0 + 113568 = N 2 0 + 113664 = N 1 0 + 113760 = N 1 0 + 113856 = N 2 0 + 114048 = N 3 0 + 114240 = N 3 0 + 114432 = N 3 0 + 114624 = N 1 0 + 114816 = N 2 0 + 115008 = N 1 0 + 115104 = N 1 0 + 115200 = N 2 0 + 115296 = N 1 0 + 115392 = N 0 0 + 115584 = N 1 0 + 115776 = N 2 0 + 116064 = N 1 0 + 116256 = N 3 352 + 116736 = S 2 1536 + 116928 = N 3 0 + 117024 = N 2 0 + 117120 = N 1 0 + 117216 = N 0 0 + 117312 = N 1 0 + 117408 = N 0 0 + 117504 = N 2 0 + 117600 = N 2 0 + 117696 = N 2 0 + 117792 = E soloend + 118656 = N 1 0 + 118656 = N 6 0 + 118848 = N 2 0 + 118848 = N 6 0 + 119136 = N 0 336 + 119136 = N 6 0 + 119520 = N 0 384 + 119520 = N 6 0 + 120096 = N 3 144 + 120096 = N 6 0 + 120288 = N 0 144 + 120288 = N 6 0 + 120480 = N 1 144 + 120480 = N 6 0 + 120672 = N 2 0 + 120672 = N 6 0 + 120768 = N 3 0 + 120768 = N 6 0 + 121248 = N 0 0 + 121248 = N 6 0 + 121344 = N 1 0 + 121344 = N 6 0 + 121440 = N 2 528 + 121440 = N 6 0 + 122016 = N 1 0 + 122016 = N 6 0 + 122112 = N 3 0 + 122112 = N 6 0 + 122208 = N 2 624 + 122208 = N 6 0 + 122880 = N 1 0 + 122880 = N 6 0 + 122976 = N 0 864 + 122976 = N 6 0 + 124032 = N 1 0 + 124032 = N 6 0 + 124224 = N 3 0 + 124224 = N 6 0 + 124320 = N 3 144 + 124320 = N 6 0 + 124512 = N 2 144 + 124512 = N 6 0 + 124800 = N 2 192 + 124800 = N 6 0 + 125568 = N 2 0 + 125568 = N 6 0 + 125760 = N 1 0 + 125760 = N 6 0 + 126048 = N 0 240 + 126048 = N 6 0 + 126336 = N 3 0 + 126336 = N 6 0 + 126528 = N 2 0 + 126528 = N 6 0 + 126720 = N 1 0 + 126720 = N 6 0 + 126912 = N 3 0 + 126912 = N 6 0 + 127296 = N 0 0 + 127296 = N 6 0 + 127488 = N 1 0 + 127488 = N 6 0 + 127680 = N 2 0 + 127680 = N 6 0 + 127968 = N 3 0 + 127968 = N 6 0 + 128064 = N 2 0 + 128064 = N 6 0 + 128256 = N 0 0 + 128256 = N 6 0 + 128352 = N 1 336 + 128352 = N 6 0 + 128736 = N 2 336 + 128736 = N 6 0 + 129120 = N 3 0 + 129120 = N 6 0 + 129312 = N 1 0 + 129312 = N 6 0 + 129408 = N 0 0 + 129408 = N 6 0 + 129504 = N 1 0 + 129504 = N 6 0 + 129600 = N 2 0 + 129600 = N 6 0 + 129696 = N 1 0 + 129696 = N 6 0 + 129792 = N 2 0 + 129792 = N 6 0 + 129984 = N 2 432 + 129984 = N 6 0 + 130464 = N 3 288 + 130464 = N 6 0 + 131232 = N 1 0 + 131232 = N 6 0 + 131424 = N 3 240 + 131424 = N 6 0 + 131712 = N 2 0 + 131712 = N 6 0 + 131904 = N 1 0 + 131904 = N 6 0 + 132192 = N 1 0 + 132192 = N 6 0 + 132480 = N 1 0 + 132480 = N 6 0 + 132768 = N 1 0 + 132768 = N 6 0 + 132768 = S 2 1440 + 132960 = N 3 240 + 132960 = N 6 0 + 133248 = N 2 0 + 133248 = N 6 0 + 133440 = N 1 0 + 133440 = N 6 0 + 133728 = N 0 0 + 133728 = N 6 0 + 134016 = N 0 0 + 134016 = N 6 0 + 134304 = N 1 0 + 134304 = N 6 0 + 134496 = N 3 240 + 134496 = N 6 0 + 134784 = N 2 0 + 134784 = N 6 0 + 134976 = N 1 0 + 134976 = N 6 0 + 135264 = N 1 0 + 135264 = N 6 0 + 135552 = N 1 0 + 135552 = N 6 0 + 135840 = N 1 0 + 135840 = N 6 0 + 136032 = N 3 240 + 136032 = N 6 0 + 136320 = N 2 0 + 136320 = N 6 0 + 136512 = N 1 0 + 136512 = N 6 0 + 136800 = N 2 240 + 136800 = N 6 0 + 137088 = N 3 0 + 137088 = N 6 0 + 137280 = N 0 0 + 137280 = N 6 0 + 137568 = N 0 240 + 137568 = N 6 0 + 137856 = N 2 0 + 137856 = N 6 0 + 138048 = N 0 0 + 138048 = N 6 0 + 138336 = N 3 816 + 138336 = N 6 0 + 139200 = N 2 0 + 139200 = N 6 0 + 139488 = N 1 0 + 139488 = N 6 0 + 139680 = N 0 0 + 139680 = N 6 0 + 139872 = N 2 240 + 139872 = N 6 0 + 140160 = N 3 0 + 140160 = N 6 0 + 140352 = N 0 0 + 140352 = N 6 0 + 140640 = N 1 240 + 140640 = N 6 0 + 140928 = N 2 0 + 140928 = N 6 0 + 141120 = N 0 0 + 141120 = N 6 0 + 141408 = N 3 816 + 141408 = N 6 0 + 142272 = N 3 0 + 142272 = N 6 0 + 142560 = N 2 0 + 142560 = N 6 0 + 142752 = N 0 0 + 142752 = N 6 0 + 142944 = N 1 240 + 142944 = N 6 0 + 143232 = N 2 0 + 143232 = N 6 0 + 143424 = N 3 0 + 143424 = N 6 0 + 143712 = N 0 240 + 143712 = N 6 0 + 144000 = N 1 0 + 144000 = N 6 0 + 144192 = N 2 0 + 144192 = N 6 0 + 144480 = N 1 816 + 144480 = N 6 0 + 145344 = N 2 0 + 145344 = N 6 0 + 145632 = N 1 0 + 145632 = N 6 0 + 145824 = N 0 0 + 145824 = N 6 0 + 146016 = N 1 240 + 146016 = N 6 0 + 146016 = S 2 1344 + 146304 = N 2 0 + 146304 = N 6 0 + 146496 = N 3 0 + 146496 = N 6 0 + 146784 = N 0 240 + 146784 = N 6 0 + 147072 = N 1 0 + 147072 = N 6 0 + 147264 = N 2 0 + 147264 = N 6 0 + 147552 = N 1 1440 + 147552 = N 6 0 + 149472 = N 3 0 + 149472 = N 6 0 + 149472 = E solo + 149760 = N 2 0 + 149760 = N 6 0 + 149952 = N 1 0 + 149952 = N 6 0 + 150144 = N 2 0 + 150144 = N 6 0 + 150336 = N 1 0 + 150336 = N 6 0 + 150528 = N 0 0 + 150528 = N 6 0 + 150720 = N 1 0 + 150720 = N 6 0 + 150912 = N 2 0 + 150912 = N 6 0 + 151104 = N 1 0 + 151104 = N 6 0 + 151392 = N 0 0 + 151392 = N 6 0 + 151584 = N 1 288 + 151584 = N 6 0 + 153024 = N 3 0 + 153024 = N 6 0 + 153216 = N 2 0 + 153216 = N 6 0 + 153408 = N 1 0 + 153408 = N 6 0 + 153696 = N 0 240 + 153696 = N 6 0 + 153984 = N 1 0 + 153984 = N 6 0 + 154176 = N 2 0 + 154176 = N 6 0 + 154464 = N 3 144 + 154464 = N 6 0 + 154848 = N 0 240 + 154848 = N 6 0 + 155136 = N 1 0 + 155136 = N 6 0 + 156480 = N 1 0 + 156480 = N 6 0 + 156672 = N 2 0 + 156672 = N 6 0 + 156864 = N 3 912 + 156864 = N 6 0 + 157824 = S 2 1280 + 157920 = N 2 0 + 157920 = N 6 0 + 158208 = N 1 0 + 158208 = N 6 0 + 158400 = N 1 240 + 158400 = N 6 0 + 158688 = N 0 288 + 158688 = N 6 0 + 160320 = N 3 336 + 160320 = N 6 0 + 160704 = N 3 240 + 160704 = N 6 0 + 160992 = N 3 144 + 160992 = N 6 0 + 161184 = N 3 240 + 161184 = N 6 0 + 161472 = N 2 0 + 161472 = N 6 0 + 161664 = N 3 0 + 161664 = N 6 0 + 161856 = N 1 0 + 161856 = N 6 0 + 162048 = N 2 0 + 162048 = N 6 0 + 162240 = N 0 0 + 162240 = N 6 0 + 162432 = N 1 0 + 162432 = N 6 0 + 162624 = N 0 0 + 162624 = N 6 0 + 162912 = N 3 240 + 162912 = N 6 0 + 163200 = N 2 144 + 163200 = N 6 0 + 164544 = N 3 0 + 164544 = N 6 0 + 164736 = N 2 0 + 164736 = N 6 0 + 164928 = N 1 0 + 164928 = N 6 0 + 165120 = N 0 0 + 165120 = N 6 0 + 165312 = N 3 0 + 165312 = N 6 0 + 165504 = N 2 0 + 165504 = N 6 0 + 165696 = N 1 0 + 165696 = N 6 0 + 165888 = N 0 0 + 165888 = N 6 0 + 166080 = N 3 0 + 166080 = N 6 0 + 166368 = N 2 144 + 166368 = N 6 0 + 166656 = N 2 0 + 166656 = N 6 0 + 166848 = N 0 144 + 166848 = N 6 0 + 167040 = N 1 336 + 167040 = N 6 0 + 167424 = N 0 192 + 167424 = N 6 0 + 168960 = N 2 528 + 168960 = N 6 0 + 169536 = N 3 336 + 169536 = N 6 0 + 169920 = N 2 144 + 169920 = N 6 0 + 170112 = N 1 144 + 170112 = N 6 0 + 170304 = N 2 240 + 170304 = N 6 0 + 170688 = N 0 0 + 170688 = N 6 0 + 171456 = N 2 0 + 171456 = N 6 0 + 171744 = N 2 0 + 171744 = N 6 0 + 172032 = N 2 0 + 172032 = N 6 0 + 172224 = N 2 0 + 172224 = N 6 0 + 172512 = N 2 0 + 172512 = N 6 0 + 172800 = N 2 0 + 172800 = N 6 0 + 172896 = N 1 0 + 172896 = N 6 0 + 172992 = N 3 288 + 172992 = N 6 0 + 174144 = N 2 0 + 174144 = N 6 0 + 174336 = N 2 0 + 174336 = N 6 0 + 174528 = N 2 0 + 174528 = N 6 0 + 174720 = N 2 144 + 174720 = N 6 0 + 174912 = N 3 192 + 174912 = N 6 0 + 175872 = N 3 240 + 175872 = N 6 0 + 176160 = N 3 240 + 176160 = N 6 0 + 176448 = N 3 336 + 176448 = N 6 0 + 176832 = E soloend +} +[EasySingle] +{ + 1536 = N 0 336 + 1536 = N 6 0 + 1920 = N 1 240 + 1920 = N 6 0 + 2208 = N 2 864 + 2208 = N 6 0 + 3264 = N 0 240 + 3264 = N 6 0 + 3552 = N 1 240 + 3552 = N 6 0 + 3840 = N 2 912 + 3840 = N 6 0 + 4800 = N 1 240 + 4800 = N 6 0 + 5088 = N 1 240 + 5088 = N 6 0 + 5376 = N 1 1584 + 5376 = N 6 0 + 7008 = N 0 432 + 7488 = N 1 240 + 7776 = N 2 720 + 8544 = N 0 432 + 9024 = N 1 144 + 9312 = N 2 720 + 10080 = N 0 432 + 10080 = S 2 1152 + 10560 = N 1 240 + 10848 = N 2 720 + 11616 = N 0 432 + 12096 = N 1 144 + 12384 = N 2 720 + 13152 = N 1 144 + 13152 = N 6 0 + 13440 = N 1 0 + 13440 = N 6 0 + 13632 = N 0 144 + 13632 = N 6 0 + 13920 = N 0 240 + 13920 = N 6 0 + 14400 = N 0 0 + 14400 = N 6 0 + 14688 = N 1 240 + 14688 = N 6 0 + 15168 = N 0 0 + 15168 = N 6 0 + 15648 = N 0 528 + 15648 = N 6 0 + 16224 = N 1 144 + 16224 = N 6 0 + 16512 = N 1 0 + 16512 = N 6 0 + 16704 = N 0 144 + 16704 = N 6 0 + 16992 = N 0 240 + 16992 = N 6 0 + 17472 = N 0 0 + 17472 = N 6 0 + 17760 = N 1 240 + 17760 = N 6 0 + 18240 = N 0 0 + 18240 = N 6 0 + 18720 = N 0 288 + 18720 = N 6 0 + 19296 = N 2 144 + 19296 = N 6 0 + 19584 = N 2 0 + 19584 = N 6 0 + 19776 = N 1 144 + 19776 = N 6 0 + 20064 = N 1 240 + 20064 = N 6 0 + 20544 = N 1 0 + 20544 = N 6 0 + 20832 = N 2 240 + 20832 = N 6 0 + 21312 = N 1 0 + 21312 = N 6 0 + 21792 = N 1 288 + 21792 = N 6 0 + 22080 = S 2 3072 + 22368 = N 2 144 + 22368 = N 6 0 + 22656 = N 2 0 + 22656 = N 6 0 + 22848 = N 1 144 + 22848 = N 6 0 + 23136 = N 1 240 + 23136 = N 6 0 + 23616 = N 1 0 + 23616 = N 6 0 + 23904 = N 2 240 + 23904 = N 6 0 + 24384 = N 1 0 + 24384 = N 6 0 + 24864 = N 0 528 + 24864 = N 6 0 + 25440 = N 2 240 + 25440 = N 6 0 + 25728 = N 1 0 + 25728 = N 6 0 + 26208 = N 1 240 + 26208 = N 6 0 + 26496 = N 0 0 + 26496 = N 6 0 + 26976 = N 1 144 + 26976 = N 6 0 + 27264 = N 0 0 + 27264 = N 6 0 + 27744 = N 1 240 + 27744 = N 6 0 + 28032 = N 0 0 + 28032 = N 6 0 + 28512 = N 1 240 + 28512 = N 6 0 + 28800 = N 0 0 + 28800 = N 6 0 + 29280 = N 2 240 + 29280 = N 6 0 + 29568 = N 1 576 + 29568 = N 6 0 + 30336 = N 1 0 + 30336 = N 6 0 + 30528 = N 2 0 + 30528 = N 6 0 + 30720 = N 0 0 + 30720 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31104 = N 1 384 + 31104 = N 6 0 + 31584 = N 0 1632 + 31584 = N 6 0 + 33888 = N 2 240 + 33888 = N 6 0 + 34368 = N 1 0 + 34368 = N 6 0 + 34656 = N 0 0 + 34656 = N 6 0 + 34944 = N 0 0 + 34944 = N 6 0 + 35424 = N 2 240 + 35424 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36192 = N 1 0 + 36192 = N 6 0 + 36480 = N 1 0 + 36480 = N 6 0 + 36672 = S 2 960 + 36960 = N 2 240 + 36960 = N 6 0 + 37440 = N 1 0 + 37440 = N 6 0 + 37824 = N 0 240 + 37824 = N 6 0 + 38112 = N 0 336 + 38112 = N 6 0 + 38592 = N 1 144 + 38592 = N 6 0 + 38880 = N 2 768 + 38880 = N 6 0 + 40896 = N 0 240 + 40896 = N 6 0 + 41184 = N 0 336 + 41184 = N 6 0 + 41664 = N 1 144 + 41664 = N 6 0 + 41952 = N 2 240 + 41952 = N 6 0 + 42240 = N 2 1728 + 42240 = N 6 0 + 45504 = N 2 336 + 45888 = N 1 1344 + 45888 = N 5 0 + 48288 = N 0 144 + 49920 = S 2 1536 + 50016 = N 1 240 + 50016 = N 6 0 + 50304 = N 2 0 + 50304 = N 6 0 + 50496 = N 0 0 + 50496 = N 6 0 + 50784 = N 0 240 + 50784 = N 6 0 + 51072 = N 1 0 + 51072 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51552 = N 2 816 + 51552 = N 6 0 + 52416 = N 1 0 + 52416 = N 6 0 + 52704 = N 0 0 + 52704 = N 6 0 + 53088 = N 1 240 + 53088 = N 6 0 + 53376 = N 2 0 + 53376 = N 6 0 + 53568 = N 0 0 + 53568 = N 6 0 + 53856 = N 1 240 + 53856 = N 6 0 + 54144 = N 2 0 + 54144 = N 6 0 + 54336 = N 0 0 + 54336 = N 6 0 + 54624 = N 2 816 + 54624 = N 6 0 + 55488 = N 2 0 + 55488 = N 6 0 + 55776 = N 1 0 + 55776 = N 6 0 + 56160 = N 0 240 + 56160 = N 6 0 + 56448 = N 1 0 + 56448 = N 6 0 + 56640 = N 2 0 + 56640 = N 6 0 + 56928 = N 0 240 + 56928 = N 6 0 + 57216 = N 1 0 + 57216 = N 6 0 + 57408 = N 2 0 + 57408 = N 6 0 + 57696 = N 1 816 + 57696 = N 6 0 + 58560 = N 2 0 + 58560 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 59232 = N 0 240 + 59232 = N 6 0 + 59520 = N 1 0 + 59520 = N 6 0 + 59712 = N 2 0 + 59712 = N 6 0 + 60000 = N 0 240 + 60000 = N 6 0 + 60288 = N 1 0 + 60288 = N 6 0 + 60480 = N 2 0 + 60480 = N 6 0 + 60768 = N 1 816 + 60768 = N 6 0 + 61632 = N 2 0 + 61632 = N 6 0 + 61920 = N 1 0 + 61920 = N 6 0 + 62304 = N 0 816 + 62304 = N 6 0 + 63168 = N 0 144 + 63360 = N 1 0 + 63648 = N 2 1008 + 64704 = N 0 0 + 64704 = S 2 960 + 64896 = N 1 0 + 65088 = N 2 0 + 65376 = N 0 720 + 66144 = N 0 240 + 66432 = N 1 0 + 66720 = N 2 1008 + 67776 = N 0 0 + 67968 = N 1 0 + 68160 = N 2 0 + 68448 = N 0 864 + 74784 = S 2 1536 + 75360 = N 0 240 + 75840 = N 2 0 + 76128 = N 1 528 + 76992 = N 2 0 + 77376 = N 1 0 + 77664 = N 0 144 + 78144 = N 2 0 + 78432 = N 0 240 + 78912 = N 2 0 + 79200 = N 1 528 + 80448 = N 1 0 + 80736 = N 0 144 + 81120 = E solo + 81216 = N 0 0 + 81216 = N 6 0 + 81600 = N 2 240 + 81600 = N 6 0 + 81984 = N 1 288 + 81984 = N 6 0 + 82368 = N 1 0 + 82368 = N 6 0 + 82752 = N 0 336 + 82752 = N 6 0 + 83136 = N 2 0 + 83136 = N 6 0 + 83328 = N 2 0 + 83328 = N 6 0 + 83520 = N 1 0 + 83520 = N 6 0 + 83712 = N 1 0 + 83712 = N 6 0 + 83904 = N 2 0 + 83904 = N 6 0 + 84096 = N 2 0 + 84096 = N 6 0 + 84288 = N 1 0 + 84288 = N 6 0 + 84480 = N 1 0 + 84480 = N 6 0 + 84672 = N 0 0 + 84672 = N 6 0 + 84864 = N 0 0 + 84864 = N 6 0 + 85056 = N 1 0 + 85056 = N 6 0 + 85248 = N 0 0 + 85248 = N 6 0 + 85824 = N 0 0 + 85824 = N 6 0 + 86016 = N 1 0 + 86016 = N 6 0 + 86208 = N 1 0 + 86208 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86592 = N 1 0 + 86592 = N 6 0 + 86784 = N 0 0 + 86784 = N 6 0 + 86976 = N 2 0 + 86976 = N 6 0 + 87168 = N 1 0 + 87168 = N 6 0 + 87360 = N 1 0 + 87360 = N 6 0 + 87744 = N 1 0 + 87744 = N 6 0 + 87744 = S 2 768 + 88128 = N 1 0 + 88128 = N 6 0 + 88512 = N 2 144 + 88512 = N 6 0 + 88704 = N 2 192 + 88704 = N 6 0 + 89088 = N 1 0 + 89088 = N 6 0 + 89280 = N 2 0 + 89280 = N 6 0 + 89472 = N 2 0 + 89472 = N 6 0 + 89664 = N 1 0 + 89664 = N 6 0 + 89856 = N 1 0 + 89856 = N 6 0 + 90048 = N 0 0 + 90048 = N 6 0 + 90240 = N 0 0 + 90240 = N 6 0 + 90816 = N 1 0 + 90816 = N 6 0 + 91008 = N 1 0 + 91008 = N 6 0 + 91200 = N 0 0 + 91200 = N 6 0 + 91392 = N 1 0 + 91392 = N 6 0 + 91584 = N 2 0 + 91584 = N 6 0 + 91776 = N 1 0 + 91776 = N 6 0 + 91968 = N 0 0 + 91968 = N 6 0 + 92160 = N 1 0 + 92160 = N 6 0 + 92352 = N 2 0 + 92352 = N 6 0 + 92544 = N 0 0 + 92544 = N 6 0 + 92736 = N 1 0 + 92736 = N 6 0 + 92928 = N 2 816 + 92928 = N 6 0 + 93792 = N 2 240 + 93792 = N 6 0 + 93792 = E soloend + 94080 = N 1 0 + 94080 = N 6 0 + 94560 = N 1 240 + 94560 = N 6 0 + 94848 = N 0 0 + 94848 = N 6 0 + 95328 = N 1 144 + 95328 = N 6 0 + 95616 = N 0 0 + 95616 = N 6 0 + 96096 = N 1 240 + 96096 = N 6 0 + 96384 = N 0 0 + 96384 = N 6 0 + 96864 = N 1 240 + 96864 = N 6 0 + 97152 = N 0 0 + 97152 = N 6 0 + 97632 = N 2 240 + 97632 = N 6 0 + 97920 = N 1 576 + 97920 = N 6 0 + 98688 = N 1 0 + 98688 = N 6 0 + 98880 = N 2 0 + 98880 = N 6 0 + 99072 = N 0 0 + 99072 = N 6 0 + 99264 = N 2 0 + 99264 = N 6 0 + 99456 = N 1 384 + 99456 = N 6 0 + 99936 = N 0 1392 + 99936 = S 2 2304 + 99936 = E solo + 101376 = N 1 0 + 101568 = N 0 0 + 101856 = N 2 720 + 102624 = N 0 432 + 103104 = N 2 336 + 103488 = N 1 144 + 104448 = N 0 0 + 104640 = N 0 0 + 104832 = N 0 0 + 105024 = N 1 0 + 105216 = N 1 0 + 105408 = N 2 0 + 105600 = N 2 0 + 105792 = N 1 0 + 105984 = N 1 0 + 106176 = N 1 0 + 106464 = N 1 0 + 106752 = N 1 0 + 107040 = N 2 192 + 107712 = N 1 144 + 108096 = N 0 0 + 108384 = N 1 0 + 108672 = N 0 192 + 109440 = N 1 0 + 109632 = N 0 0 + 110016 = N 1 0 + 110400 = N 0 0 + 110688 = N 0 0 + 110976 = N 1 0 + 111168 = N 0 0 + 111456 = N 0 256 + 111744 = N 0 720 + 112512 = N 1 0 + 112800 = N 2 144 + 113280 = N 2 0 + 113472 = N 1 0 + 113664 = N 0 0 + 113856 = N 1 0 + 114048 = N 2 0 + 114240 = N 2 0 + 114432 = N 2 0 + 114624 = N 1 0 + 114816 = N 2 0 + 115008 = N 1 0 + 115200 = N 2 0 + 115392 = N 0 0 + 115584 = N 1 0 + 115776 = N 2 0 + 116064 = N 1 0 + 116736 = S 2 1536 + 116928 = N 2 0 + 117120 = N 1 0 + 117312 = N 0 0 + 117504 = N 1 0 + 117696 = N 1 0 + 117792 = E soloend + 118656 = N 1 0 + 118656 = N 6 0 + 118848 = N 2 0 + 118848 = N 6 0 + 119136 = N 0 336 + 119136 = N 6 0 + 119520 = N 0 384 + 119520 = N 6 0 + 120096 = N 2 144 + 120096 = N 6 0 + 120288 = N 0 144 + 120288 = N 6 0 + 120480 = N 1 144 + 120480 = N 6 0 + 120768 = N 2 0 + 120768 = N 6 0 + 121248 = N 0 0 + 121248 = N 6 0 + 121440 = N 1 528 + 121440 = N 6 0 + 122016 = N 1 0 + 122016 = N 6 0 + 122208 = N 2 624 + 122208 = N 6 0 + 122976 = N 0 864 + 122976 = N 6 0 + 124032 = N 1 0 + 124032 = N 6 0 + 124224 = N 2 0 + 124224 = N 6 0 + 124512 = N 1 144 + 124512 = N 6 0 + 124800 = N 1 192 + 124800 = N 6 0 + 125568 = N 2 0 + 125568 = N 6 0 + 125760 = N 1 0 + 125760 = N 6 0 + 126048 = N 0 240 + 126048 = N 6 0 + 126336 = N 2 0 + 126336 = N 6 0 + 126528 = N 1 0 + 126528 = N 6 0 + 126720 = N 0 0 + 126720 = N 6 0 + 126912 = N 2 0 + 126912 = N 6 0 + 127296 = N 0 0 + 127296 = N 6 0 + 127488 = N 1 0 + 127488 = N 6 0 + 127680 = N 2 0 + 127680 = N 6 0 + 128064 = N 1 0 + 128064 = N 6 0 + 128352 = N 0 336 + 128352 = N 6 0 + 128736 = N 1 336 + 128736 = N 6 0 + 129408 = N 0 0 + 129408 = N 6 0 + 129600 = N 0 0 + 129600 = N 6 0 + 129792 = N 1 0 + 129792 = N 6 0 + 129984 = N 1 432 + 129984 = N 6 0 + 130464 = N 2 288 + 130464 = N 6 0 + 131232 = N 1 0 + 131232 = N 6 0 + 131424 = N 2 240 + 131424 = N 6 0 + 131904 = N 1 0 + 131904 = N 6 0 + 132192 = N 1 0 + 132192 = N 6 0 + 132480 = N 1 0 + 132480 = N 6 0 + 132768 = N 1 0 + 132768 = N 6 0 + 132768 = S 2 1440 + 132960 = N 2 240 + 132960 = N 6 0 + 133440 = N 1 0 + 133440 = N 6 0 + 133728 = N 0 0 + 133728 = N 6 0 + 134016 = N 0 0 + 134016 = N 6 0 + 134304 = N 1 0 + 134304 = N 6 0 + 134496 = N 2 240 + 134496 = N 6 0 + 134976 = N 1 0 + 134976 = N 6 0 + 135264 = N 1 0 + 135264 = N 6 0 + 135552 = N 1 0 + 135552 = N 6 0 + 135840 = N 1 0 + 135840 = N 6 0 + 136032 = N 2 240 + 136032 = N 6 0 + 136512 = N 1 0 + 136512 = N 6 0 + 136800 = N 1 240 + 136800 = N 6 0 + 137088 = N 2 0 + 137088 = N 6 0 + 137280 = N 0 0 + 137280 = N 6 0 + 137568 = N 0 240 + 137568 = N 6 0 + 137856 = N 1 0 + 137856 = N 6 0 + 138048 = N 0 0 + 138048 = N 6 0 + 138336 = N 2 816 + 138336 = N 6 0 + 139200 = N 1 0 + 139200 = N 6 0 + 139488 = N 0 0 + 139488 = N 6 0 + 139872 = N 1 240 + 139872 = N 6 0 + 140160 = N 2 0 + 140160 = N 6 0 + 140352 = N 0 0 + 140352 = N 6 0 + 140640 = N 1 240 + 140640 = N 6 0 + 140928 = N 2 0 + 140928 = N 6 0 + 141120 = N 0 0 + 141120 = N 6 0 + 141408 = N 2 816 + 141408 = N 6 0 + 142272 = N 2 0 + 142272 = N 6 0 + 142560 = N 1 0 + 142560 = N 6 0 + 142944 = N 0 240 + 142944 = N 6 0 + 143232 = N 1 0 + 143232 = N 6 0 + 143424 = N 2 0 + 143424 = N 6 0 + 143712 = N 0 240 + 143712 = N 6 0 + 144000 = N 1 0 + 144000 = N 6 0 + 144192 = N 2 0 + 144192 = N 6 0 + 144480 = N 1 816 + 144480 = N 6 0 + 145344 = N 2 0 + 145344 = N 6 0 + 145632 = N 1 0 + 145632 = N 6 0 + 146016 = N 0 240 + 146016 = N 6 0 + 146016 = S 2 1344 + 146304 = N 1 0 + 146304 = N 6 0 + 146496 = N 2 0 + 146496 = N 6 0 + 146784 = N 0 240 + 146784 = N 6 0 + 147072 = N 1 0 + 147072 = N 6 0 + 147264 = N 2 0 + 147264 = N 6 0 + 147552 = N 1 1440 + 147552 = N 6 0 + 149472 = N 2 0 + 149472 = N 6 0 + 149472 = E solo + 149760 = N 1 0 + 149760 = N 6 0 + 149952 = N 0 0 + 149952 = N 6 0 + 150144 = N 1 0 + 150144 = N 5 0 + 150144 = N 6 0 + 150336 = N 1 0 + 150336 = N 6 0 + 150528 = N 0 0 + 150528 = N 6 0 + 150720 = N 1 0 + 150720 = N 6 0 + 150912 = N 2 0 + 150912 = N 5 0 + 150912 = N 6 0 + 151104 = N 1 0 + 151104 = N 6 0 + 151392 = N 0 0 + 151392 = N 6 0 + 151584 = N 1 288 + 151584 = N 6 0 + 152928 = N 2 0 + 152928 = N 5 0 + 152928 = N 6 0 + 153216 = N 1 0 + 153216 = N 5 0 + 153216 = N 6 0 + 153408 = N 1 0 + 153408 = N 6 0 + 153696 = N 0 240 + 153696 = N 6 0 + 153984 = N 1 0 + 153984 = N 5 0 + 153984 = N 6 0 + 154176 = N 1 0 + 154176 = N 6 0 + 154464 = N 2 144 + 154464 = N 6 0 + 154848 = N 0 240 + 154848 = N 6 0 + 155136 = N 1 0 + 155136 = N 6 0 + 156480 = N 0 0 + 156480 = N 6 0 + 156672 = N 1 0 + 156672 = N 6 0 + 156864 = N 2 912 + 156864 = N 6 0 + 157824 = S 2 1280 + 157920 = N 1 0 + 157920 = N 6 0 + 158208 = N 2 0 + 158208 = N 6 0 + 158400 = N 1 240 + 158400 = N 6 0 + 158688 = N 0 288 + 158688 = N 6 0 + 160320 = N 2 336 + 160320 = N 6 0 + 160704 = N 2 240 + 160704 = N 6 0 + 160992 = N 2 144 + 160992 = N 6 0 + 161184 = N 2 240 + 161184 = N 6 0 + 161472 = N 2 0 + 161472 = N 6 0 + 161664 = N 2 0 + 161664 = N 6 0 + 161856 = N 1 0 + 161856 = N 6 0 + 162048 = N 2 0 + 162048 = N 6 0 + 162240 = N 0 0 + 162240 = N 6 0 + 162432 = N 1 0 + 162432 = N 6 0 + 162624 = N 0 0 + 162624 = N 6 0 + 162912 = N 2 240 + 162912 = N 6 0 + 163200 = N 1 144 + 163200 = N 6 0 + 164544 = N 2 0 + 164544 = N 6 0 + 164736 = N 1 0 + 164736 = N 6 0 + 164928 = N 1 0 + 164928 = N 6 0 + 165120 = N 0 0 + 165120 = N 6 0 + 165312 = N 2 0 + 165312 = N 6 0 + 165504 = N 1 0 + 165504 = N 6 0 + 165696 = N 1 0 + 165696 = N 6 0 + 165888 = N 0 0 + 165888 = N 6 0 + 166080 = N 2 0 + 166080 = N 6 0 + 166368 = N 1 144 + 166368 = N 6 0 + 166848 = N 0 144 + 166848 = N 6 0 + 167040 = N 1 336 + 167040 = N 6 0 + 167424 = N 0 192 + 167424 = N 6 0 + 168960 = N 1 528 + 168960 = N 6 0 + 169536 = N 2 336 + 169536 = N 6 0 + 169920 = N 1 144 + 169920 = N 6 0 + 170304 = N 0 240 + 170304 = N 6 0 + 170688 = N 0 0 + 170688 = N 6 0 + 171456 = N 1 0 + 171456 = N 6 0 + 171744 = N 1 0 + 171744 = N 6 0 + 172032 = N 1 0 + 172032 = N 6 0 + 172224 = N 1 0 + 172224 = N 6 0 + 172512 = N 1 0 + 172512 = N 6 0 + 172800 = N 1 0 + 172800 = N 6 0 + 172992 = N 2 0 + 172992 = N 6 0 + 174144 = N 1 0 + 174144 = N 6 0 + 174336 = N 1 0 + 174336 = N 6 0 + 174528 = N 1 0 + 174528 = N 6 0 + 174720 = N 1 144 + 174720 = N 6 0 + 174912 = N 2 192 + 174912 = N 6 0 + 175872 = N 2 240 + 175872 = N 6 0 + 176160 = N 2 240 + 176160 = N 6 0 + 176448 = N 2 336 + 176448 = N 6 0 + 176832 = E soloend +} diff --git a/songs/Maynard-Ferguson-Country-Road-(James-Taylor-Cover)/notes.chart b/songs/Maynard-Ferguson-Country-Road-(James-Taylor-Cover)/notes.chart new file mode 100644 index 0000000..43a2288 --- /dev/null +++ b/songs/Maynard-Ferguson-Country-Road-(James-Taylor-Cover)/notes.chart @@ -0,0 +1,5010 @@ +[Song] +{ + Name = "Country Road" + Artist = "Maynard Ferguson" + Charter = "GuitarZero132" + Album = "M.F. Horn Two" + Year = ", 1972" + Offset = 0 + Resolution = 192 + Player2 = bass + Difficulty = 0 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "Jazz Fusion" + MediaType = "cd" + MusicStream = "song.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 80000 + 768 = B 77000 + 1152 = B 84000 + 2112 = B 85000 + 3456 = B 84000 + 4032 = B 89000 + 4224 = B 80000 + 4416 = B 87000 + 4608 = B 84000 + 4800 = B 83000 + 5952 = B 82000 + 6528 = B 81000 + 7104 = B 79000 + 7488 = B 81000 + 8064 = B 87000 + 8448 = B 76000 + 8640 = B 85000 + 8832 = B 84000 + 9216 = B 82000 + 9600 = B 80000 + 9984 = B 80000 + 10368 = B 85000 + 10752 = B 81000 + 11136 = B 82000 + 11520 = B 81000 + 11904 = B 85000 + 12288 = B 83000 + 12672 = B 77000 + 12864 = B 88000 + 13056 = B 79000 + 13440 = B 83000 + 13824 = B 79000 + 14016 = B 81000 + 14208 = B 83000 + 14400 = B 93000 + 14592 = B 81000 + 14976 = B 85000 + 15744 = B 87000 + 16128 = B 79000 + 16320 = B 84000 + 16704 = B 85000 + 17088 = B 85000 + 17280 = B 89000 + 17664 = B 85000 + 18432 = B 86000 + 19008 = B 85000 + 19392 = B 86000 + 19776 = B 87000 + 20160 = B 88000 + 20544 = B 86000 + 20928 = B 84000 + 21312 = B 88000 + 21696 = B 86000 + 22848 = B 83000 + 23232 = B 84000 + 24768 = B 86000 + 24960 = B 88000 + 25344 = B 82000 + 25536 = B 86000 + 26304 = B 88000 + 26880 = B 86000 + 27264 = B 85000 + 28416 = B 84000 + 28992 = B 86000 + 29376 = B 85000 + 31488 = B 83000 + 31680 = B 86000 + 33600 = B 84000 + 33984 = B 86000 + 35328 = B 83000 + 35520 = B 85000 + 36096 = B 87000 + 36864 = B 85000 + 37056 = B 86000 + 37440 = B 88000 + 37632 = B 87000 + 38208 = B 85000 + 38400 = B 88000 + 38592 = B 86000 + 38976 = B 89000 + 39168 = B 87000 + 39936 = B 87000 + 41472 = B 87000 + 43008 = B 87000 + 43584 = B 83000 + 43968 = B 86000 + 45120 = B 86000 + 46080 = B 88000 + 47040 = B 91000 + 47424 = B 88000 + 47616 = B 86000 + 48192 = B 85000 + 48576 = B 83000 + 49152 = B 84000 + 49920 = B 90000 + 50112 = B 88000 + 50880 = B 86000 + 51456 = B 88000 + 51840 = B 95000 + 52224 = B 91000 + 52800 = B 81000 + 52992 = B 84000 + 53184 = B 86000 + 54720 = B 87000 + 55296 = B 85000 + 56256 = B 88000 + 57024 = B 89000 + 57408 = B 86000 + 57792 = B 87000 + 58368 = B 88000 + 59136 = B 87000 + 59520 = B 81000 + 59712 = B 84000 + 60096 = B 87000 + 60864 = B 89000 + 61440 = B 88000 + 61824 = B 89000 + 62400 = B 87000 + 64320 = B 85000 + 65088 = B 88000 + 65280 = B 87000 + 66048 = B 88000 + 66816 = B 86000 + 67584 = B 87000 + 68160 = B 86000 + 69120 = B 85000 + 69504 = B 78000 + 69696 = B 77000 + 69888 = B 75000 + 70080 = B 71000 + 70272 = B 77000 + 70848 = B 85000 + 71040 = B 85000 + 71424 = B 74000 + 71808 = B 75000 + 72192 = B 50000 + 72384 = B 52000 + 72576 = B 48000 + 72768 = B 55000 + 72960 = B 56000 + 73152 = B 49000 + 73344 = B 58000 + 73536 = B 46000 + 73728 = B 50000 +} +[Events] +{ + 768 = E "section Intro Solo A" + 3840 = E "section Intro Solo B" + 6912 = E "section Intro Solo C" + 9984 = E "section Keyboard Lead 1" + 13056 = E "section Verse 1A" + 16128 = E "section Verse 1B" + 19200 = E "section Keyboard Lead 2" + 22272 = E "section Verse 2A" + 25344 = E "section Verse 2B" + 28416 = E "section Keyboard Lead 3" + 31488 = E "section Chorus 1" + 36864 = E "section Trumpet Solo A" + 39936 = E "section Trumpet Solo B" + 43008 = E "section Solo Ending" + 46080 = E "section Bridge 1" + 49920 = E "section Bass Solo" + 52992 = E "section Saxophone Lead" + 56064 = E "section Bridge 2" + 58368 = E "section Band Harmony 1" + 60672 = E "section Bridge 3" + 62976 = E "section Band Harmony 2" + 65280 = E "section Chorus 2" + 71424 = E "section Ending" +} +[ExpertSingle] +{ + 928 = N 1 0 + 928 = N 6 0 + 928 = E solo + 960 = N 3 0 + 960 = N 4 0 + 960 = N 6 0 + 1024 = N 1 0 + 1024 = N 6 0 + 1056 = N 2 0 + 1056 = N 3 0 + 1056 = N 6 0 + 1088 = N 4 0 + 1088 = N 6 0 + 1152 = N 1 0 + 1152 = N 3 0 + 1152 = N 6 0 + 1216 = N 0 0 + 1216 = N 6 0 + 1248 = N 1 72 + 1248 = N 6 0 + 1344 = N 4 0 + 1344 = N 6 0 + 1368 = N 3 0 + 1368 = N 6 0 + 1392 = N 2 0 + 1392 = N 6 0 + 1416 = N 3 0 + 1416 = N 6 0 + 1440 = N 2 0 + 1440 = N 6 0 + 1472 = N 1 0 + 1472 = N 6 0 + 1504 = N 2 0 + 1504 = N 6 0 + 1536 = N 0 168 + 1536 = N 6 0 + 1728 = N 0 0 + 1728 = N 3 0 + 1728 = N 6 0 + 1824 = N 0 0 + 1824 = N 2 456 + 1824 = N 6 0 + 1856 = N 1 424 + 1856 = N 6 0 + 2368 = N 1 0 + 2368 = N 6 0 + 2432 = N 2 0 + 2432 = N 6 0 + 2464 = N 3 0 + 2464 = N 6 0 + 2496 = N 3 0 + 2496 = N 4 0 + 2496 = N 6 0 + 2592 = N 2 0 + 2592 = N 3 0 + 2592 = N 6 0 + 2656 = N 1 0 + 2656 = N 3 0 + 2656 = N 6 0 + 2688 = N 2 0 + 2688 = N 6 0 + 2712 = N 3 0 + 2712 = N 6 0 + 2736 = N 2 0 + 2736 = N 6 0 + 2760 = N 1 0 + 2760 = N 6 0 + 2784 = N 3 0 + 2784 = N 6 0 + 2808 = N 4 0 + 2808 = N 6 0 + 2832 = N 3 0 + 2832 = N 6 0 + 2856 = N 2 0 + 2856 = N 6 0 + 2880 = N 3 0 + 2880 = N 6 0 + 2904 = N 2 0 + 2904 = N 6 0 + 2928 = N 1 0 + 2928 = N 6 0 + 2952 = N 0 0 + 2952 = N 6 0 + 2976 = N 3 0 + 2976 = N 6 0 + 3000 = N 2 0 + 3000 = N 6 0 + 3024 = N 1 0 + 3024 = N 6 0 + 3048 = N 0 197 + 3048 = N 6 0 + 3264 = N 0 0 + 3264 = N 3 0 + 3264 = N 6 0 + 3360 = N 0 0 + 3360 = N 2 456 + 3360 = N 6 0 + 3392 = N 1 424 + 3392 = N 6 0 + 3840 = S 2 1152 + 3888 = N 4 77 + 3888 = N 6 0 + 3984 = N 2 0 + 3984 = N 6 0 + 4008 = N 1 0 + 4008 = N 6 0 + 4032 = N 3 120 + 4032 = N 6 0 + 4176 = N 1 0 + 4176 = N 6 0 + 4200 = N 0 0 + 4200 = N 6 0 + 4224 = N 2 120 + 4224 = N 6 0 + 4368 = N 1 0 + 4368 = N 6 0 + 4392 = N 0 0 + 4392 = N 6 0 + 4416 = N 4 0 + 4416 = N 6 0 + 4448 = N 3 0 + 4448 = N 6 0 + 4480 = N 1 0 + 4480 = N 6 0 + 4512 = N 3 0 + 4512 = N 6 0 + 4536 = N 2 0 + 4536 = N 6 0 + 4560 = N 1 0 + 4560 = N 6 0 + 4608 = N 0 168 + 4608 = N 6 0 + 4800 = N 0 0 + 4800 = N 3 0 + 4800 = N 6 0 + 4896 = N 0 0 + 4896 = N 2 408 + 4896 = N 6 0 + 4928 = N 1 376 + 4928 = N 6 0 + 5344 = N 2 0 + 5344 = N 6 0 + 5376 = N 2 168 + 5376 = N 4 168 + 5376 = N 6 0 + 5568 = N 3 0 + 5568 = N 6 0 + 5632 = N 2 0 + 5632 = N 6 0 + 5728 = N 2 104 + 5728 = N 4 104 + 5728 = N 6 0 + 5856 = N 1 0 + 5856 = N 3 0 + 5856 = N 6 0 + 5872 = N 2 0 + 5872 = N 3 0 + 5872 = N 6 0 + 5920 = N 1 200 + 5920 = N 2 200 + 5920 = N 6 0 + 6144 = N 0 192 + 6144 = N 3 192 + 6144 = N 6 0 + 6432 = N 0 0 + 6432 = N 2 480 + 6432 = N 6 0 + 6464 = N 1 448 + 6464 = N 6 0 + 7072 = N 2 0 + 7072 = N 6 0 + 7104 = N 2 0 + 7104 = N 4 0 + 7104 = N 6 0 + 7168 = N 2 0 + 7168 = N 6 0 + 7248 = N 4 0 + 7248 = N 6 0 + 7264 = N 3 0 + 7264 = N 6 0 + 7280 = N 2 0 + 7280 = N 6 0 + 7296 = N 1 0 + 7296 = N 6 0 + 7392 = N 0 0 + 7392 = N 1 0 + 7392 = N 6 0 + 7536 = N 0 0 + 7536 = N 6 0 + 7584 = N 1 0 + 7584 = N 6 0 + 7632 = N 2 126 + 7632 = N 6 0 + 7776 = N 0 0 + 7776 = N 6 0 + 7872 = N 3 0 + 7872 = N 6 0 + 7968 = N 0 0 + 7968 = N 2 317 + 7968 = N 6 0 + 8000 = N 1 285 + 8000 = N 6 0 + 8304 = N 0 93 + 8304 = N 6 0 + 8416 = N 2 0 + 8416 = N 6 0 + 8448 = N 3 127 + 8448 = N 4 127 + 8448 = N 6 0 + 8592 = N 4 0 + 8592 = N 6 0 + 8616 = N 2 0 + 8616 = N 6 0 + 8640 = N 3 0 + 8640 = N 6 0 + 8688 = N 1 0 + 8688 = N 6 0 + 8784 = N 1 0 + 8784 = N 3 96 + 8784 = N 6 0 + 8808 = N 2 72 + 8808 = N 6 0 + 8896 = N 1 0 + 8896 = N 6 0 + 8928 = N 2 0 + 8928 = N 4 0 + 8928 = N 6 0 + 9024 = N 1 0 + 9024 = N 3 0 + 9024 = N 6 0 + 9048 = N 2 0 + 9048 = N 3 0 + 9048 = N 6 0 + 9120 = N 1 0 + 9120 = N 6 0 + 9216 = N 0 168 + 9216 = N 1 168 + 9216 = N 6 0 + 9408 = N 1 0 + 9408 = N 2 0 + 9408 = N 6 0 + 9504 = N 0 0 + 9504 = N 2 456 + 9504 = N 6 0 + 9528 = N 1 432 + 9528 = N 6 0 + 9888 = E soloend + 9984 = N 1 360 + 9984 = N 2 0 + 9984 = N 6 0 + 10032 = N 3 312 + 10032 = N 6 0 + 10368 = N 4 0 + 10368 = N 6 0 + 10416 = N 3 0 + 10416 = N 6 0 + 10464 = N 2 0 + 10464 = N 6 0 + 10512 = N 1 0 + 10512 = N 6 0 + 10560 = N 2 0 + 10560 = N 6 0 + 10608 = N 1 120 + 10608 = N 3 120 + 10608 = N 6 0 + 10752 = N 0 0 + 10752 = N 2 0 + 10752 = N 6 0 + 10800 = N 0 120 + 10800 = N 2 120 + 10800 = N 6 0 + 10944 = N 0 0 + 10944 = N 6 0 + 11040 = N 2 168 + 11040 = N 4 168 + 11040 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 11280 = N 1 0 + 11280 = N 6 0 + 11328 = N 2 0 + 11328 = N 6 0 + 11376 = N 1 0 + 11376 = N 6 0 + 11424 = N 2 0 + 11424 = N 6 0 + 11472 = N 0 0 + 11472 = N 6 0 + 11520 = N 1 318 + 11520 = N 2 0 + 11520 = N 6 0 + 11520 = S 2 1536 + 11568 = N 3 270 + 11568 = N 6 0 + 11856 = N 0 0 + 11856 = N 6 0 + 11904 = N 4 0 + 11904 = N 6 0 + 11952 = N 3 0 + 11952 = N 6 0 + 12000 = N 2 0 + 12000 = N 6 0 + 12048 = N 1 0 + 12048 = N 6 0 + 12096 = N 2 0 + 12096 = N 6 0 + 12144 = N 1 120 + 12144 = N 3 120 + 12144 = N 6 0 + 12288 = N 0 0 + 12288 = N 2 0 + 12288 = N 6 0 + 12336 = N 0 72 + 12336 = N 2 72 + 12336 = N 6 0 + 12432 = N 0 0 + 12432 = N 6 0 + 12480 = N 4 0 + 12480 = N 6 0 + 12576 = N 1 480 + 12576 = N 3 480 + 12576 = N 6 0 + 13152 = N 2 0 + 13152 = N 6 0 + 13216 = N 3 0 + 13216 = N 6 0 + 13312 = N 3 0 + 13312 = N 6 0 + 13392 = N 2 0 + 13392 = N 6 0 + 13440 = N 4 0 + 13440 = N 6 0 + 13536 = N 3 0 + 13536 = N 6 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13728 = N 2 0 + 13728 = N 6 0 + 13824 = N 2 0 + 13824 = N 6 0 + 13920 = N 1 0 + 13920 = N 6 0 + 13984 = N 0 0 + 13984 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14112 = N 0 384 + 14112 = N 6 0 + 14688 = N 2 0 + 14688 = N 6 0 + 14752 = N 3 72 + 14752 = N 6 0 + 14848 = N 2 0 + 14848 = N 6 0 + 14880 = N 4 0 + 14880 = N 6 0 + 14976 = N 3 168 + 14976 = N 6 0 + 15168 = N 2 0 + 15168 = N 6 0 + 15232 = N 3 0 + 15232 = N 6 0 + 15264 = N 2 0 + 15264 = N 6 0 + 15360 = N 2 136 + 15360 = N 6 0 + 15520 = N 1 136 + 15520 = N 6 0 + 15680 = N 0 256 + 15680 = N 6 0 + 16128 = N 2 0 + 16128 = N 6 0 + 16192 = N 3 0 + 16192 = N 6 0 + 16224 = N 3 0 + 16224 = N 6 0 + 16288 = N 3 0 + 16288 = N 6 0 + 16384 = N 2 0 + 16384 = N 6 0 + 16416 = N 4 136 + 16416 = N 6 0 + 16576 = N 3 104 + 16576 = N 6 0 + 16704 = N 2 0 + 16704 = N 6 0 + 16768 = N 0 0 + 16768 = N 6 0 + 16800 = N 1 0 + 16800 = N 6 0 + 16896 = N 2 0 + 16896 = N 6 0 + 16960 = N 3 0 + 16960 = N 6 0 + 16992 = N 3 0 + 16992 = N 6 0 + 17088 = N 3 0 + 17088 = N 6 0 + 17152 = N 4 0 + 17152 = N 6 0 + 17184 = N 3 224 + 17184 = N 6 0 + 17632 = N 0 0 + 17632 = N 6 0 + 17664 = N 1 0 + 17664 = N 6 0 + 17728 = N 2 0 + 17728 = N 6 0 + 17760 = N 2 0 + 17760 = N 6 0 + 17824 = N 2 0 + 17824 = N 6 0 + 17920 = N 1 0 + 17920 = N 6 0 + 18016 = N 1 0 + 18016 = N 6 0 + 18048 = N 2 0 + 18048 = N 6 0 + 18112 = N 1 0 + 18112 = N 6 0 + 18144 = N 2 0 + 18144 = N 6 0 + 18240 = N 2 0 + 18240 = N 6 0 + 18304 = N 1 0 + 18304 = N 6 0 + 18336 = N 2 0 + 18336 = N 6 0 + 18400 = N 2 0 + 18400 = N 6 0 + 18432 = N 3 0 + 18432 = N 6 0 + 18528 = N 4 0 + 18528 = N 6 0 + 18624 = N 3 0 + 18624 = N 6 0 + 18720 = N 4 0 + 18720 = N 6 0 + 18784 = N 2 104 + 18784 = N 6 0 + 18912 = N 1 0 + 18912 = N 6 0 + 18976 = N 0 0 + 18976 = N 6 0 + 19008 = N 1 0 + 19008 = N 6 0 + 19072 = N 0 0 + 19072 = N 6 0 + 19104 = N 1 456 + 19104 = N 6 0 + 19584 = N 4 0 + 19584 = N 6 0 + 19632 = N 3 0 + 19632 = N 6 0 + 19680 = N 2 0 + 19680 = N 6 0 + 19728 = N 1 0 + 19728 = N 6 0 + 19776 = N 2 0 + 19776 = N 6 0 + 19824 = N 1 120 + 19824 = N 3 120 + 19824 = N 6 0 + 19968 = N 0 0 + 19968 = N 2 0 + 19968 = N 6 0 + 20016 = N 0 144 + 20016 = N 2 144 + 20016 = N 6 0 + 20256 = N 2 168 + 20256 = N 4 168 + 20256 = N 6 0 + 20448 = N 0 0 + 20448 = N 6 0 + 20512 = N 0 0 + 20512 = N 6 0 + 20544 = N 1 0 + 20544 = N 6 0 + 20608 = N 0 0 + 20608 = N 6 0 + 20640 = N 1 840 + 20640 = N 6 0 + 21504 = N 0 0 + 21504 = N 2 0 + 21504 = N 6 0 + 21552 = N 0 96 + 21552 = N 2 96 + 21552 = N 6 0 + 21696 = N 2 0 + 21696 = N 4 0 + 21696 = N 6 0 + 21792 = N 1 384 + 21792 = N 3 384 + 21792 = N 6 0 + 22272 = S 2 1536 + 22368 = N 2 0 + 22368 = N 6 0 + 22432 = N 3 72 + 22432 = N 6 0 + 22528 = N 3 72 + 22528 = N 6 0 + 22624 = N 2 0 + 22624 = N 6 0 + 22656 = N 3 0 + 22656 = N 6 0 + 22680 = N 4 0 + 22680 = N 6 0 + 22752 = N 3 0 + 22752 = N 6 0 + 22848 = N 2 0 + 22848 = N 6 0 + 22896 = N 0 0 + 22896 = N 6 0 + 22944 = N 1 0 + 22944 = N 6 0 + 22992 = N 0 0 + 22992 = N 6 0 + 23040 = N 2 0 + 23040 = N 6 0 + 23064 = N 3 0 + 23064 = N 6 0 + 23136 = N 2 0 + 23136 = N 6 0 + 23184 = N 1 0 + 23184 = N 6 0 + 23232 = N 2 0 + 23232 = N 6 0 + 23280 = N 0 0 + 23280 = N 6 0 + 23328 = N 1 480 + 23328 = N 6 0 + 23904 = N 2 0 + 23904 = N 6 0 + 23968 = N 3 72 + 23968 = N 6 0 + 24064 = N 2 0 + 24064 = N 6 0 + 24096 = N 4 0 + 24096 = N 6 0 + 24192 = N 3 0 + 24192 = N 6 0 + 24288 = N 2 0 + 24288 = N 6 0 + 24336 = N 3 0 + 24336 = N 6 0 + 24384 = N 2 0 + 24384 = N 6 0 + 24432 = N 1 0 + 24432 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 3 0 + 24576 = N 6 0 + 24672 = N 2 0 + 24672 = N 6 0 + 24720 = N 0 0 + 24720 = N 6 0 + 24768 = N 1 0 + 24768 = N 6 0 + 24864 = N 1 384 + 24864 = N 6 0 + 25344 = N 2 0 + 25344 = N 6 0 + 25408 = N 3 0 + 25408 = N 6 0 + 25440 = N 3 0 + 25440 = N 6 0 + 25504 = N 3 0 + 25504 = N 6 0 + 25600 = N 2 0 + 25600 = N 6 0 + 25632 = N 4 136 + 25632 = N 6 0 + 25792 = N 3 104 + 25792 = N 6 0 + 25920 = N 2 0 + 25920 = N 6 0 + 25984 = N 0 0 + 25984 = N 6 0 + 26016 = N 1 0 + 26016 = N 6 0 + 26112 = N 2 0 + 26112 = N 6 0 + 26176 = N 3 0 + 26176 = N 6 0 + 26208 = N 3 0 + 26208 = N 6 0 + 26304 = N 3 0 + 26304 = N 6 0 + 26368 = N 4 0 + 26368 = N 6 0 + 26400 = N 3 288 + 26400 = N 6 0 + 26880 = N 1 0 + 26880 = N 6 0 + 26944 = N 2 0 + 26944 = N 6 0 + 26976 = N 2 0 + 26976 = N 6 0 + 27040 = N 2 0 + 27040 = N 6 0 + 27136 = N 1 0 + 27136 = N 6 0 + 27232 = N 1 0 + 27232 = N 6 0 + 27264 = N 2 0 + 27264 = N 6 0 + 27328 = N 1 0 + 27328 = N 6 0 + 27360 = N 2 0 + 27360 = N 6 0 + 27456 = N 2 0 + 27456 = N 6 0 + 27520 = N 1 0 + 27520 = N 6 0 + 27552 = N 2 0 + 27552 = N 6 0 + 27616 = N 2 0 + 27616 = N 6 0 + 27648 = N 3 0 + 27648 = N 6 0 + 27744 = N 4 0 + 27744 = N 6 0 + 27840 = N 3 0 + 27840 = N 6 0 + 27936 = N 4 0 + 27936 = N 6 0 + 28000 = N 2 104 + 28000 = N 6 0 + 28128 = N 1 0 + 28128 = N 6 0 + 28192 = N 0 0 + 28192 = N 6 0 + 28224 = N 1 0 + 28224 = N 6 0 + 28288 = N 0 0 + 28288 = N 6 0 + 28320 = N 1 768 + 28320 = N 6 0 + 29184 = N 1 0 + 29184 = N 6 0 + 29232 = N 1 144 + 29232 = N 6 0 + 29472 = N 1 168 + 29472 = N 6 0 + 29664 = N 0 0 + 29664 = N 6 0 + 29728 = N 0 0 + 29728 = N 6 0 + 29760 = N 1 0 + 29760 = N 6 0 + 29824 = N 0 0 + 29824 = N 6 0 + 29856 = N 1 696 + 29856 = N 6 0 + 30576 = N 2 0 + 30576 = N 6 0 + 30600 = N 3 0 + 30600 = N 6 0 + 30672 = N 2 0 + 30672 = N 6 0 + 30720 = N 3 0 + 30720 = N 6 0 + 30744 = N 4 0 + 30744 = N 6 0 + 30816 = N 3 672 + 30816 = N 6 0 + 31648 = N 2 0 + 31648 = N 6 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31744 = N 2 0 + 31744 = N 6 0 + 31776 = N 3 168 + 31776 = N 6 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32064 = N 2 0 + 32064 = N 6 0 + 32112 = N 3 120 + 32112 = N 6 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32352 = N 1 0 + 32352 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 1 384 + 32544 = N 6 0 + 33024 = N 2 120 + 33024 = N 6 0 + 33024 = S 2 768 + 33168 = N 3 120 + 33168 = N 6 0 + 33312 = N 4 456 + 33312 = N 6 0 + 33792 = N 2 0 + 33792 = N 6 0 + 33840 = N 3 192 + 33840 = N 6 0 + 34128 = N 0 0 + 34128 = N 6 0 + 34176 = N 3 0 + 34176 = N 6 0 + 34200 = N 4 0 + 34200 = N 6 0 + 34224 = N 3 0 + 34224 = N 6 0 + 34272 = N 2 0 + 34272 = N 6 0 + 34320 = N 1 0 + 34320 = N 6 0 + 34368 = N 2 0 + 34368 = N 6 0 + 34416 = N 3 120 + 34416 = N 6 0 + 34560 = N 2 0 + 34560 = N 6 0 + 34608 = N 2 144 + 34608 = N 6 0 + 34848 = N 4 384 + 34848 = N 6 0 + 35328 = N 2 0 + 35328 = N 6 0 + 35376 = N 3 192 + 35376 = N 6 0 + 35664 = N 0 0 + 35664 = N 6 0 + 35712 = N 3 0 + 35712 = N 6 0 + 35736 = N 4 0 + 35736 = N 6 0 + 35760 = N 3 0 + 35760 = N 6 0 + 35808 = N 2 0 + 35808 = N 6 0 + 35856 = N 1 0 + 35856 = N 6 0 + 35904 = N 2 0 + 35904 = N 6 0 + 35952 = N 3 120 + 35952 = N 6 0 + 36096 = N 2 0 + 36096 = N 6 0 + 36144 = N 2 120 + 36144 = N 6 0 + 36288 = N 4 0 + 36288 = N 6 0 + 36384 = N 3 480 + 36384 = N 6 0 + 36960 = N 3 0 + 36960 = N 6 0 + 36960 = E solo + 36984 = N 4 0 + 36984 = N 6 0 + 37008 = N 3 0 + 37008 = N 6 0 + 37312 = N 0 0 + 37312 = N 6 0 + 37344 = N 1 0 + 37344 = N 6 0 + 37408 = N 3 0 + 37408 = N 6 0 + 37440 = N 2 0 + 37440 = N 6 0 + 37504 = N 4 0 + 37504 = N 6 0 + 37792 = N 0 0 + 37792 = N 6 0 + 37824 = N 4 0 + 37824 = N 6 0 + 37888 = N 3 0 + 37888 = N 6 0 + 37920 = N 2 0 + 37920 = N 6 0 + 37984 = N 1 0 + 37984 = N 6 0 + 38016 = N 2 0 + 38016 = N 6 0 + 38080 = N 3 0 + 38080 = N 6 0 + 38176 = N 2 72 + 38176 = N 6 0 + 38272 = N 3 0 + 38272 = N 6 0 + 38368 = N 1 0 + 38368 = N 6 0 + 38400 = N 2 0 + 38400 = N 6 0 + 38544 = N 3 0 + 38544 = N 6 0 + 38656 = N 0 0 + 38656 = N 6 0 + 38688 = N 2 0 + 38688 = N 6 0 + 38944 = N 0 0 + 38944 = N 6 0 + 38976 = N 4 0 + 38976 = N 6 0 + 39072 = N 3 0 + 39072 = N 6 0 + 39360 = N 1 0 + 39360 = N 6 0 + 39520 = N 2 0 + 39520 = N 6 0 + 39616 = N 0 0 + 39616 = N 6 0 + 39648 = N 3 0 + 39648 = N 6 0 + 39712 = N 2 0 + 39712 = N 6 0 + 39744 = N 1 0 + 39744 = N 6 0 + 39808 = N 0 0 + 39808 = N 6 0 + 39840 = N 2 0 + 39840 = N 6 0 + 39904 = N 0 0 + 39904 = N 6 0 + 39936 = N 1 0 + 39936 = N 6 0 + 40000 = N 1 0 + 40000 = N 6 0 + 40368 = N 0 0 + 40368 = N 6 0 + 40416 = N 1 0 + 40416 = N 6 0 + 40440 = N 2 0 + 40440 = N 6 0 + 40464 = N 3 0 + 40464 = N 6 0 + 40488 = N 4 0 + 40488 = N 6 0 + 40512 = N 3 0 + 40512 = N 6 0 + 40576 = N 4 104 + 40576 = N 6 0 + 40704 = N 2 0 + 40704 = N 6 0 + 40736 = N 3 0 + 40736 = N 6 0 + 40768 = N 2 0 + 40768 = N 6 0 + 40800 = N 1 0 + 40800 = N 6 0 + 40864 = N 0 0 + 40864 = N 6 0 + 40896 = N 1 0 + 40896 = N 6 0 + 40960 = N 2 0 + 40960 = N 6 0 + 41160 = N 0 0 + 41160 = N 6 0 + 41184 = N 1 0 + 41184 = N 6 0 + 41208 = N 2 0 + 41208 = N 6 0 + 41232 = N 3 0 + 41232 = N 6 0 + 41256 = N 4 0 + 41256 = N 6 0 + 41280 = N 3 0 + 41280 = N 6 0 + 41344 = N 4 0 + 41344 = N 6 0 + 41440 = N 2 0 + 41440 = N 6 0 + 41520 = N 3 93 + 41520 = N 6 0 + 41632 = N 3 104 + 41632 = N 6 0 + 41760 = N 2 0 + 41760 = N 6 0 + 41824 = N 1 0 + 41824 = N 6 0 + 41856 = N 2 0 + 41856 = N 6 0 + 41920 = N 0 200 + 41920 = N 6 0 + 42144 = N 1 0 + 42144 = N 6 0 + 42240 = S 2 2304 + 42504 = N 0 0 + 42504 = N 6 0 + 42528 = N 1 0 + 42528 = N 6 0 + 42552 = N 2 0 + 42552 = N 6 0 + 42576 = N 3 0 + 42576 = N 6 0 + 42600 = N 4 0 + 42600 = N 6 0 + 42624 = N 3 0 + 42624 = N 6 0 + 42672 = N 4 0 + 42672 = N 6 0 + 42752 = N 1 0 + 42752 = N 6 0 + 42784 = N 2 72 + 42784 = N 6 0 + 42880 = N 3 72 + 42880 = N 6 0 + 42976 = N 2 296 + 42976 = N 6 0 + 43296 = N 3 0 + 43296 = N 6 0 + 43328 = N 2 0 + 43328 = N 6 0 + 43360 = N 4 0 + 43360 = N 6 0 + 43392 = N 2 0 + 43392 = N 6 0 + 43424 = N 3 0 + 43424 = N 6 0 + 43456 = N 2 0 + 43456 = N 6 0 + 43488 = N 3 0 + 43488 = N 6 0 + 43520 = N 2 0 + 43520 = N 6 0 + 43552 = N 4 0 + 43552 = N 6 0 + 43584 = N 2 0 + 43584 = N 6 0 + 43608 = N 3 0 + 43608 = N 6 0 + 43632 = N 2 0 + 43632 = N 6 0 + 43656 = N 3 0 + 43656 = N 6 0 + 43680 = N 2 0 + 43680 = N 6 0 + 43712 = N 3 0 + 43712 = N 6 0 + 43744 = N 2 0 + 43744 = N 6 0 + 43776 = N 3 0 + 43776 = N 6 0 + 43808 = N 2 0 + 43808 = N 6 0 + 43840 = N 3 0 + 43840 = N 6 0 + 43872 = N 2 0 + 43872 = N 6 0 + 43904 = N 3 0 + 43904 = N 6 0 + 43936 = N 2 0 + 43936 = N 6 0 + 43968 = N 3 0 + 43968 = N 6 0 + 44000 = N 2 0 + 44000 = N 6 0 + 44032 = N 3 0 + 44032 = N 6 0 + 44096 = N 2 128 + 44096 = N 6 0 + 44224 = E soloend + 44640 = N 1 0 + 44640 = N 6 0 + 44704 = N 2 72 + 44704 = N 6 0 + 44800 = N 1 0 + 44800 = N 6 0 + 44832 = N 3 0 + 44832 = N 6 0 + 44928 = N 2 744 + 44928 = N 6 0 + 45696 = N 3 0 + 45696 = N 6 0 + 45734 = N 2 0 + 45734 = N 6 0 + 45773 = N 3 0 + 45773 = N 6 0 + 45816 = N 2 0 + 45816 = N 6 0 + 45840 = N 3 0 + 45840 = N 6 0 + 45864 = N 2 0 + 45864 = N 6 0 + 45888 = N 3 0 + 45888 = N 6 0 + 45912 = N 2 0 + 45912 = N 6 0 + 45936 = N 3 0 + 45936 = N 6 0 + 45960 = N 2 0 + 45960 = N 6 0 + 45984 = N 3 0 + 45984 = N 6 0 + 46080 = N 0 0 + 46080 = N 6 0 + 46144 = N 1 0 + 46144 = N 6 0 + 46176 = N 1 0 + 46176 = N 6 0 + 46240 = N 1 0 + 46240 = N 6 0 + 46336 = N 0 0 + 46336 = N 6 0 + 46368 = N 2 136 + 46368 = N 6 0 + 46528 = N 0 0 + 46528 = N 6 0 + 46560 = N 1 0 + 46560 = N 6 0 + 46624 = N 2 72 + 46624 = N 6 0 + 46720 = N 0 0 + 46720 = N 6 0 + 46752 = N 1 0 + 46752 = N 6 0 + 46816 = N 2 0 + 46816 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 46912 = N 1 0 + 46912 = N 6 0 + 46944 = N 1 0 + 46944 = N 6 0 + 47008 = N 1 0 + 47008 = N 6 0 + 47104 = N 0 0 + 47104 = N 6 0 + 47136 = N 2 328 + 47136 = N 6 0 + 47488 = N 2 104 + 47488 = N 6 0 + 47616 = N 0 0 + 47616 = N 6 0 + 47680 = N 1 0 + 47680 = N 6 0 + 47712 = N 1 0 + 47712 = N 6 0 + 47776 = N 1 0 + 47776 = N 6 0 + 47872 = N 0 0 + 47872 = N 6 0 + 47968 = N 0 0 + 47968 = N 6 0 + 48000 = N 1 0 + 48000 = N 6 0 + 48064 = N 0 0 + 48064 = N 6 0 + 48096 = N 1 0 + 48096 = N 6 0 + 48192 = N 1 0 + 48192 = N 6 0 + 48256 = N 0 0 + 48256 = N 6 0 + 48288 = N 1 0 + 48288 = N 6 0 + 48352 = N 1 0 + 48352 = N 6 0 + 48384 = N 2 0 + 48384 = N 6 0 + 48480 = N 3 0 + 48480 = N 6 0 + 48576 = N 2 0 + 48576 = N 6 0 + 48672 = N 3 104 + 48672 = N 6 0 + 48800 = N 4 0 + 48800 = N 6 0 + 48832 = N 3 0 + 48832 = N 6 0 + 48864 = N 4 0 + 48864 = N 6 0 + 48896 = N 3 0 + 48896 = N 6 0 + 48928 = N 4 0 + 48928 = N 6 0 + 48960 = N 3 0 + 48960 = N 6 0 + 48984 = N 4 0 + 48984 = N 6 0 + 49008 = N 3 0 + 49008 = N 6 0 + 49032 = N 4 0 + 49032 = N 6 0 + 49056 = N 3 0 + 49056 = N 6 0 + 49080 = N 4 0 + 49080 = N 6 0 + 49104 = N 3 0 + 49104 = N 6 0 + 49152 = N 4 0 + 49152 = N 6 0 + 49176 = N 2 0 + 49176 = N 6 0 + 49200 = N 3 312 + 49200 = N 6 0 + 49536 = N 2 360 + 49536 = N 6 0 + 49920 = N 1 360 + 49920 = N 6 0 + 50304 = N 0 384 + 50304 = N 6 0 + 51168 = N 1 0 + 51168 = N 6 0 + 51216 = N 0 0 + 51216 = N 6 0 + 51264 = N 1 0 + 51264 = N 6 0 + 51312 = N 0 0 + 51312 = N 6 0 + 51360 = N 1 1152 + 51360 = N 6 0 + 52704 = N 1 0 + 52704 = N 6 0 + 52752 = N 0 0 + 52752 = N 6 0 + 52800 = N 1 0 + 52800 = N 6 0 + 52848 = N 0 0 + 52848 = N 6 0 + 52896 = N 1 0 + 52896 = N 6 0 + 52992 = N 2 0 + 52992 = N 6 0 + 52992 = S 2 1536 + 53040 = N 3 192 + 53040 = N 6 0 + 53328 = N 0 0 + 53328 = N 6 0 + 53376 = N 4 0 + 53376 = N 6 0 + 53424 = N 3 0 + 53424 = N 6 0 + 53472 = N 2 0 + 53472 = N 6 0 + 53520 = N 1 0 + 53520 = N 6 0 + 53568 = N 2 0 + 53568 = N 6 0 + 53616 = N 3 120 + 53616 = N 6 0 + 53760 = N 2 0 + 53760 = N 6 0 + 53808 = N 2 144 + 53808 = N 6 0 + 54048 = N 4 384 + 54048 = N 6 0 + 54528 = N 2 0 + 54528 = N 6 0 + 54576 = N 3 192 + 54576 = N 6 0 + 54864 = N 0 0 + 54864 = N 6 0 + 54912 = N 4 0 + 54912 = N 6 0 + 54960 = N 3 0 + 54960 = N 6 0 + 55008 = N 2 0 + 55008 = N 6 0 + 55056 = N 1 0 + 55056 = N 6 0 + 55104 = N 2 0 + 55104 = N 6 0 + 55152 = N 3 120 + 55152 = N 6 0 + 55296 = N 2 0 + 55296 = N 6 0 + 55344 = N 2 120 + 55344 = N 6 0 + 55488 = N 4 0 + 55488 = N 6 0 + 55584 = N 3 432 + 55584 = N 6 0 + 56064 = N 2 0 + 56064 = N 6 0 + 56128 = N 3 0 + 56128 = N 6 0 + 56208 = N 4 124 + 56208 = N 6 0 + 56352 = N 2 0 + 56352 = N 6 0 + 56416 = N 3 0 + 56416 = N 6 0 + 56496 = N 4 124 + 56496 = N 6 0 + 56640 = N 2 0 + 56640 = N 6 0 + 56704 = N 3 0 + 56704 = N 6 0 + 56784 = N 4 124 + 56784 = N 6 0 + 56928 = N 2 0 + 56928 = N 6 0 + 56976 = N 3 0 + 56976 = N 6 0 + 57072 = N 4 124 + 57072 = N 6 0 + 57216 = N 3 0 + 57216 = N 6 0 + 57264 = N 3 0 + 57264 = N 6 0 + 57312 = N 2 0 + 57312 = N 6 0 + 57360 = N 1 0 + 57360 = N 6 0 + 57408 = N 1 0 + 57408 = N 6 0 + 57440 = N 0 0 + 57440 = N 6 0 + 57472 = N 1 608 + 57472 = N 6 0 + 58368 = N 1 0 + 58368 = N 6 0 + 58416 = N 2 0 + 58416 = N 6 0 + 58464 = N 3 0 + 58464 = N 6 0 + 58512 = N 4 72 + 58512 = N 6 0 + 58608 = N 3 0 + 58608 = N 6 0 + 58656 = N 4 0 + 58656 = N 6 0 + 58704 = N 3 0 + 58704 = N 6 0 + 58752 = N 2 0 + 58752 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 58896 = N 0 0 + 58896 = N 6 0 + 58992 = N 1 0 + 58992 = N 6 0 + 59040 = N 2 192 + 59040 = N 6 0 + 59328 = N 2 0 + 59328 = N 6 0 + 59376 = N 3 0 + 59376 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59472 = N 3 0 + 59472 = N 6 0 + 59520 = N 4 0 + 59520 = N 6 0 + 59616 = N 3 0 + 59616 = N 6 0 + 59712 = N 2 0 + 59712 = N 6 0 + 59808 = N 4 0 + 59808 = N 6 0 + 59856 = N 3 120 + 59856 = N 6 0 + 60000 = N 2 0 + 60000 = N 6 0 + 60048 = N 1 0 + 60048 = N 6 0 + 60144 = N 0 0 + 60144 = N 6 0 + 60192 = N 0 264 + 60192 = N 6 0 + 60480 = N 0 0 + 60480 = N 6 0 + 60528 = N 1 0 + 60528 = N 6 0 + 60576 = N 2 0 + 60576 = N 6 0 + 60624 = N 3 0 + 60624 = N 6 0 + 60672 = N 2 0 + 60672 = N 6 0 + 60736 = N 3 0 + 60736 = N 6 0 + 60816 = N 4 124 + 60816 = N 6 0 + 60960 = N 2 0 + 60960 = N 6 0 + 61024 = N 3 0 + 61024 = N 6 0 + 61120 = N 4 104 + 61120 = N 6 0 + 61248 = N 2 0 + 61248 = N 6 0 + 61312 = N 3 0 + 61312 = N 6 0 + 61392 = N 4 124 + 61392 = N 6 0 + 61536 = N 2 0 + 61536 = N 6 0 + 61600 = N 3 0 + 61600 = N 6 0 + 61696 = N 4 104 + 61696 = N 6 0 + 61824 = N 3 0 + 61824 = N 6 0 + 61872 = N 3 0 + 61872 = N 6 0 + 61920 = N 2 0 + 61920 = N 6 0 + 61968 = N 1 0 + 61968 = N 6 0 + 62016 = N 1 0 + 62016 = N 6 0 + 62064 = N 0 0 + 62064 = N 6 0 + 62112 = N 1 768 + 62112 = N 6 0 + 62976 = N 1 0 + 62976 = N 6 0 + 63024 = N 2 0 + 63024 = N 6 0 + 63072 = N 3 0 + 63072 = N 6 0 + 63120 = N 4 72 + 63120 = N 6 0 + 63216 = N 3 0 + 63216 = N 6 0 + 63264 = N 4 0 + 63264 = N 6 0 + 63312 = N 3 0 + 63312 = N 6 0 + 63360 = N 2 0 + 63360 = N 6 0 + 63456 = N 1 0 + 63456 = N 6 0 + 63504 = N 0 0 + 63504 = N 6 0 + 63600 = N 1 0 + 63600 = N 6 0 + 63648 = N 2 192 + 63648 = N 6 0 + 63936 = N 2 0 + 63936 = N 6 0 + 63984 = N 3 0 + 63984 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64080 = N 3 0 + 64080 = N 6 0 + 64128 = N 4 0 + 64128 = N 6 0 + 64224 = N 3 0 + 64224 = N 6 0 + 64320 = N 2 0 + 64320 = N 6 0 + 64416 = N 4 0 + 64416 = N 6 0 + 64464 = N 3 120 + 64464 = N 6 0 + 64608 = N 2 0 + 64608 = N 6 0 + 64656 = N 1 0 + 64656 = N 6 0 + 64752 = N 0 0 + 64752 = N 6 0 + 64800 = N 3 0 + 64800 = N 6 0 + 64832 = N 4 0 + 64832 = N 6 0 + 64864 = N 3 200 + 64864 = N 6 0 + 65088 = N 0 0 + 65088 = N 6 0 + 65088 = S 2 1344 + 65136 = N 1 0 + 65136 = N 6 0 + 65184 = N 2 0 + 65184 = N 6 0 + 65232 = N 3 0 + 65232 = N 6 0 + 65280 = N 2 0 + 65280 = N 6 0 + 65328 = N 3 312 + 65328 = N 6 0 + 65664 = N 4 0 + 65664 = N 6 0 + 65712 = N 3 0 + 65712 = N 6 0 + 65760 = N 2 0 + 65760 = N 6 0 + 65808 = N 1 0 + 65808 = N 6 0 + 65856 = N 2 0 + 65856 = N 6 0 + 65904 = N 3 120 + 65904 = N 6 0 + 66048 = N 2 288 + 66048 = N 6 0 + 66504 = N 3 0 + 66504 = N 6 0 + 66528 = N 4 168 + 66528 = N 6 0 + 66720 = N 3 0 + 66720 = N 6 0 + 66816 = N 2 0 + 66816 = N 6 0 + 66864 = N 3 312 + 66864 = N 6 0 + 67200 = N 4 0 + 67200 = N 6 0 + 67248 = N 3 0 + 67248 = N 6 0 + 67296 = N 2 0 + 67296 = N 6 0 + 67344 = N 1 0 + 67344 = N 6 0 + 67392 = N 2 0 + 67392 = N 6 0 + 67440 = N 3 120 + 67440 = N 6 0 + 67584 = N 1 0 + 67584 = N 6 0 + 67608 = N 2 168 + 67608 = N 6 0 + 68040 = N 3 0 + 68040 = N 6 0 + 68064 = N 4 200 + 68064 = N 6 0 + 68288 = N 3 0 + 68288 = N 6 0 + 68352 = N 2 0 + 68352 = N 6 0 + 68384 = N 3 0 + 68384 = N 6 0 + 68416 = N 2 0 + 68416 = N 6 0 + 68448 = N 1 226 + 68448 = N 6 0 + 68698 = N 2 0 + 68698 = N 6 0 + 68736 = N 1 0 + 68736 = N 6 0 + 68774 = N 2 0 + 68774 = N 6 0 + 68813 = N 1 0 + 68813 = N 6 0 + 68851 = N 2 0 + 68851 = N 6 0 + 68890 = N 1 0 + 68890 = N 6 0 + 68928 = N 2 0 + 68928 = N 6 0 + 68966 = N 1 0 + 68966 = N 6 0 + 69005 = N 2 0 + 69005 = N 6 0 + 69043 = N 1 0 + 69043 = N 6 0 + 69082 = N 2 0 + 69082 = N 6 0 + 69120 = N 1 0 + 69120 = N 6 0 + 69158 = N 2 0 + 69158 = N 6 0 + 69197 = N 1 77 + 69197 = N 6 0 + 69792 = N 3 0 + 69792 = N 6 0 + 69824 = N 4 0 + 69824 = N 6 0 + 69856 = N 3 0 + 69856 = N 6 0 + 69888 = N 2 96 + 69888 = N 6 0 + 70008 = N 1 0 + 70008 = N 6 0 + 70080 = N 0 72 + 70080 = N 6 0 + 70176 = N 3 0 + 70176 = N 6 0 + 70208 = N 2 0 + 70208 = N 6 0 + 70240 = N 1 224 + 70240 = N 6 0 + 70536 = N 0 0 + 70536 = N 6 0 + 70560 = N 1 0 + 70560 = N 6 0 + 70584 = N 2 0 + 70584 = N 6 0 + 70608 = N 1 0 + 70608 = N 6 0 + 70632 = N 2 0 + 70632 = N 6 0 + 70656 = N 3 0 + 70656 = N 6 0 + 70680 = N 0 0 + 70680 = N 6 0 + 70704 = N 1 0 + 70704 = N 6 0 + 70728 = N 2 0 + 70728 = N 6 0 + 70752 = N 1 0 + 70752 = N 6 0 + 70776 = N 2 0 + 70776 = N 6 0 + 70800 = N 3 0 + 70800 = N 6 0 + 70848 = N 4 96 + 70848 = N 6 0 + 71424 = N 1 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71472 = N 1 432 + 71472 = N 3 432 + 71472 = N 6 0 + 71928 = N 1 0 + 71928 = N 6 0 + 71952 = N 2 0 + 71952 = N 6 0 + 71976 = N 3 0 + 71976 = N 6 0 + 72000 = N 3 0 + 72000 = N 4 0 + 72000 = N 6 0 + 72060 = N 3 0 + 72060 = N 4 0 + 72060 = N 6 0 + 72132 = N 3 0 + 72132 = N 4 0 + 72132 = N 6 0 + 72192 = N 2 0 + 72192 = N 6 0 + 72208 = N 3 0 + 72208 = N 6 0 + 72224 = N 1 0 + 72224 = N 6 0 + 72240 = N 1 0 + 72240 = N 3 0 + 72240 = N 6 0 + 72252 = N 2 0 + 72252 = N 3 0 + 72252 = N 6 0 + 72288 = N 2 0 + 72288 = N 3 0 + 72288 = N 6 0 + 72336 = N 1 0 + 72336 = N 3 0 + 72336 = N 6 0 + 72348 = N 2 0 + 72348 = N 3 0 + 72348 = N 6 0 + 72384 = N 1 0 + 72384 = N 2 0 + 72384 = N 6 0 + 72408 = N 0 0 + 72408 = N 6 0 + 72432 = N 1 0 + 72432 = N 6 0 + 72456 = N 2 0 + 72456 = N 6 0 + 72480 = N 1 0 + 72480 = N 6 0 + 72496 = N 2 0 + 72496 = N 6 0 + 72528 = N 3 0 + 72528 = N 6 0 + 72560 = N 3 0 + 72560 = N 6 0 + 72576 = N 4 0 + 72576 = N 6 0 + 72592 = N 3 0 + 72592 = N 6 0 + 72608 = N 2 0 + 72608 = N 6 0 + 72624 = N 3 0 + 72624 = N 6 0 + 72640 = N 2 0 + 72640 = N 6 0 + 72656 = N 1 0 + 72656 = N 6 0 + 72672 = N 3 0 + 72672 = N 6 0 + 72688 = N 4 0 + 72688 = N 6 0 + 72704 = N 3 0 + 72704 = N 6 0 + 72720 = N 2 0 + 72720 = N 6 0 + 72736 = N 1 0 + 72736 = N 6 0 + 72752 = N 0 0 + 72752 = N 6 0 + 72768 = N 1 0 + 72768 = N 6 0 + 72784 = N 2 0 + 72784 = N 6 0 + 72816 = N 2 0 + 72816 = N 3 0 + 72816 = N 6 0 + 72864 = N 2 0 + 72864 = N 4 0 + 72864 = N 6 0 + 72912 = N 2 0 + 72912 = N 4 0 + 72912 = N 6 0 + 72928 = N 3 0 + 72928 = N 4 0 + 72928 = N 6 0 + 72976 = N 2 0 + 72976 = N 4 0 + 72976 = N 6 0 + 73032 = N 1 0 + 73032 = N 3 0 + 73032 = N 6 0 + 73056 = N 2 0 + 73056 = N 3 0 + 73056 = N 6 0 + 73104 = N 2 53 + 73104 = N 4 53 + 73104 = N 6 0 + 73168 = N 2 0 + 73168 = N 4 0 + 73168 = N 6 0 + 73184 = N 3 37 + 73184 = N 4 37 + 73184 = N 6 0 + 73232 = N 2 53 + 73232 = N 4 53 + 73232 = N 6 0 + 73296 = N 1 0 + 73296 = N 3 0 + 73296 = N 6 0 + 73312 = N 2 0 + 73312 = N 3 0 + 73312 = N 6 0 + 73368 = N 2 91 + 73368 = N 4 91 + 73368 = N 6 0 + 73472 = N 1 0 + 73472 = N 3 0 + 73472 = N 6 0 + 73488 = N 2 70 + 73488 = N 3 70 + 73488 = N 6 0 + 73568 = N 2 70 + 73568 = N 4 70 + 73568 = N 6 0 + 73648 = N 1 0 + 73648 = N 3 0 + 73648 = N 6 0 + 73664 = N 2 640 + 73664 = N 3 640 + 73664 = N 6 0 +} +[HardSingle] +{ + 928 = N 2 0 + 928 = N 6 0 + 928 = E solo + 960 = N 4 0 + 960 = N 6 0 + 1024 = N 2 0 + 1024 = N 6 0 + 1056 = N 2 0 + 1056 = N 3 0 + 1056 = N 6 0 + 1152 = N 1 0 + 1152 = N 2 0 + 1152 = N 6 0 + 1216 = N 0 0 + 1216 = N 6 0 + 1248 = N 1 72 + 1248 = N 6 0 + 1344 = N 4 0 + 1344 = N 6 0 + 1392 = N 3 0 + 1392 = N 6 0 + 1440 = N 2 0 + 1440 = N 6 0 + 1472 = N 1 0 + 1472 = N 6 0 + 1504 = N 2 0 + 1504 = N 6 0 + 1536 = N 0 168 + 1536 = N 6 0 + 1728 = N 0 0 + 1728 = N 3 0 + 1728 = N 6 0 + 1824 = N 1 456 + 1824 = N 2 456 + 1824 = N 6 0 + 2368 = N 1 0 + 2368 = N 6 0 + 2432 = N 2 0 + 2432 = N 6 0 + 2464 = N 3 0 + 2464 = N 6 0 + 2496 = N 4 0 + 2496 = N 6 0 + 2592 = N 2 0 + 2592 = N 3 0 + 2592 = N 6 0 + 2656 = N 1 0 + 2656 = N 6 0 + 2688 = N 2 0 + 2688 = N 6 0 + 2720 = N 3 0 + 2720 = N 6 0 + 2752 = N 2 0 + 2752 = N 6 0 + 2784 = N 3 0 + 2784 = N 6 0 + 2816 = N 4 0 + 2816 = N 6 0 + 2848 = N 3 0 + 2848 = N 6 0 + 2880 = N 2 0 + 2880 = N 6 0 + 2912 = N 4 0 + 2912 = N 6 0 + 2944 = N 3 0 + 2944 = N 6 0 + 2976 = N 2 0 + 2976 = N 6 0 + 3008 = N 1 0 + 3008 = N 6 0 + 3040 = N 0 205 + 3040 = N 6 0 + 3264 = N 0 0 + 3264 = N 3 0 + 3264 = N 6 0 + 3360 = N 1 456 + 3360 = N 2 456 + 3360 = N 6 0 + 3840 = S 2 1152 + 3888 = N 4 77 + 3888 = N 6 0 + 3984 = N 2 0 + 3984 = N 6 0 + 4032 = N 3 120 + 4032 = N 6 0 + 4176 = N 1 0 + 4176 = N 6 0 + 4224 = N 2 120 + 4224 = N 6 0 + 4368 = N 0 0 + 4368 = N 6 0 + 4416 = N 1 0 + 4416 = N 6 0 + 4464 = N 0 0 + 4464 = N 6 0 + 4512 = N 2 0 + 4512 = N 6 0 + 4560 = N 1 0 + 4560 = N 6 0 + 4608 = N 0 168 + 4608 = N 6 0 + 4800 = N 0 0 + 4800 = N 3 0 + 4800 = N 6 0 + 4896 = N 1 400 + 4896 = N 2 400 + 4896 = N 6 0 + 5344 = N 2 0 + 5344 = N 6 0 + 5376 = N 2 168 + 5376 = N 4 168 + 5376 = N 6 0 + 5568 = N 3 0 + 5568 = N 6 0 + 5632 = N 2 0 + 5632 = N 6 0 + 5728 = N 2 104 + 5728 = N 4 104 + 5728 = N 6 0 + 5856 = N 1 0 + 5856 = N 3 0 + 5856 = N 6 0 + 5920 = N 1 200 + 5920 = N 2 200 + 5920 = N 6 0 + 6144 = N 0 192 + 6144 = N 3 192 + 6144 = N 6 0 + 6432 = N 1 480 + 6432 = N 2 480 + 6432 = N 6 0 + 7072 = N 2 0 + 7072 = N 6 0 + 7104 = N 4 0 + 7104 = N 6 0 + 7168 = N 2 0 + 7168 = N 6 0 + 7248 = N 3 0 + 7248 = N 6 0 + 7272 = N 2 0 + 7272 = N 6 0 + 7296 = N 1 0 + 7296 = N 6 0 + 7392 = N 0 0 + 7392 = N 6 0 + 7536 = N 0 0 + 7536 = N 6 0 + 7584 = N 1 0 + 7584 = N 6 0 + 7632 = N 2 126 + 7632 = N 6 0 + 7776 = N 0 0 + 7776 = N 6 0 + 7872 = N 3 0 + 7872 = N 6 0 + 7968 = N 1 317 + 7968 = N 2 317 + 7968 = N 6 0 + 8304 = N 0 96 + 8304 = N 6 0 + 8448 = N 3 136 + 8448 = N 4 136 + 8448 = N 6 0 + 8608 = N 2 0 + 8608 = N 6 0 + 8640 = N 3 0 + 8640 = N 6 0 + 8688 = N 1 0 + 8688 = N 6 0 + 8784 = N 2 88 + 8784 = N 3 88 + 8784 = N 6 0 + 8896 = N 2 0 + 8896 = N 6 0 + 8928 = N 2 0 + 8928 = N 4 0 + 8928 = N 6 0 + 9024 = N 2 0 + 9024 = N 3 0 + 9024 = N 6 0 + 9120 = N 1 0 + 9120 = N 6 0 + 9216 = N 0 168 + 9216 = N 1 168 + 9216 = N 6 0 + 9408 = N 1 0 + 9408 = N 2 0 + 9408 = N 6 0 + 9504 = N 1 456 + 9504 = N 2 456 + 9504 = N 6 0 + 9888 = E soloend + 9984 = N 1 0 + 9984 = N 2 0 + 9984 = N 6 0 + 10032 = N 3 312 + 10032 = N 6 0 + 10368 = N 4 0 + 10368 = N 6 0 + 10416 = N 3 0 + 10416 = N 6 0 + 10464 = N 2 0 + 10464 = N 6 0 + 10512 = N 1 0 + 10512 = N 6 0 + 10560 = N 2 0 + 10560 = N 6 0 + 10608 = N 1 120 + 10608 = N 3 120 + 10608 = N 6 0 + 10752 = N 0 0 + 10752 = N 2 0 + 10752 = N 6 0 + 10800 = N 0 120 + 10800 = N 2 120 + 10800 = N 6 0 + 10944 = N 0 0 + 10944 = N 6 0 + 11040 = N 2 168 + 11040 = N 4 168 + 11040 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 11280 = N 1 0 + 11280 = N 6 0 + 11328 = N 2 0 + 11328 = N 6 0 + 11376 = N 1 0 + 11376 = N 6 0 + 11424 = N 2 0 + 11424 = N 6 0 + 11520 = N 1 0 + 11520 = N 2 0 + 11520 = N 6 0 + 11520 = S 2 1536 + 11568 = N 3 264 + 11568 = N 6 0 + 11904 = N 4 0 + 11904 = N 6 0 + 11952 = N 3 0 + 11952 = N 6 0 + 12000 = N 2 0 + 12000 = N 6 0 + 12048 = N 1 0 + 12048 = N 6 0 + 12096 = N 2 0 + 12096 = N 6 0 + 12144 = N 1 120 + 12144 = N 3 120 + 12144 = N 6 0 + 12288 = N 0 0 + 12288 = N 2 0 + 12288 = N 6 0 + 12336 = N 0 72 + 12336 = N 2 72 + 12336 = N 6 0 + 12480 = N 4 0 + 12480 = N 6 0 + 12576 = N 1 480 + 12576 = N 3 480 + 12576 = N 6 0 + 13152 = N 2 0 + 13152 = N 6 0 + 13216 = N 3 0 + 13216 = N 6 0 + 13312 = N 3 0 + 13312 = N 6 0 + 13392 = N 2 0 + 13392 = N 6 0 + 13440 = N 4 0 + 13440 = N 6 0 + 13536 = N 3 0 + 13536 = N 6 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13728 = N 2 0 + 13728 = N 6 0 + 13824 = N 2 0 + 13824 = N 6 0 + 13920 = N 1 0 + 13920 = N 6 0 + 13984 = N 0 0 + 13984 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14112 = N 0 384 + 14112 = N 6 0 + 14688 = N 2 0 + 14688 = N 6 0 + 14752 = N 3 72 + 14752 = N 6 0 + 14848 = N 2 0 + 14848 = N 6 0 + 14880 = N 4 0 + 14880 = N 6 0 + 14976 = N 3 168 + 14976 = N 6 0 + 15168 = N 2 0 + 15168 = N 6 0 + 15232 = N 3 0 + 15232 = N 6 0 + 15264 = N 2 0 + 15264 = N 6 0 + 15360 = N 2 136 + 15360 = N 6 0 + 15520 = N 1 136 + 15520 = N 6 0 + 15680 = N 0 256 + 15680 = N 6 0 + 16128 = N 2 0 + 16128 = N 6 0 + 16192 = N 3 0 + 16192 = N 6 0 + 16224 = N 3 0 + 16224 = N 6 0 + 16288 = N 3 0 + 16288 = N 6 0 + 16384 = N 2 0 + 16384 = N 6 0 + 16416 = N 4 136 + 16416 = N 6 0 + 16576 = N 3 104 + 16576 = N 6 0 + 16704 = N 2 0 + 16704 = N 6 0 + 16768 = N 0 0 + 16768 = N 6 0 + 16800 = N 1 0 + 16800 = N 6 0 + 16896 = N 2 0 + 16896 = N 6 0 + 16960 = N 3 0 + 16960 = N 6 0 + 16992 = N 3 0 + 16992 = N 6 0 + 17088 = N 3 0 + 17088 = N 6 0 + 17152 = N 4 0 + 17152 = N 6 0 + 17184 = N 3 224 + 17184 = N 6 0 + 17632 = N 0 0 + 17632 = N 6 0 + 17664 = N 1 0 + 17664 = N 6 0 + 17728 = N 2 0 + 17728 = N 6 0 + 17760 = N 2 0 + 17760 = N 6 0 + 17824 = N 2 0 + 17824 = N 6 0 + 17920 = N 1 0 + 17920 = N 6 0 + 18016 = N 1 0 + 18016 = N 6 0 + 18048 = N 2 0 + 18048 = N 6 0 + 18112 = N 1 0 + 18112 = N 6 0 + 18144 = N 2 0 + 18144 = N 6 0 + 18240 = N 2 0 + 18240 = N 6 0 + 18304 = N 1 0 + 18304 = N 6 0 + 18336 = N 2 0 + 18336 = N 6 0 + 18400 = N 2 0 + 18400 = N 6 0 + 18432 = N 3 0 + 18432 = N 6 0 + 18528 = N 4 0 + 18528 = N 6 0 + 18624 = N 3 0 + 18624 = N 6 0 + 18720 = N 4 0 + 18720 = N 6 0 + 18784 = N 2 104 + 18784 = N 6 0 + 18912 = N 1 0 + 18912 = N 6 0 + 18976 = N 0 0 + 18976 = N 6 0 + 19008 = N 1 0 + 19008 = N 6 0 + 19072 = N 0 0 + 19072 = N 6 0 + 19104 = N 1 456 + 19104 = N 6 0 + 19584 = N 4 0 + 19584 = N 6 0 + 19632 = N 3 0 + 19632 = N 6 0 + 19680 = N 2 0 + 19680 = N 6 0 + 19728 = N 1 0 + 19728 = N 6 0 + 19776 = N 2 0 + 19776 = N 6 0 + 19824 = N 1 120 + 19824 = N 3 120 + 19824 = N 6 0 + 19968 = N 0 0 + 19968 = N 2 0 + 19968 = N 6 0 + 20016 = N 0 144 + 20016 = N 2 144 + 20016 = N 6 0 + 20256 = N 2 168 + 20256 = N 4 168 + 20256 = N 6 0 + 20448 = N 0 0 + 20448 = N 6 0 + 20512 = N 0 0 + 20512 = N 6 0 + 20544 = N 1 0 + 20544 = N 6 0 + 20608 = N 0 0 + 20608 = N 6 0 + 20640 = N 1 840 + 20640 = N 6 0 + 21504 = N 0 0 + 21504 = N 2 0 + 21504 = N 6 0 + 21552 = N 0 96 + 21552 = N 2 96 + 21552 = N 6 0 + 21696 = N 2 0 + 21696 = N 4 0 + 21696 = N 6 0 + 21792 = N 1 384 + 21792 = N 3 384 + 21792 = N 6 0 + 22272 = S 2 1536 + 22368 = N 2 0 + 22368 = N 6 0 + 22432 = N 3 72 + 22432 = N 6 0 + 22528 = N 3 72 + 22528 = N 6 0 + 22624 = N 2 0 + 22624 = N 6 0 + 22656 = N 4 0 + 22656 = N 6 0 + 22752 = N 3 0 + 22752 = N 6 0 + 22848 = N 2 0 + 22848 = N 6 0 + 22896 = N 0 0 + 22896 = N 6 0 + 22944 = N 1 0 + 22944 = N 6 0 + 22992 = N 0 0 + 22992 = N 6 0 + 23040 = N 3 0 + 23040 = N 6 0 + 23136 = N 2 0 + 23136 = N 6 0 + 23184 = N 1 0 + 23184 = N 6 0 + 23232 = N 2 0 + 23232 = N 6 0 + 23280 = N 0 0 + 23280 = N 6 0 + 23328 = N 1 480 + 23328 = N 6 0 + 23904 = N 2 0 + 23904 = N 6 0 + 23968 = N 3 72 + 23968 = N 6 0 + 24064 = N 2 0 + 24064 = N 6 0 + 24096 = N 4 0 + 24096 = N 6 0 + 24192 = N 3 0 + 24192 = N 6 0 + 24288 = N 2 0 + 24288 = N 6 0 + 24336 = N 3 0 + 24336 = N 6 0 + 24384 = N 2 0 + 24384 = N 6 0 + 24432 = N 1 0 + 24432 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 3 0 + 24576 = N 6 0 + 24672 = N 2 0 + 24672 = N 6 0 + 24720 = N 0 0 + 24720 = N 6 0 + 24768 = N 1 0 + 24768 = N 6 0 + 24864 = N 1 384 + 24864 = N 6 0 + 25344 = N 2 0 + 25344 = N 6 0 + 25408 = N 3 0 + 25408 = N 6 0 + 25440 = N 3 0 + 25440 = N 6 0 + 25504 = N 3 0 + 25504 = N 6 0 + 25600 = N 2 0 + 25600 = N 6 0 + 25632 = N 4 136 + 25632 = N 6 0 + 25792 = N 3 104 + 25792 = N 6 0 + 25920 = N 2 0 + 25920 = N 6 0 + 25984 = N 0 0 + 25984 = N 6 0 + 26016 = N 1 0 + 26016 = N 6 0 + 26112 = N 2 0 + 26112 = N 6 0 + 26176 = N 3 0 + 26176 = N 6 0 + 26208 = N 3 0 + 26208 = N 6 0 + 26304 = N 3 0 + 26304 = N 6 0 + 26368 = N 4 0 + 26368 = N 6 0 + 26400 = N 3 288 + 26400 = N 6 0 + 26880 = N 1 0 + 26880 = N 6 0 + 26944 = N 2 0 + 26944 = N 6 0 + 26976 = N 2 0 + 26976 = N 6 0 + 27040 = N 2 0 + 27040 = N 6 0 + 27136 = N 1 0 + 27136 = N 6 0 + 27232 = N 1 0 + 27232 = N 6 0 + 27264 = N 2 0 + 27264 = N 6 0 + 27328 = N 1 0 + 27328 = N 6 0 + 27360 = N 2 0 + 27360 = N 6 0 + 27456 = N 2 0 + 27456 = N 6 0 + 27520 = N 1 0 + 27520 = N 6 0 + 27552 = N 2 0 + 27552 = N 6 0 + 27616 = N 2 0 + 27616 = N 6 0 + 27648 = N 3 0 + 27648 = N 6 0 + 27744 = N 4 0 + 27744 = N 6 0 + 27840 = N 3 0 + 27840 = N 6 0 + 27936 = N 4 0 + 27936 = N 6 0 + 28000 = N 2 104 + 28000 = N 6 0 + 28128 = N 1 0 + 28128 = N 6 0 + 28192 = N 0 0 + 28192 = N 6 0 + 28224 = N 1 0 + 28224 = N 6 0 + 28288 = N 0 0 + 28288 = N 6 0 + 28320 = N 1 768 + 28320 = N 6 0 + 29184 = N 1 0 + 29184 = N 6 0 + 29232 = N 1 144 + 29232 = N 6 0 + 29472 = N 1 168 + 29472 = N 6 0 + 29664 = N 0 0 + 29664 = N 6 0 + 29728 = N 0 0 + 29728 = N 6 0 + 29760 = N 1 0 + 29760 = N 6 0 + 29824 = N 0 0 + 29824 = N 6 0 + 29856 = N 1 696 + 29856 = N 6 0 + 30576 = N 3 0 + 30576 = N 6 0 + 30672 = N 2 0 + 30672 = N 6 0 + 30720 = N 4 0 + 30720 = N 6 0 + 30816 = N 3 672 + 30816 = N 6 0 + 31648 = N 2 0 + 31648 = N 6 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31744 = N 2 0 + 31744 = N 6 0 + 31776 = N 3 168 + 31776 = N 6 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32064 = N 2 0 + 32064 = N 6 0 + 32112 = N 3 120 + 32112 = N 6 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32352 = N 1 0 + 32352 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 1 384 + 32544 = N 6 0 + 33024 = N 2 120 + 33024 = N 6 0 + 33024 = S 2 768 + 33168 = N 3 120 + 33168 = N 6 0 + 33312 = N 4 456 + 33312 = N 6 0 + 33792 = N 2 0 + 33792 = N 6 0 + 33840 = N 3 192 + 33840 = N 6 0 + 34176 = N 4 0 + 34176 = N 6 0 + 34224 = N 3 0 + 34224 = N 6 0 + 34272 = N 2 0 + 34272 = N 6 0 + 34320 = N 1 0 + 34320 = N 6 0 + 34368 = N 2 0 + 34368 = N 6 0 + 34416 = N 3 120 + 34416 = N 6 0 + 34560 = N 2 0 + 34560 = N 6 0 + 34608 = N 2 144 + 34608 = N 6 0 + 34848 = N 4 384 + 34848 = N 6 0 + 35328 = N 2 0 + 35328 = N 6 0 + 35376 = N 3 192 + 35376 = N 6 0 + 35712 = N 4 0 + 35712 = N 6 0 + 35760 = N 3 0 + 35760 = N 6 0 + 35808 = N 2 0 + 35808 = N 6 0 + 35856 = N 1 0 + 35856 = N 6 0 + 35904 = N 2 0 + 35904 = N 6 0 + 35952 = N 3 120 + 35952 = N 6 0 + 36096 = N 2 0 + 36096 = N 6 0 + 36144 = N 2 120 + 36144 = N 6 0 + 36288 = N 4 0 + 36288 = N 6 0 + 36384 = N 3 480 + 36384 = N 6 0 + 36960 = N 4 0 + 36960 = N 6 0 + 36960 = E solo + 37008 = N 3 0 + 37008 = N 6 0 + 37312 = N 0 0 + 37312 = N 6 0 + 37344 = N 1 0 + 37344 = N 6 0 + 37408 = N 3 0 + 37408 = N 6 0 + 37440 = N 2 96 + 37440 = N 6 0 + 37824 = N 4 0 + 37824 = N 6 0 + 37888 = N 3 0 + 37888 = N 6 0 + 37920 = N 2 0 + 37920 = N 6 0 + 38016 = N 2 0 + 38016 = N 6 0 + 38080 = N 3 0 + 38080 = N 6 0 + 38176 = N 2 72 + 38176 = N 6 0 + 38272 = N 3 0 + 38272 = N 6 0 + 38368 = N 1 0 + 38368 = N 6 0 + 38400 = N 2 0 + 38400 = N 6 0 + 38544 = N 3 0 + 38544 = N 6 0 + 38656 = N 0 0 + 38656 = N 6 0 + 38688 = N 2 0 + 38688 = N 6 0 + 38976 = N 4 0 + 38976 = N 6 0 + 39072 = N 3 0 + 39072 = N 6 0 + 39360 = N 1 0 + 39360 = N 6 0 + 39520 = N 2 0 + 39520 = N 6 0 + 39648 = N 3 0 + 39648 = N 6 0 + 39712 = N 2 0 + 39712 = N 6 0 + 39744 = N 1 0 + 39744 = N 6 0 + 39840 = N 2 0 + 39840 = N 6 0 + 39936 = N 1 0 + 39936 = N 6 0 + 40000 = N 1 0 + 40000 = N 6 0 + 40384 = N 2 0 + 40384 = N 6 0 + 40416 = N 3 0 + 40416 = N 6 0 + 40464 = N 4 0 + 40464 = N 6 0 + 40512 = N 3 0 + 40512 = N 6 0 + 40576 = N 4 104 + 40576 = N 6 0 + 40704 = N 3 0 + 40704 = N 6 0 + 40752 = N 2 0 + 40752 = N 6 0 + 40800 = N 1 0 + 40800 = N 6 0 + 40864 = N 0 0 + 40864 = N 6 0 + 40896 = N 1 0 + 40896 = N 6 0 + 40960 = N 2 0 + 40960 = N 6 0 + 41152 = N 2 0 + 41152 = N 6 0 + 41184 = N 3 0 + 41184 = N 6 0 + 41232 = N 4 0 + 41232 = N 6 0 + 41280 = N 3 0 + 41280 = N 6 0 + 41344 = N 4 0 + 41344 = N 6 0 + 41440 = N 2 0 + 41440 = N 6 0 + 41520 = N 3 93 + 41520 = N 6 0 + 41632 = N 3 104 + 41632 = N 6 0 + 41760 = N 2 0 + 41760 = N 6 0 + 41856 = N 2 0 + 41856 = N 6 0 + 41920 = N 0 200 + 41920 = N 6 0 + 42144 = N 1 0 + 42144 = N 6 0 + 42240 = S 2 2304 + 42496 = N 0 0 + 42496 = N 6 0 + 42528 = N 1 0 + 42528 = N 6 0 + 42576 = N 2 0 + 42576 = N 6 0 + 42624 = N 1 0 + 42624 = N 6 0 + 42672 = N 2 0 + 42672 = N 6 0 + 42752 = N 3 104 + 42752 = N 6 0 + 42880 = N 4 72 + 42880 = N 6 0 + 42976 = N 3 296 + 42976 = N 6 0 + 43296 = N 4 0 + 43296 = N 6 0 + 43344 = N 3 0 + 43344 = N 6 0 + 43392 = N 4 0 + 43392 = N 6 0 + 43440 = N 3 0 + 43440 = N 6 0 + 43488 = N 4 0 + 43488 = N 6 0 + 43536 = N 3 0 + 43536 = N 6 0 + 43584 = N 4 0 + 43584 = N 6 0 + 43632 = N 3 0 + 43632 = N 6 0 + 43680 = N 4 0 + 43680 = N 6 0 + 43728 = N 3 0 + 43728 = N 6 0 + 43776 = N 4 0 + 43776 = N 6 0 + 43824 = N 3 0 + 43824 = N 6 0 + 43872 = N 4 0 + 43872 = N 6 0 + 43920 = N 3 0 + 43920 = N 6 0 + 43968 = N 4 0 + 43968 = N 6 0 + 44000 = N 3 0 + 44000 = N 6 0 + 44032 = N 4 0 + 44032 = N 6 0 + 44096 = N 3 128 + 44096 = N 6 0 + 44224 = E soloend + 44640 = N 1 0 + 44640 = N 6 0 + 44704 = N 2 72 + 44704 = N 6 0 + 44800 = N 1 0 + 44800 = N 6 0 + 44832 = N 3 0 + 44832 = N 6 0 + 44928 = N 2 744 + 44928 = N 6 0 + 45696 = N 3 0 + 45696 = N 6 0 + 45744 = N 2 0 + 45744 = N 6 0 + 45792 = N 3 0 + 45792 = N 6 0 + 45840 = N 2 0 + 45840 = N 6 0 + 45888 = N 3 0 + 45888 = N 6 0 + 45936 = N 2 0 + 45936 = N 6 0 + 45984 = N 3 0 + 45984 = N 6 0 + 46080 = N 0 0 + 46080 = N 6 0 + 46144 = N 1 0 + 46144 = N 6 0 + 46176 = N 1 0 + 46176 = N 6 0 + 46240 = N 1 0 + 46240 = N 6 0 + 46336 = N 0 0 + 46336 = N 6 0 + 46368 = N 2 136 + 46368 = N 6 0 + 46528 = N 0 0 + 46528 = N 6 0 + 46560 = N 1 0 + 46560 = N 6 0 + 46624 = N 2 72 + 46624 = N 6 0 + 46720 = N 0 0 + 46720 = N 6 0 + 46752 = N 1 0 + 46752 = N 6 0 + 46816 = N 2 0 + 46816 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 46912 = N 1 0 + 46912 = N 6 0 + 46944 = N 1 0 + 46944 = N 6 0 + 47008 = N 1 0 + 47008 = N 6 0 + 47104 = N 0 0 + 47104 = N 6 0 + 47136 = N 2 328 + 47136 = N 6 0 + 47488 = N 2 104 + 47488 = N 6 0 + 47616 = N 0 0 + 47616 = N 6 0 + 47680 = N 1 0 + 47680 = N 6 0 + 47712 = N 1 0 + 47712 = N 6 0 + 47776 = N 1 0 + 47776 = N 6 0 + 47872 = N 0 0 + 47872 = N 6 0 + 47968 = N 0 0 + 47968 = N 6 0 + 48000 = N 1 0 + 48000 = N 6 0 + 48064 = N 0 0 + 48064 = N 6 0 + 48096 = N 1 0 + 48096 = N 6 0 + 48192 = N 1 0 + 48192 = N 6 0 + 48256 = N 0 0 + 48256 = N 6 0 + 48288 = N 1 0 + 48288 = N 6 0 + 48352 = N 1 0 + 48352 = N 6 0 + 48384 = N 2 0 + 48384 = N 6 0 + 48480 = N 3 0 + 48480 = N 6 0 + 48576 = N 2 0 + 48576 = N 6 0 + 48672 = N 3 104 + 48672 = N 6 0 + 48800 = N 4 0 + 48800 = N 6 0 + 48832 = N 3 0 + 48832 = N 6 0 + 48864 = N 4 0 + 48864 = N 6 0 + 48896 = N 3 0 + 48896 = N 6 0 + 48928 = N 4 0 + 48928 = N 6 0 + 48960 = N 3 0 + 48960 = N 6 0 + 48992 = N 4 0 + 48992 = N 6 0 + 49024 = N 3 0 + 49024 = N 6 0 + 49056 = N 4 0 + 49056 = N 6 0 + 49088 = N 3 0 + 49088 = N 6 0 + 49120 = N 4 0 + 49120 = N 6 0 + 49152 = N 3 360 + 49152 = N 6 0 + 49536 = N 2 360 + 49536 = N 6 0 + 49920 = N 1 360 + 49920 = N 6 0 + 50304 = N 0 384 + 50304 = N 6 0 + 51168 = N 1 0 + 51168 = N 6 0 + 51216 = N 0 0 + 51216 = N 6 0 + 51264 = N 1 0 + 51264 = N 6 0 + 51312 = N 0 0 + 51312 = N 6 0 + 51360 = N 1 1152 + 51360 = N 6 0 + 52704 = N 1 0 + 52704 = N 6 0 + 52752 = N 0 0 + 52752 = N 6 0 + 52800 = N 1 0 + 52800 = N 6 0 + 52848 = N 0 0 + 52848 = N 6 0 + 52896 = N 1 0 + 52896 = N 6 0 + 52992 = N 2 0 + 52992 = N 6 0 + 52992 = S 2 1536 + 53040 = N 3 192 + 53040 = N 6 0 + 53376 = N 4 0 + 53376 = N 6 0 + 53424 = N 3 0 + 53424 = N 6 0 + 53472 = N 2 0 + 53472 = N 6 0 + 53520 = N 1 0 + 53520 = N 6 0 + 53568 = N 2 0 + 53568 = N 6 0 + 53616 = N 3 120 + 53616 = N 6 0 + 53760 = N 2 0 + 53760 = N 6 0 + 53808 = N 2 144 + 53808 = N 6 0 + 54048 = N 4 384 + 54048 = N 6 0 + 54528 = N 2 0 + 54528 = N 6 0 + 54576 = N 3 192 + 54576 = N 6 0 + 54912 = N 4 0 + 54912 = N 6 0 + 54960 = N 3 0 + 54960 = N 6 0 + 55008 = N 2 0 + 55008 = N 6 0 + 55056 = N 1 0 + 55056 = N 6 0 + 55104 = N 2 0 + 55104 = N 6 0 + 55152 = N 3 120 + 55152 = N 6 0 + 55296 = N 2 0 + 55296 = N 6 0 + 55344 = N 2 120 + 55344 = N 6 0 + 55488 = N 4 0 + 55488 = N 6 0 + 55584 = N 3 432 + 55584 = N 6 0 + 56064 = N 2 0 + 56064 = N 6 0 + 56128 = N 3 0 + 56128 = N 6 0 + 56208 = N 4 124 + 56208 = N 6 0 + 56352 = N 2 0 + 56352 = N 6 0 + 56416 = N 3 0 + 56416 = N 6 0 + 56496 = N 4 124 + 56496 = N 6 0 + 56640 = N 2 0 + 56640 = N 6 0 + 56704 = N 3 0 + 56704 = N 6 0 + 56784 = N 4 124 + 56784 = N 6 0 + 56928 = N 2 0 + 56928 = N 6 0 + 56976 = N 3 0 + 56976 = N 6 0 + 57072 = N 4 124 + 57072 = N 6 0 + 57216 = N 3 0 + 57216 = N 6 0 + 57264 = N 3 0 + 57264 = N 6 0 + 57312 = N 2 0 + 57312 = N 6 0 + 57360 = N 1 0 + 57360 = N 6 0 + 57408 = N 1 0 + 57408 = N 6 0 + 57440 = N 0 0 + 57440 = N 6 0 + 57472 = N 1 608 + 57472 = N 6 0 + 58368 = N 1 0 + 58368 = N 6 0 + 58416 = N 2 0 + 58416 = N 6 0 + 58464 = N 3 0 + 58464 = N 6 0 + 58512 = N 4 72 + 58512 = N 6 0 + 58608 = N 3 0 + 58608 = N 6 0 + 58656 = N 4 0 + 58656 = N 6 0 + 58704 = N 3 0 + 58704 = N 6 0 + 58752 = N 2 0 + 58752 = N 6 0 + 58848 = N 1 0 + 58848 = N 6 0 + 58896 = N 0 0 + 58896 = N 6 0 + 58992 = N 1 0 + 58992 = N 6 0 + 59040 = N 2 192 + 59040 = N 6 0 + 59328 = N 2 0 + 59328 = N 6 0 + 59376 = N 3 0 + 59376 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59472 = N 3 0 + 59472 = N 6 0 + 59520 = N 4 0 + 59520 = N 6 0 + 59616 = N 3 0 + 59616 = N 6 0 + 59712 = N 2 0 + 59712 = N 6 0 + 59808 = N 4 0 + 59808 = N 6 0 + 59856 = N 3 120 + 59856 = N 6 0 + 60000 = N 2 0 + 60000 = N 6 0 + 60048 = N 1 0 + 60048 = N 6 0 + 60144 = N 0 0 + 60144 = N 6 0 + 60192 = N 0 264 + 60192 = N 6 0 + 60480 = N 0 0 + 60480 = N 6 0 + 60528 = N 1 0 + 60528 = N 6 0 + 60576 = N 2 0 + 60576 = N 6 0 + 60624 = N 3 0 + 60624 = N 6 0 + 60672 = N 2 0 + 60672 = N 6 0 + 60736 = N 3 0 + 60736 = N 6 0 + 60816 = N 4 124 + 60816 = N 6 0 + 60960 = N 2 0 + 60960 = N 6 0 + 61024 = N 3 0 + 61024 = N 6 0 + 61120 = N 4 104 + 61120 = N 6 0 + 61248 = N 2 0 + 61248 = N 6 0 + 61312 = N 3 0 + 61312 = N 6 0 + 61392 = N 4 124 + 61392 = N 6 0 + 61536 = N 2 0 + 61536 = N 6 0 + 61600 = N 3 0 + 61600 = N 6 0 + 61696 = N 4 104 + 61696 = N 6 0 + 61824 = N 3 0 + 61824 = N 6 0 + 61872 = N 3 0 + 61872 = N 6 0 + 61920 = N 2 0 + 61920 = N 6 0 + 61968 = N 1 0 + 61968 = N 6 0 + 62016 = N 1 0 + 62016 = N 6 0 + 62064 = N 0 0 + 62064 = N 6 0 + 62112 = N 1 768 + 62112 = N 6 0 + 62976 = N 1 0 + 62976 = N 6 0 + 63024 = N 2 0 + 63024 = N 6 0 + 63072 = N 3 0 + 63072 = N 6 0 + 63120 = N 4 72 + 63120 = N 6 0 + 63216 = N 3 0 + 63216 = N 6 0 + 63264 = N 4 0 + 63264 = N 6 0 + 63312 = N 3 0 + 63312 = N 6 0 + 63360 = N 2 0 + 63360 = N 6 0 + 63456 = N 1 0 + 63456 = N 6 0 + 63504 = N 0 0 + 63504 = N 6 0 + 63600 = N 1 0 + 63600 = N 6 0 + 63648 = N 2 192 + 63648 = N 6 0 + 63936 = N 2 0 + 63936 = N 6 0 + 63984 = N 3 0 + 63984 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64080 = N 3 0 + 64080 = N 6 0 + 64128 = N 4 0 + 64128 = N 6 0 + 64224 = N 3 0 + 64224 = N 6 0 + 64320 = N 2 0 + 64320 = N 6 0 + 64416 = N 4 0 + 64416 = N 6 0 + 64464 = N 3 120 + 64464 = N 6 0 + 64608 = N 2 0 + 64608 = N 6 0 + 64656 = N 1 0 + 64656 = N 6 0 + 64752 = N 0 0 + 64752 = N 6 0 + 64800 = N 4 264 + 64800 = N 6 0 + 65088 = N 0 0 + 65088 = N 6 0 + 65088 = S 2 1344 + 65136 = N 1 0 + 65136 = N 6 0 + 65184 = N 2 0 + 65184 = N 6 0 + 65232 = N 3 0 + 65232 = N 6 0 + 65280 = N 2 0 + 65280 = N 6 0 + 65328 = N 3 312 + 65328 = N 6 0 + 65664 = N 4 0 + 65664 = N 6 0 + 65712 = N 3 0 + 65712 = N 6 0 + 65760 = N 2 0 + 65760 = N 6 0 + 65808 = N 1 0 + 65808 = N 6 0 + 65856 = N 2 0 + 65856 = N 6 0 + 65904 = N 3 120 + 65904 = N 6 0 + 66048 = N 2 288 + 66048 = N 6 0 + 66496 = N 4 200 + 66496 = N 6 0 + 66720 = N 3 0 + 66720 = N 6 0 + 66816 = N 2 0 + 66816 = N 6 0 + 66864 = N 3 312 + 66864 = N 6 0 + 67200 = N 4 0 + 67200 = N 6 0 + 67248 = N 3 0 + 67248 = N 6 0 + 67296 = N 2 0 + 67296 = N 6 0 + 67344 = N 1 0 + 67344 = N 6 0 + 67392 = N 2 0 + 67392 = N 6 0 + 67440 = N 3 120 + 67440 = N 6 0 + 67584 = N 2 192 + 67584 = N 6 0 + 68040 = N 4 224 + 68040 = N 6 0 + 68288 = N 3 0 + 68288 = N 6 0 + 68352 = N 2 0 + 68352 = N 6 0 + 68384 = N 3 0 + 68384 = N 6 0 + 68416 = N 2 0 + 68416 = N 6 0 + 68448 = N 1 226 + 68448 = N 6 0 + 68698 = N 2 0 + 68698 = N 6 0 + 68736 = N 1 0 + 68736 = N 6 0 + 68774 = N 2 0 + 68774 = N 6 0 + 68813 = N 1 0 + 68813 = N 6 0 + 68851 = N 2 0 + 68851 = N 6 0 + 68890 = N 1 0 + 68890 = N 6 0 + 68928 = N 2 0 + 68928 = N 6 0 + 68966 = N 1 0 + 68966 = N 6 0 + 69005 = N 2 0 + 69005 = N 6 0 + 69043 = N 1 0 + 69043 = N 6 0 + 69082 = N 2 0 + 69082 = N 6 0 + 69120 = N 1 0 + 69120 = N 6 0 + 69158 = N 2 0 + 69158 = N 6 0 + 69197 = N 1 77 + 69197 = N 6 0 + 69792 = N 3 0 + 69792 = N 6 0 + 69824 = N 4 0 + 69824 = N 6 0 + 69856 = N 3 0 + 69856 = N 6 0 + 69888 = N 2 96 + 69888 = N 6 0 + 70008 = N 1 0 + 70008 = N 6 0 + 70080 = N 0 72 + 70080 = N 6 0 + 70176 = N 3 0 + 70176 = N 6 0 + 70208 = N 2 0 + 70208 = N 6 0 + 70240 = N 1 224 + 70240 = N 6 0 + 70528 = N 0 0 + 70528 = N 6 0 + 70560 = N 1 0 + 70560 = N 6 0 + 70592 = N 2 0 + 70592 = N 6 0 + 70624 = N 3 0 + 70624 = N 6 0 + 70656 = N 0 0 + 70656 = N 6 0 + 70688 = N 1 0 + 70688 = N 6 0 + 70720 = N 2 0 + 70720 = N 6 0 + 70752 = N 1 0 + 70752 = N 6 0 + 70784 = N 2 0 + 70784 = N 6 0 + 70816 = N 3 0 + 70816 = N 6 0 + 70848 = N 4 96 + 70848 = N 6 0 + 71424 = N 1 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71472 = N 1 432 + 71472 = N 3 432 + 71472 = N 6 0 + 71936 = N 2 0 + 71936 = N 6 0 + 71968 = N 3 0 + 71968 = N 6 0 + 72000 = N 4 0 + 72000 = N 6 0 + 72060 = N 4 0 + 72060 = N 6 0 + 72132 = N 4 0 + 72132 = N 6 0 + 72208 = N 3 0 + 72208 = N 6 0 + 72240 = N 2 0 + 72240 = N 3 0 + 72240 = N 6 0 + 72288 = N 2 0 + 72288 = N 3 0 + 72288 = N 6 0 + 72336 = N 2 0 + 72336 = N 3 0 + 72336 = N 6 0 + 72384 = N 1 0 + 72384 = N 2 0 + 72384 = N 6 0 + 72432 = N 0 0 + 72432 = N 6 0 + 72456 = N 1 0 + 72456 = N 6 0 + 72480 = N 2 0 + 72480 = N 6 0 + 72528 = N 3 0 + 72528 = N 6 0 + 72576 = N 4 0 + 72576 = N 6 0 + 72600 = N 3 0 + 72600 = N 6 0 + 72624 = N 2 0 + 72624 = N 6 0 + 72648 = N 1 0 + 72648 = N 6 0 + 72672 = N 3 0 + 72672 = N 6 0 + 72696 = N 2 0 + 72696 = N 6 0 + 72720 = N 1 0 + 72720 = N 6 0 + 72744 = N 0 0 + 72744 = N 6 0 + 72768 = N 1 0 + 72768 = N 6 0 + 72816 = N 2 0 + 72816 = N 3 0 + 72816 = N 6 0 + 72864 = N 2 0 + 72864 = N 4 0 + 72864 = N 6 0 + 72912 = N 3 0 + 72912 = N 4 0 + 72912 = N 6 0 + 72976 = N 2 0 + 72976 = N 4 0 + 72976 = N 6 0 + 73032 = N 2 0 + 73032 = N 3 0 + 73032 = N 6 0 + 73104 = N 2 53 + 73104 = N 4 53 + 73104 = N 6 0 + 73168 = N 3 53 + 73168 = N 4 53 + 73168 = N 6 0 + 73232 = N 2 53 + 73232 = N 4 53 + 73232 = N 6 0 + 73296 = N 2 59 + 73296 = N 3 59 + 73296 = N 6 0 + 73368 = N 2 91 + 73368 = N 4 91 + 73368 = N 6 0 + 73472 = N 2 86 + 73472 = N 3 86 + 73472 = N 6 0 + 73568 = N 2 70 + 73568 = N 4 70 + 73568 = N 6 0 + 73648 = N 2 656 + 73648 = N 3 656 + 73648 = N 6 0 +} +[MediumSingle] +{ + 928 = E solo + 960 = N 3 0 + 960 = N 6 0 + 1056 = N 1 0 + 1056 = N 2 0 + 1056 = N 6 0 + 1152 = N 0 0 + 1152 = N 1 0 + 1152 = N 6 0 + 1248 = N 1 0 + 1248 = N 6 0 + 1344 = N 2 0 + 1344 = N 6 0 + 1440 = N 1 0 + 1440 = N 6 0 + 1536 = N 0 168 + 1536 = N 6 0 + 1728 = N 1 0 + 1728 = N 3 0 + 1728 = N 6 0 + 1824 = N 1 456 + 1824 = N 2 456 + 1824 = N 6 0 + 2368 = N 1 0 + 2368 = N 6 0 + 2432 = N 2 0 + 2432 = N 6 0 + 2496 = N 3 0 + 2496 = N 6 0 + 2592 = N 2 0 + 2592 = N 3 0 + 2592 = N 6 0 + 2656 = N 1 0 + 2656 = N 6 0 + 2784 = N 3 0 + 2784 = N 6 0 + 2880 = N 2 0 + 2880 = N 6 0 + 2976 = N 1 0 + 2976 = N 6 0 + 3040 = N 0 205 + 3040 = N 6 0 + 3264 = N 1 0 + 3264 = N 3 0 + 3264 = N 6 0 + 3360 = N 1 456 + 3360 = N 2 456 + 3360 = N 6 0 + 3840 = S 2 1152 + 3888 = N 3 72 + 3888 = N 6 0 + 4032 = N 2 120 + 4032 = N 6 0 + 4224 = N 1 120 + 4224 = N 6 0 + 4416 = N 2 0 + 4416 = N 6 0 + 4512 = N 1 0 + 4512 = N 6 0 + 4608 = N 0 168 + 4608 = N 6 0 + 4800 = N 1 0 + 4800 = N 3 0 + 4800 = N 6 0 + 4896 = N 1 400 + 4896 = N 2 400 + 4896 = N 6 0 + 5376 = N 2 168 + 5376 = N 3 168 + 5376 = N 6 0 + 5568 = N 2 0 + 5568 = N 6 0 + 5632 = N 1 0 + 5632 = N 6 0 + 5728 = N 2 104 + 5728 = N 3 104 + 5728 = N 6 0 + 5856 = N 2 0 + 5856 = N 6 0 + 5920 = N 1 200 + 5920 = N 6 0 + 6144 = N 1 192 + 6144 = N 3 192 + 6144 = N 6 0 + 6432 = N 1 480 + 6432 = N 2 480 + 6432 = N 6 0 + 7104 = N 3 0 + 7104 = N 6 0 + 7168 = N 2 0 + 7168 = N 6 0 + 7296 = N 1 0 + 7296 = N 6 0 + 7392 = N 0 0 + 7392 = N 6 0 + 7584 = N 1 0 + 7584 = N 6 0 + 7632 = N 2 126 + 7632 = N 6 0 + 7776 = N 1 0 + 7776 = N 6 0 + 7872 = N 3 0 + 7872 = N 6 0 + 7968 = N 1 317 + 7968 = N 2 317 + 7968 = N 6 0 + 8304 = N 0 96 + 8304 = N 6 0 + 8448 = N 3 136 + 8448 = N 6 0 + 8640 = N 2 0 + 8640 = N 6 0 + 8688 = N 1 0 + 8688 = N 6 0 + 8784 = N 2 88 + 8784 = N 3 88 + 8784 = N 6 0 + 8928 = N 3 0 + 8928 = N 6 0 + 9024 = N 2 0 + 9024 = N 3 0 + 9024 = N 6 0 + 9120 = N 1 0 + 9120 = N 6 0 + 9216 = N 0 168 + 9216 = N 1 168 + 9216 = N 6 0 + 9408 = N 1 0 + 9408 = N 2 0 + 9408 = N 6 0 + 9504 = N 1 456 + 9504 = N 2 456 + 9504 = N 6 0 + 9888 = E soloend + 9984 = N 1 0 + 9984 = N 6 0 + 10032 = N 2 312 + 10032 = N 6 0 + 10368 = N 2 0 + 10368 = N 6 0 + 10464 = N 1 0 + 10464 = N 6 0 + 10560 = N 1 0 + 10560 = N 6 0 + 10608 = N 2 120 + 10608 = N 6 0 + 10752 = N 0 0 + 10752 = N 1 0 + 10752 = N 6 0 + 10800 = N 0 120 + 10800 = N 1 120 + 10800 = N 6 0 + 11040 = N 2 168 + 11040 = N 3 168 + 11040 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 11328 = N 1 0 + 11328 = N 6 0 + 11424 = N 1 0 + 11424 = N 6 0 + 11520 = N 1 0 + 11520 = N 6 0 + 11520 = S 2 1536 + 11568 = N 2 264 + 11568 = N 6 0 + 11904 = N 2 0 + 11904 = N 6 0 + 12000 = N 1 0 + 12000 = N 6 0 + 12096 = N 1 0 + 12096 = N 6 0 + 12144 = N 2 120 + 12144 = N 6 0 + 12288 = N 0 0 + 12288 = N 1 0 + 12288 = N 6 0 + 12336 = N 0 72 + 12336 = N 1 72 + 12336 = N 6 0 + 12480 = N 3 0 + 12480 = N 6 0 + 12576 = N 1 480 + 12576 = N 2 480 + 12576 = N 6 0 + 13152 = N 1 0 + 13152 = N 6 0 + 13216 = N 2 0 + 13216 = N 6 0 + 13312 = N 2 0 + 13312 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13728 = N 2 0 + 13728 = N 6 0 + 13824 = N 2 0 + 13824 = N 6 0 + 13920 = N 1 0 + 13920 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14112 = N 0 384 + 14112 = N 6 0 + 14688 = N 1 0 + 14688 = N 6 0 + 14752 = N 2 0 + 14752 = N 6 0 + 14880 = N 3 0 + 14880 = N 6 0 + 14976 = N 2 168 + 14976 = N 6 0 + 15168 = N 2 0 + 15168 = N 6 0 + 15264 = N 2 0 + 15264 = N 6 0 + 15360 = N 2 136 + 15360 = N 6 0 + 15520 = N 1 136 + 15520 = N 6 0 + 15680 = N 0 256 + 15680 = N 6 0 + 16128 = N 1 0 + 16128 = N 6 0 + 16224 = N 2 0 + 16224 = N 6 0 + 16288 = N 2 0 + 16288 = N 6 0 + 16416 = N 3 136 + 16416 = N 6 0 + 16576 = N 2 104 + 16576 = N 6 0 + 16704 = N 1 0 + 16704 = N 6 0 + 16800 = N 0 0 + 16800 = N 6 0 + 16896 = N 1 0 + 16896 = N 6 0 + 16992 = N 2 0 + 16992 = N 6 0 + 17088 = N 2 0 + 17088 = N 6 0 + 17184 = N 2 224 + 17184 = N 6 0 + 17664 = N 0 0 + 17664 = N 6 0 + 17760 = N 1 0 + 17760 = N 6 0 + 17824 = N 1 0 + 17824 = N 6 0 + 17920 = N 0 0 + 17920 = N 6 0 + 18048 = N 1 0 + 18048 = N 6 0 + 18144 = N 1 0 + 18144 = N 6 0 + 18240 = N 1 0 + 18240 = N 6 0 + 18336 = N 1 0 + 18336 = N 6 0 + 18432 = N 2 0 + 18432 = N 6 0 + 18528 = N 3 0 + 18528 = N 6 0 + 18624 = N 2 0 + 18624 = N 6 0 + 18720 = N 3 0 + 18720 = N 6 0 + 18784 = N 1 104 + 18784 = N 6 0 + 18912 = N 0 0 + 18912 = N 6 0 + 19008 = N 0 0 + 19008 = N 6 0 + 19104 = N 0 456 + 19104 = N 6 0 + 19584 = N 2 0 + 19584 = N 6 0 + 19680 = N 1 0 + 19680 = N 6 0 + 19776 = N 1 0 + 19776 = N 6 0 + 19824 = N 2 120 + 19824 = N 6 0 + 19968 = N 0 0 + 19968 = N 1 0 + 19968 = N 6 0 + 20016 = N 0 144 + 20016 = N 1 144 + 20016 = N 6 0 + 20256 = N 2 168 + 20256 = N 3 168 + 20256 = N 6 0 + 20448 = N 0 0 + 20448 = N 6 0 + 20544 = N 1 0 + 20544 = N 6 0 + 20640 = N 1 840 + 20640 = N 6 0 + 21504 = N 0 0 + 21504 = N 1 0 + 21504 = N 6 0 + 21552 = N 0 96 + 21552 = N 1 96 + 21552 = N 6 0 + 21696 = N 3 0 + 21696 = N 6 0 + 21792 = N 1 384 + 21792 = N 2 384 + 21792 = N 6 0 + 22272 = S 2 1536 + 22368 = N 1 0 + 22368 = N 6 0 + 22432 = N 2 72 + 22432 = N 6 0 + 22528 = N 2 72 + 22528 = N 6 0 + 22656 = N 3 0 + 22656 = N 6 0 + 22752 = N 2 0 + 22752 = N 6 0 + 22848 = N 1 0 + 22848 = N 6 0 + 22944 = N 0 0 + 22944 = N 6 0 + 23040 = N 2 0 + 23040 = N 6 0 + 23136 = N 1 0 + 23136 = N 6 0 + 23232 = N 1 0 + 23232 = N 6 0 + 23328 = N 0 480 + 23328 = N 6 0 + 23904 = N 1 0 + 23904 = N 6 0 + 23968 = N 2 72 + 23968 = N 6 0 + 24096 = N 3 0 + 24096 = N 6 0 + 24192 = N 2 0 + 24192 = N 6 0 + 24288 = N 1 0 + 24288 = N 6 0 + 24384 = N 1 0 + 24384 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 2 0 + 24576 = N 6 0 + 24672 = N 1 0 + 24672 = N 6 0 + 24768 = N 0 0 + 24768 = N 6 0 + 24864 = N 0 384 + 24864 = N 6 0 + 25344 = N 1 0 + 25344 = N 6 0 + 25440 = N 2 0 + 25440 = N 6 0 + 25504 = N 2 0 + 25504 = N 6 0 + 25632 = N 3 136 + 25632 = N 6 0 + 25792 = N 2 104 + 25792 = N 6 0 + 25920 = N 1 0 + 25920 = N 6 0 + 26016 = N 0 0 + 26016 = N 6 0 + 26112 = N 1 0 + 26112 = N 6 0 + 26208 = N 2 0 + 26208 = N 6 0 + 26304 = N 2 0 + 26304 = N 6 0 + 26400 = N 2 288 + 26400 = N 6 0 + 26880 = N 0 0 + 26880 = N 6 0 + 26976 = N 1 0 + 26976 = N 6 0 + 27040 = N 1 0 + 27040 = N 6 0 + 27136 = N 0 0 + 27136 = N 6 0 + 27264 = N 1 0 + 27264 = N 6 0 + 27360 = N 1 0 + 27360 = N 6 0 + 27456 = N 1 0 + 27456 = N 6 0 + 27552 = N 1 0 + 27552 = N 6 0 + 27648 = N 2 0 + 27648 = N 6 0 + 27744 = N 3 0 + 27744 = N 6 0 + 27840 = N 2 0 + 27840 = N 6 0 + 27936 = N 3 0 + 27936 = N 6 0 + 28000 = N 1 104 + 28000 = N 6 0 + 28128 = N 0 0 + 28128 = N 6 0 + 28224 = N 0 0 + 28224 = N 6 0 + 28320 = N 0 768 + 28320 = N 6 0 + 29184 = N 0 0 + 29184 = N 6 0 + 29232 = N 0 144 + 29232 = N 6 0 + 29472 = N 0 168 + 29472 = N 6 0 + 29664 = N 0 0 + 29664 = N 6 0 + 29760 = N 1 0 + 29760 = N 6 0 + 29856 = N 1 696 + 29856 = N 6 0 + 30720 = N 3 0 + 30720 = N 6 0 + 30816 = N 2 672 + 30816 = N 6 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31776 = N 3 168 + 31776 = N 6 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32064 = N 2 0 + 32064 = N 6 0 + 32112 = N 3 120 + 32112 = N 6 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32352 = N 1 0 + 32352 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 1 384 + 32544 = N 6 0 + 33024 = N 1 120 + 33024 = N 6 0 + 33024 = S 2 768 + 33168 = N 2 120 + 33168 = N 6 0 + 33312 = N 3 456 + 33312 = N 6 0 + 33792 = N 1 0 + 33792 = N 6 0 + 33840 = N 2 192 + 33840 = N 6 0 + 34176 = N 2 0 + 34176 = N 6 0 + 34272 = N 1 0 + 34272 = N 6 0 + 34368 = N 1 0 + 34368 = N 6 0 + 34416 = N 2 120 + 34416 = N 6 0 + 34560 = N 1 0 + 34560 = N 6 0 + 34608 = N 1 144 + 34608 = N 6 0 + 34848 = N 2 384 + 34848 = N 6 0 + 35328 = N 1 0 + 35328 = N 6 0 + 35376 = N 2 192 + 35376 = N 6 0 + 35712 = N 2 0 + 35712 = N 6 0 + 35808 = N 1 0 + 35808 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 35952 = N 2 120 + 35952 = N 6 0 + 36096 = N 1 0 + 36096 = N 6 0 + 36144 = N 1 120 + 36144 = N 6 0 + 36288 = N 3 0 + 36288 = N 6 0 + 36384 = N 2 480 + 36384 = N 6 0 + 36960 = N 3 0 + 36960 = N 6 0 + 36960 = E solo + 37344 = N 0 0 + 37344 = N 6 0 + 37440 = N 1 96 + 37440 = N 6 0 + 37824 = N 1 0 + 37824 = N 6 0 + 37920 = N 0 0 + 37920 = N 6 0 + 38016 = N 0 0 + 38016 = N 6 0 + 38080 = N 1 0 + 38080 = N 6 0 + 38176 = N 0 72 + 38176 = N 6 0 + 38272 = N 1 0 + 38272 = N 6 0 + 38400 = N 0 0 + 38400 = N 6 0 + 38544 = N 1 0 + 38544 = N 6 0 + 38688 = N 0 0 + 38688 = N 6 0 + 38976 = N 3 0 + 38976 = N 6 0 + 39072 = N 2 0 + 39072 = N 6 0 + 39360 = N 0 0 + 39360 = N 6 0 + 39520 = N 1 0 + 39520 = N 6 0 + 39648 = N 2 0 + 39648 = N 6 0 + 39744 = N 0 0 + 39744 = N 6 0 + 39840 = N 1 0 + 39840 = N 6 0 + 39936 = N 0 0 + 39936 = N 6 0 + 40000 = N 0 0 + 40000 = N 6 0 + 40384 = N 1 0 + 40384 = N 6 0 + 40512 = N 2 0 + 40512 = N 6 0 + 40576 = N 3 104 + 40576 = N 6 0 + 40704 = N 1 0 + 40704 = N 6 0 + 40800 = N 0 0 + 40800 = N 6 0 + 40896 = N 0 0 + 40896 = N 6 0 + 40960 = N 1 0 + 40960 = N 6 0 + 41152 = N 2 0 + 41152 = N 6 0 + 41280 = N 2 0 + 41280 = N 6 0 + 41344 = N 3 0 + 41344 = N 6 0 + 41440 = N 1 0 + 41440 = N 6 0 + 41520 = N 2 93 + 41520 = N 6 0 + 41632 = N 2 104 + 41632 = N 6 0 + 41760 = N 1 0 + 41760 = N 6 0 + 41856 = N 1 0 + 41856 = N 6 0 + 41920 = N 0 200 + 41920 = N 6 0 + 42144 = N 1 0 + 42144 = N 6 0 + 42240 = S 2 2304 + 42528 = N 0 0 + 42528 = N 6 0 + 42624 = N 1 0 + 42624 = N 6 0 + 42752 = N 2 104 + 42752 = N 6 0 + 42880 = N 3 72 + 42880 = N 6 0 + 42976 = N 2 296 + 42976 = N 6 0 + 43296 = N 3 0 + 43296 = N 6 0 + 43392 = N 3 0 + 43392 = N 6 0 + 43488 = N 3 0 + 43488 = N 6 0 + 43584 = N 3 0 + 43584 = N 6 0 + 43680 = N 3 0 + 43680 = N 6 0 + 43776 = N 3 0 + 43776 = N 6 0 + 43872 = N 3 0 + 43872 = N 6 0 + 43968 = N 3 0 + 43968 = N 6 0 + 44032 = N 3 0 + 44032 = N 6 0 + 44096 = N 2 128 + 44096 = N 6 0 + 44224 = E soloend + 44640 = N 1 0 + 44640 = N 6 0 + 44704 = N 2 72 + 44704 = N 6 0 + 44832 = N 3 0 + 44832 = N 6 0 + 44928 = N 2 744 + 44928 = N 6 0 + 45696 = N 3 0 + 45696 = N 6 0 + 45792 = N 3 0 + 45792 = N 6 0 + 45888 = N 3 0 + 45888 = N 6 0 + 45984 = N 3 0 + 45984 = N 6 0 + 46080 = N 0 0 + 46080 = N 6 0 + 46176 = N 1 0 + 46176 = N 6 0 + 46240 = N 1 0 + 46240 = N 6 0 + 46368 = N 2 136 + 46368 = N 6 0 + 46560 = N 1 0 + 46560 = N 6 0 + 46624 = N 2 72 + 46624 = N 6 0 + 46752 = N 1 0 + 46752 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 46944 = N 1 0 + 46944 = N 6 0 + 47008 = N 1 0 + 47008 = N 6 0 + 47136 = N 2 328 + 47136 = N 6 0 + 47488 = N 2 104 + 47488 = N 6 0 + 47616 = N 0 0 + 47616 = N 6 0 + 47712 = N 1 0 + 47712 = N 6 0 + 47776 = N 1 0 + 47776 = N 6 0 + 47872 = N 0 0 + 47872 = N 6 0 + 48000 = N 1 0 + 48000 = N 6 0 + 48096 = N 1 0 + 48096 = N 6 0 + 48192 = N 1 0 + 48192 = N 6 0 + 48288 = N 1 0 + 48288 = N 6 0 + 48384 = N 2 0 + 48384 = N 6 0 + 48480 = N 3 0 + 48480 = N 6 0 + 48576 = N 2 0 + 48576 = N 6 0 + 48672 = N 3 104 + 48672 = N 6 0 + 48800 = N 3 0 + 48800 = N 6 0 + 48864 = N 3 0 + 48864 = N 6 0 + 48928 = N 3 0 + 48928 = N 6 0 + 48992 = N 3 0 + 48992 = N 6 0 + 49056 = N 3 0 + 49056 = N 6 0 + 49152 = N 3 360 + 49152 = N 6 0 + 49536 = N 2 360 + 49536 = N 6 0 + 49920 = N 1 360 + 49920 = N 6 0 + 50304 = N 0 384 + 50304 = N 6 0 + 51168 = N 0 0 + 51168 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51360 = N 0 1152 + 51360 = N 6 0 + 52704 = N 0 0 + 52704 = N 6 0 + 52800 = N 0 0 + 52800 = N 6 0 + 52896 = N 0 0 + 52896 = N 6 0 + 52992 = N 1 0 + 52992 = N 6 0 + 52992 = S 2 1536 + 53040 = N 2 192 + 53040 = N 6 0 + 53376 = N 2 0 + 53376 = N 6 0 + 53472 = N 1 0 + 53472 = N 6 0 + 53568 = N 1 0 + 53568 = N 6 0 + 53616 = N 2 120 + 53616 = N 6 0 + 53760 = N 1 0 + 53760 = N 6 0 + 53808 = N 1 144 + 53808 = N 6 0 + 54048 = N 3 384 + 54048 = N 6 0 + 54528 = N 1 0 + 54528 = N 6 0 + 54576 = N 2 192 + 54576 = N 6 0 + 54912 = N 2 0 + 54912 = N 6 0 + 55008 = N 1 0 + 55008 = N 6 0 + 55104 = N 1 0 + 55104 = N 6 0 + 55152 = N 2 120 + 55152 = N 6 0 + 55296 = N 1 0 + 55296 = N 6 0 + 55344 = N 1 120 + 55344 = N 6 0 + 55488 = N 3 0 + 55488 = N 6 0 + 55584 = N 2 432 + 55584 = N 6 0 + 56064 = N 1 0 + 56064 = N 6 0 + 56128 = N 2 0 + 56128 = N 6 0 + 56208 = N 3 124 + 56208 = N 6 0 + 56352 = N 1 0 + 56352 = N 6 0 + 56416 = N 2 0 + 56416 = N 6 0 + 56496 = N 3 124 + 56496 = N 6 0 + 56640 = N 1 0 + 56640 = N 6 0 + 56704 = N 2 0 + 56704 = N 6 0 + 56784 = N 3 124 + 56784 = N 6 0 + 56928 = N 1 0 + 56928 = N 6 0 + 56976 = N 2 0 + 56976 = N 6 0 + 57072 = N 3 124 + 57072 = N 6 0 + 57216 = N 2 0 + 57216 = N 6 0 + 57312 = N 1 0 + 57312 = N 6 0 + 57408 = N 0 0 + 57408 = N 6 0 + 57472 = N 0 608 + 57472 = N 6 0 + 58368 = N 1 0 + 58368 = N 6 0 + 58464 = N 2 0 + 58464 = N 6 0 + 58512 = N 3 72 + 58512 = N 6 0 + 58656 = N 2 0 + 58656 = N 6 0 + 58752 = N 1 0 + 58752 = N 6 0 + 58896 = N 0 0 + 58896 = N 6 0 + 59040 = N 1 192 + 59040 = N 6 0 + 59328 = N 2 0 + 59328 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59520 = N 3 0 + 59520 = N 6 0 + 59616 = N 2 0 + 59616 = N 6 0 + 59712 = N 1 0 + 59712 = N 6 0 + 59808 = N 3 0 + 59808 = N 6 0 + 59856 = N 2 120 + 59856 = N 6 0 + 60048 = N 1 0 + 60048 = N 6 0 + 60192 = N 0 264 + 60192 = N 6 0 + 60480 = N 0 0 + 60480 = N 6 0 + 60576 = N 1 0 + 60576 = N 6 0 + 60672 = N 1 0 + 60672 = N 6 0 + 60736 = N 2 0 + 60736 = N 6 0 + 60816 = N 3 124 + 60816 = N 6 0 + 60960 = N 1 0 + 60960 = N 6 0 + 61024 = N 2 0 + 61024 = N 6 0 + 61120 = N 3 104 + 61120 = N 6 0 + 61248 = N 1 0 + 61248 = N 6 0 + 61312 = N 2 0 + 61312 = N 6 0 + 61392 = N 3 124 + 61392 = N 6 0 + 61536 = N 1 0 + 61536 = N 6 0 + 61600 = N 2 0 + 61600 = N 6 0 + 61696 = N 3 104 + 61696 = N 6 0 + 61824 = N 2 0 + 61824 = N 6 0 + 61920 = N 1 0 + 61920 = N 6 0 + 62016 = N 0 0 + 62016 = N 6 0 + 62112 = N 0 768 + 62112 = N 6 0 + 62976 = N 1 0 + 62976 = N 6 0 + 63072 = N 2 0 + 63072 = N 6 0 + 63120 = N 3 72 + 63120 = N 6 0 + 63264 = N 2 0 + 63264 = N 6 0 + 63360 = N 1 0 + 63360 = N 6 0 + 63504 = N 0 0 + 63504 = N 6 0 + 63648 = N 1 192 + 63648 = N 6 0 + 63936 = N 2 0 + 63936 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64128 = N 3 0 + 64128 = N 6 0 + 64224 = N 2 0 + 64224 = N 6 0 + 64320 = N 1 0 + 64320 = N 6 0 + 64416 = N 3 0 + 64416 = N 6 0 + 64464 = N 2 120 + 64464 = N 6 0 + 64656 = N 1 0 + 64656 = N 6 0 + 64800 = N 3 264 + 64800 = N 6 0 + 65088 = N 0 0 + 65088 = N 6 0 + 65088 = S 2 1344 + 65184 = N 1 0 + 65184 = N 6 0 + 65280 = N 1 0 + 65280 = N 6 0 + 65328 = N 2 312 + 65328 = N 6 0 + 65664 = N 2 0 + 65664 = N 6 0 + 65760 = N 1 0 + 65760 = N 6 0 + 65856 = N 1 0 + 65856 = N 6 0 + 65904 = N 2 120 + 65904 = N 6 0 + 66048 = N 1 288 + 66048 = N 6 0 + 66496 = N 3 200 + 66496 = N 6 0 + 66720 = N 2 0 + 66720 = N 6 0 + 66816 = N 1 0 + 66816 = N 6 0 + 66864 = N 2 312 + 66864 = N 6 0 + 67200 = N 2 0 + 67200 = N 6 0 + 67296 = N 1 0 + 67296 = N 6 0 + 67392 = N 1 0 + 67392 = N 6 0 + 67440 = N 2 120 + 67440 = N 6 0 + 67584 = N 1 192 + 67584 = N 6 0 + 68040 = N 3 224 + 68040 = N 6 0 + 68288 = N 2 0 + 68288 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68448 = N 0 226 + 68448 = N 6 0 + 68736 = N 1 0 + 68736 = N 6 0 + 68813 = N 1 0 + 68813 = N 6 0 + 68890 = N 1 0 + 68890 = N 6 0 + 68966 = N 1 0 + 68966 = N 6 0 + 69043 = N 1 0 + 69043 = N 6 0 + 69120 = N 1 0 + 69120 = N 6 0 + 69197 = N 1 77 + 69197 = N 6 0 + 69792 = N 3 0 + 69792 = N 6 0 + 69888 = N 2 96 + 69888 = N 6 0 + 70008 = N 3 0 + 70008 = N 6 0 + 70080 = N 2 72 + 70080 = N 6 0 + 70176 = N 1 0 + 70176 = N 6 0 + 70240 = N 0 224 + 70240 = N 6 0 + 70560 = N 0 0 + 70560 = N 6 0 + 70656 = N 1 0 + 70656 = N 6 0 + 70752 = N 2 0 + 70752 = N 6 0 + 70848 = N 3 96 + 70848 = N 6 0 + 71424 = N 1 0 + 71424 = N 6 0 + 71472 = N 2 432 + 71472 = N 6 0 + 72000 = N 3 0 + 72000 = N 6 0 + 72060 = N 3 0 + 72060 = N 6 0 + 72132 = N 3 0 + 72132 = N 6 0 + 72192 = N 2 0 + 72192 = N 6 0 + 72240 = N 1 0 + 72240 = N 6 0 + 72288 = N 1 0 + 72288 = N 6 0 + 72336 = N 1 0 + 72336 = N 6 0 + 72384 = N 0 0 + 72384 = N 6 0 + 72432 = N 1 0 + 72432 = N 6 0 + 72480 = N 2 0 + 72480 = N 6 0 + 72576 = N 3 0 + 72576 = N 6 0 + 72624 = N 2 0 + 72624 = N 6 0 + 72672 = N 1 0 + 72672 = N 6 0 + 72720 = N 0 0 + 72720 = N 6 0 + 72768 = N 0 0 + 72768 = N 6 0 + 72816 = N 1 0 + 72816 = N 6 0 + 72864 = N 2 0 + 72864 = N 6 0 + 72912 = N 3 0 + 72912 = N 6 0 + 72976 = N 2 0 + 72976 = N 6 0 + 73032 = N 1 59 + 73032 = N 6 0 + 73104 = N 2 53 + 73104 = N 6 0 + 73168 = N 3 53 + 73168 = N 6 0 + 73232 = N 2 53 + 73232 = N 6 0 + 73296 = N 1 59 + 73296 = N 6 0 + 73368 = N 2 91 + 73368 = N 6 0 + 73472 = N 1 86 + 73472 = N 6 0 + 73568 = N 2 70 + 73568 = N 6 0 + 73648 = N 1 656 + 73648 = N 6 0 +} +[EasySingle] +{ + 928 = E solo + 960 = N 2 0 + 960 = N 6 0 + 1056 = N 1 0 + 1056 = N 6 0 + 1152 = N 0 0 + 1152 = N 6 0 + 1248 = N 1 0 + 1248 = N 6 0 + 1344 = N 2 0 + 1344 = N 6 0 + 1440 = N 1 0 + 1440 = N 6 0 + 1536 = N 0 168 + 1536 = N 6 0 + 1728 = N 2 0 + 1728 = N 6 0 + 1824 = N 1 456 + 1824 = N 6 0 + 2368 = N 1 0 + 2368 = N 6 0 + 2496 = N 2 0 + 2496 = N 6 0 + 2592 = N 1 0 + 2592 = N 6 0 + 2784 = N 2 0 + 2784 = N 6 0 + 2880 = N 1 0 + 2880 = N 6 0 + 2976 = N 1 0 + 2976 = N 6 0 + 3040 = N 0 205 + 3040 = N 6 0 + 3264 = N 2 0 + 3264 = N 6 0 + 3360 = N 1 456 + 3360 = N 6 0 + 3840 = S 2 1152 + 3888 = N 2 72 + 3888 = N 6 0 + 4032 = N 1 120 + 4032 = N 6 0 + 4224 = N 0 120 + 4224 = N 6 0 + 4416 = N 2 0 + 4416 = N 6 0 + 4512 = N 1 0 + 4512 = N 6 0 + 4608 = N 0 168 + 4608 = N 6 0 + 4800 = N 2 0 + 4800 = N 6 0 + 4896 = N 1 400 + 4896 = N 6 0 + 5376 = N 2 168 + 5376 = N 6 0 + 5568 = N 1 0 + 5568 = N 6 0 + 5728 = N 2 104 + 5728 = N 6 0 + 5856 = N 1 0 + 5856 = N 6 0 + 5920 = N 0 200 + 5920 = N 6 0 + 6144 = N 2 192 + 6144 = N 6 0 + 6432 = N 1 480 + 6432 = N 6 0 + 7104 = N 2 0 + 7104 = N 6 0 + 7296 = N 1 0 + 7296 = N 6 0 + 7392 = N 0 0 + 7392 = N 6 0 + 7536 = N 0 0 + 7536 = N 6 0 + 7632 = N 2 126 + 7632 = N 6 0 + 7776 = N 0 0 + 7776 = N 6 0 + 7872 = N 2 0 + 7872 = N 6 0 + 7968 = N 1 317 + 7968 = N 6 0 + 8304 = N 0 96 + 8304 = N 6 0 + 8448 = N 2 136 + 8448 = N 6 0 + 8640 = N 0 0 + 8640 = N 6 0 + 8784 = N 1 88 + 8784 = N 6 0 + 8928 = N 2 0 + 8928 = N 6 0 + 9024 = N 1 0 + 9024 = N 6 0 + 9216 = N 0 168 + 9216 = N 6 0 + 9408 = N 1 0 + 9408 = N 6 0 + 9504 = N 1 456 + 9504 = N 6 0 + 9888 = E soloend + 9984 = N 1 360 + 9984 = N 6 0 + 10368 = N 2 0 + 10368 = N 6 0 + 10464 = N 1 0 + 10464 = N 6 0 + 10560 = N 1 168 + 10560 = N 6 0 + 10752 = N 0 0 + 10752 = N 6 0 + 10800 = N 0 120 + 10800 = N 6 0 + 11040 = N 2 168 + 11040 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 11328 = N 1 0 + 11328 = N 6 0 + 11520 = N 1 360 + 11520 = N 6 0 + 11520 = S 2 1536 + 11904 = N 2 0 + 11904 = N 6 0 + 12000 = N 1 0 + 12000 = N 6 0 + 12096 = N 1 168 + 12096 = N 6 0 + 12288 = N 0 0 + 12288 = N 6 0 + 12336 = N 0 72 + 12336 = N 6 0 + 12480 = N 2 0 + 12480 = N 6 0 + 12576 = N 1 480 + 12576 = N 6 0 + 13152 = N 0 0 + 13152 = N 6 0 + 13312 = N 1 0 + 13312 = N 6 0 + 13440 = N 2 0 + 13440 = N 6 0 + 13632 = N 1 0 + 13632 = N 6 0 + 13824 = N 1 0 + 13824 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14112 = N 0 384 + 14112 = N 6 0 + 14688 = N 0 0 + 14688 = N 6 0 + 14880 = N 2 0 + 14880 = N 6 0 + 14976 = N 1 168 + 14976 = N 6 0 + 15168 = N 2 0 + 15168 = N 6 0 + 15360 = N 2 136 + 15360 = N 6 0 + 15520 = N 1 136 + 15520 = N 6 0 + 15680 = N 0 256 + 15680 = N 6 0 + 16128 = N 0 0 + 16128 = N 6 0 + 16288 = N 1 0 + 16288 = N 6 0 + 16416 = N 2 136 + 16416 = N 6 0 + 16576 = N 1 104 + 16576 = N 6 0 + 16704 = N 0 0 + 16704 = N 6 0 + 16896 = N 0 0 + 16896 = N 6 0 + 17088 = N 1 0 + 17088 = N 6 0 + 17184 = N 1 224 + 17184 = N 6 0 + 17664 = N 0 0 + 17664 = N 6 0 + 17824 = N 1 0 + 17824 = N 6 0 + 17920 = N 0 0 + 17920 = N 6 0 + 18048 = N 1 0 + 18048 = N 6 0 + 18240 = N 1 0 + 18240 = N 6 0 + 18432 = N 2 0 + 18432 = N 6 0 + 18720 = N 1 0 + 18720 = N 6 0 + 18912 = N 0 0 + 18912 = N 6 0 + 19008 = N 0 0 + 19008 = N 6 0 + 19104 = N 0 456 + 19104 = N 6 0 + 19584 = N 2 0 + 19584 = N 6 0 + 19776 = N 1 168 + 19776 = N 6 0 + 19968 = N 0 0 + 19968 = N 6 0 + 20016 = N 0 144 + 20016 = N 6 0 + 20256 = N 2 168 + 20256 = N 6 0 + 20448 = N 0 0 + 20448 = N 6 0 + 20544 = N 1 0 + 20544 = N 6 0 + 20640 = N 1 840 + 20640 = N 6 0 + 21504 = N 0 0 + 21504 = N 6 0 + 21552 = N 0 96 + 21552 = N 6 0 + 21696 = N 2 0 + 21696 = N 6 0 + 21792 = N 1 384 + 21792 = N 6 0 + 22272 = S 2 1536 + 22368 = N 0 0 + 22368 = N 6 0 + 22528 = N 1 72 + 22528 = N 6 0 + 22656 = N 2 0 + 22656 = N 6 0 + 22752 = N 1 0 + 22752 = N 6 0 + 22848 = N 0 0 + 22848 = N 6 0 + 23040 = N 2 0 + 23040 = N 6 0 + 23232 = N 1 0 + 23232 = N 6 0 + 23328 = N 0 480 + 23328 = N 6 0 + 23904 = N 0 0 + 23904 = N 6 0 + 24096 = N 2 0 + 24096 = N 6 0 + 24192 = N 1 0 + 24192 = N 6 0 + 24384 = N 0 0 + 24384 = N 6 0 + 24576 = N 1 0 + 24576 = N 6 0 + 24768 = N 0 0 + 24768 = N 6 0 + 24864 = N 0 384 + 24864 = N 6 0 + 25344 = N 0 0 + 25344 = N 6 0 + 25504 = N 1 0 + 25504 = N 6 0 + 25632 = N 2 136 + 25632 = N 6 0 + 25792 = N 1 104 + 25792 = N 6 0 + 25920 = N 0 0 + 25920 = N 6 0 + 26112 = N 0 0 + 26112 = N 6 0 + 26304 = N 1 0 + 26304 = N 6 0 + 26400 = N 1 288 + 26400 = N 6 0 + 26880 = N 0 0 + 26880 = N 6 0 + 27040 = N 1 0 + 27040 = N 6 0 + 27136 = N 0 0 + 27136 = N 6 0 + 27264 = N 1 0 + 27264 = N 6 0 + 27456 = N 1 0 + 27456 = N 6 0 + 27648 = N 2 0 + 27648 = N 6 0 + 27840 = N 2 0 + 27840 = N 6 0 + 27936 = N 1 0 + 27936 = N 6 0 + 28128 = N 0 0 + 28128 = N 6 0 + 28224 = N 0 0 + 28224 = N 6 0 + 28320 = N 0 768 + 28320 = N 6 0 + 29184 = N 0 0 + 29184 = N 6 0 + 29232 = N 0 144 + 29232 = N 6 0 + 29472 = N 0 168 + 29472 = N 6 0 + 29664 = N 0 0 + 29664 = N 6 0 + 29760 = N 1 0 + 29760 = N 6 0 + 29856 = N 1 696 + 29856 = N 6 0 + 30720 = N 2 768 + 30720 = N 6 0 + 31680 = N 1 0 + 31680 = N 6 0 + 31776 = N 2 168 + 31776 = N 6 0 + 31968 = N 1 0 + 31968 = N 6 0 + 32064 = N 1 0 + 32064 = N 6 0 + 32256 = N 1 0 + 32256 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 1 384 + 32544 = N 6 0 + 33024 = N 0 120 + 33024 = N 6 0 + 33024 = S 2 768 + 33168 = N 1 120 + 33168 = N 6 0 + 33312 = N 2 456 + 33312 = N 6 0 + 33792 = N 1 240 + 33792 = N 6 0 + 34176 = N 2 0 + 34176 = N 6 0 + 34272 = N 1 0 + 34272 = N 6 0 + 34368 = N 1 168 + 34368 = N 6 0 + 34560 = N 0 0 + 34560 = N 6 0 + 34608 = N 0 144 + 34608 = N 6 0 + 34848 = N 1 384 + 34848 = N 6 0 + 35328 = N 1 240 + 35328 = N 6 0 + 35712 = N 2 0 + 35712 = N 6 0 + 35904 = N 1 168 + 35904 = N 6 0 + 36096 = N 0 0 + 36096 = N 6 0 + 36144 = N 0 120 + 36144 = N 6 0 + 36288 = N 2 0 + 36288 = N 6 0 + 36384 = N 1 480 + 36384 = N 6 0 + 36960 = N 2 0 + 36960 = N 6 0 + 36960 = E solo + 37344 = N 0 0 + 37344 = N 6 0 + 37440 = N 1 96 + 37440 = N 6 0 + 37824 = N 1 0 + 37824 = N 6 0 + 37920 = N 0 0 + 37920 = N 6 0 + 38016 = N 0 0 + 38016 = N 6 0 + 38176 = N 0 72 + 38176 = N 6 0 + 38400 = N 0 0 + 38400 = N 6 0 + 38544 = N 1 0 + 38544 = N 6 0 + 38688 = N 0 0 + 38688 = N 6 0 + 38976 = N 2 0 + 38976 = N 6 0 + 39072 = N 1 0 + 39072 = N 6 0 + 39360 = N 0 0 + 39360 = N 6 0 + 39520 = N 1 0 + 39520 = N 6 0 + 39648 = N 2 0 + 39648 = N 6 0 + 39744 = N 0 0 + 39744 = N 6 0 + 39936 = N 0 0 + 39936 = N 6 0 + 40000 = N 0 0 + 40000 = N 6 0 + 40384 = N 1 0 + 40384 = N 6 0 + 40512 = N 2 0 + 40512 = N 6 0 + 40704 = N 1 0 + 40704 = N 6 0 + 40896 = N 0 0 + 40896 = N 6 0 + 40960 = N 1 0 + 40960 = N 6 0 + 41280 = N 0 0 + 41280 = N 6 0 + 41424 = N 1 0 + 41424 = N 6 0 + 41520 = N 2 93 + 41520 = N 6 0 + 41632 = N 2 104 + 41632 = N 6 0 + 41760 = N 1 0 + 41760 = N 6 0 + 41856 = N 1 0 + 41856 = N 6 0 + 41920 = N 0 200 + 41920 = N 6 0 + 42144 = N 1 0 + 42144 = N 6 0 + 42240 = S 2 2304 + 42624 = N 0 0 + 42624 = N 6 0 + 42752 = N 1 104 + 42752 = N 6 0 + 42880 = N 2 72 + 42880 = N 6 0 + 42976 = N 1 296 + 42976 = N 6 0 + 43296 = N 2 0 + 43296 = N 6 0 + 43392 = N 2 0 + 43392 = N 6 0 + 43488 = N 2 0 + 43488 = N 6 0 + 43584 = N 2 0 + 43584 = N 6 0 + 43680 = N 2 0 + 43680 = N 6 0 + 43776 = N 2 0 + 43776 = N 6 0 + 43872 = N 2 0 + 43872 = N 6 0 + 43968 = N 2 0 + 43968 = N 6 0 + 44096 = N 2 128 + 44096 = N 6 0 + 44224 = E soloend + 44640 = N 0 0 + 44640 = N 6 0 + 44832 = N 2 0 + 44832 = N 6 0 + 44928 = N 1 744 + 44928 = N 6 0 + 45696 = N 2 0 + 45696 = N 6 0 + 45792 = N 2 0 + 45792 = N 6 0 + 45888 = N 2 0 + 45888 = N 6 0 + 46080 = N 0 0 + 46080 = N 6 0 + 46240 = N 1 0 + 46240 = N 6 0 + 46368 = N 2 136 + 46368 = N 6 0 + 46624 = N 2 72 + 46624 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 47008 = N 1 0 + 47008 = N 6 0 + 47136 = N 2 328 + 47136 = N 6 0 + 47488 = N 2 104 + 47488 = N 6 0 + 47616 = N 0 0 + 47616 = N 6 0 + 47776 = N 1 0 + 47776 = N 6 0 + 47872 = N 0 0 + 47872 = N 6 0 + 48000 = N 1 0 + 48000 = N 6 0 + 48192 = N 1 0 + 48192 = N 6 0 + 48384 = N 1 0 + 48384 = N 6 0 + 48576 = N 1 0 + 48576 = N 6 0 + 48672 = N 2 104 + 48672 = N 6 0 + 48864 = N 2 0 + 48864 = N 6 0 + 48992 = N 2 0 + 48992 = N 6 0 + 49152 = N 2 744 + 49152 = N 6 0 + 49920 = N 1 360 + 49920 = N 6 0 + 50304 = N 0 384 + 50304 = N 6 0 + 51168 = N 0 0 + 51168 = N 6 0 + 51264 = N 0 0 + 51264 = N 6 0 + 51360 = N 0 1152 + 51360 = N 6 0 + 52704 = N 0 0 + 52704 = N 6 0 + 52800 = N 0 0 + 52800 = N 6 0 + 52896 = N 0 0 + 52896 = N 6 0 + 52992 = N 1 240 + 52992 = N 6 0 + 52992 = S 2 1536 + 53376 = N 2 0 + 53376 = N 6 0 + 53568 = N 1 168 + 53568 = N 6 0 + 53760 = N 0 0 + 53760 = N 6 0 + 53808 = N 0 144 + 53808 = N 6 0 + 54048 = N 2 384 + 54048 = N 6 0 + 54528 = N 1 240 + 54528 = N 6 0 + 54912 = N 2 0 + 54912 = N 6 0 + 55104 = N 1 168 + 55104 = N 6 0 + 55296 = N 0 0 + 55296 = N 6 0 + 55344 = N 0 120 + 55344 = N 6 0 + 55488 = N 2 0 + 55488 = N 6 0 + 55584 = N 1 432 + 55584 = N 6 0 + 56064 = N 1 0 + 56064 = N 6 0 + 56208 = N 2 124 + 56208 = N 6 0 + 56352 = N 1 0 + 56352 = N 6 0 + 56496 = N 2 124 + 56496 = N 6 0 + 56640 = N 1 0 + 56640 = N 6 0 + 56784 = N 2 124 + 56784 = N 6 0 + 56928 = N 1 0 + 56928 = N 6 0 + 57072 = N 2 124 + 57072 = N 6 0 + 57216 = N 1 0 + 57216 = N 6 0 + 57408 = N 0 0 + 57408 = N 6 0 + 57472 = N 0 608 + 57472 = N 6 0 + 58368 = N 1 0 + 58368 = N 6 0 + 58512 = N 2 0 + 58512 = N 6 0 + 58752 = N 1 0 + 58752 = N 6 0 + 58896 = N 0 0 + 58896 = N 6 0 + 59040 = N 1 192 + 59040 = N 6 0 + 59328 = N 1 0 + 59328 = N 6 0 + 59424 = N 1 0 + 59424 = N 6 0 + 59520 = N 2 0 + 59520 = N 6 0 + 59712 = N 1 0 + 59712 = N 6 0 + 59856 = N 2 120 + 59856 = N 6 0 + 60048 = N 1 0 + 60048 = N 6 0 + 60192 = N 0 264 + 60192 = N 6 0 + 60480 = N 0 0 + 60480 = N 6 0 + 60672 = N 1 0 + 60672 = N 6 0 + 60816 = N 2 124 + 60816 = N 6 0 + 60960 = N 1 0 + 60960 = N 6 0 + 61120 = N 2 104 + 61120 = N 6 0 + 61248 = N 1 0 + 61248 = N 6 0 + 61392 = N 2 124 + 61392 = N 6 0 + 61536 = N 1 0 + 61536 = N 6 0 + 61696 = N 2 104 + 61696 = N 6 0 + 61824 = N 1 0 + 61824 = N 6 0 + 62016 = N 0 0 + 62016 = N 6 0 + 62112 = N 0 768 + 62112 = N 6 0 + 62976 = N 1 0 + 62976 = N 6 0 + 63120 = N 2 0 + 63120 = N 6 0 + 63360 = N 1 0 + 63360 = N 6 0 + 63504 = N 0 0 + 63504 = N 6 0 + 63648 = N 1 192 + 63648 = N 6 0 + 63936 = N 1 0 + 63936 = N 6 0 + 64032 = N 1 0 + 64032 = N 6 0 + 64128 = N 2 0 + 64128 = N 6 0 + 64320 = N 1 0 + 64320 = N 6 0 + 64464 = N 2 120 + 64464 = N 6 0 + 64656 = N 1 0 + 64656 = N 6 0 + 64800 = N 2 264 + 64800 = N 6 0 + 65088 = N 0 0 + 65088 = N 6 0 + 65088 = S 2 1344 + 65280 = N 1 360 + 65280 = N 6 0 + 65664 = N 2 0 + 65664 = N 6 0 + 65760 = N 1 0 + 65760 = N 6 0 + 65856 = N 1 168 + 65856 = N 6 0 + 66048 = N 1 288 + 66048 = N 6 0 + 66496 = N 2 200 + 66496 = N 6 0 + 66816 = N 1 360 + 66816 = N 6 0 + 67200 = N 2 0 + 67200 = N 6 0 + 67296 = N 1 0 + 67296 = N 6 0 + 67392 = N 1 168 + 67392 = N 6 0 + 67584 = N 1 192 + 67584 = N 6 0 + 68040 = N 2 224 + 68040 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68448 = N 0 226 + 68448 = N 6 0 + 68736 = N 1 0 + 68736 = N 6 0 + 68890 = N 1 0 + 68890 = N 6 0 + 69043 = N 1 0 + 69043 = N 6 0 + 69197 = N 1 77 + 69197 = N 6 0 + 69792 = N 2 0 + 69792 = N 6 0 + 69888 = N 1 96 + 69888 = N 6 0 + 70080 = N 2 72 + 70080 = N 6 0 + 70176 = N 1 0 + 70176 = N 6 0 + 70240 = N 0 224 + 70240 = N 6 0 + 70656 = N 0 0 + 70656 = N 6 0 + 70752 = N 1 0 + 70752 = N 6 0 + 70848 = N 2 96 + 70848 = N 6 0 + 71424 = N 1 480 + 71424 = N 6 0 + 72000 = N 2 0 + 72000 = N 6 0 + 72132 = N 2 0 + 72132 = N 6 0 + 72240 = N 1 0 + 72240 = N 6 0 + 72336 = N 1 0 + 72336 = N 6 0 + 72384 = N 0 0 + 72384 = N 6 0 + 72480 = N 1 0 + 72480 = N 6 0 + 72576 = N 2 0 + 72576 = N 6 0 + 72672 = N 1 0 + 72672 = N 6 0 + 72768 = N 0 0 + 72768 = N 6 0 + 72864 = N 1 0 + 72864 = N 6 0 + 72912 = N 2 0 + 72912 = N 6 0 + 72976 = N 1 0 + 72976 = N 6 0 + 73032 = N 0 59 + 73032 = N 6 0 + 73104 = N 1 53 + 73104 = N 6 0 + 73168 = N 2 53 + 73168 = N 6 0 + 73232 = N 1 48 + 73232 = N 6 0 + 73296 = N 0 59 + 73296 = N 6 0 + 73368 = N 1 91 + 73368 = N 6 0 + 73472 = N 0 86 + 73472 = N 6 0 + 73568 = N 1 70 + 73568 = N 6 0 + 73648 = N 0 656 + 73648 = N 6 0 +} diff --git a/songs/Maynard-Ferguson-Theme-From-Shaft/notes.chart b/songs/Maynard-Ferguson-Theme-From-Shaft/notes.chart new file mode 100644 index 0000000..f3b83a0 --- /dev/null +++ b/songs/Maynard-Ferguson-Theme-From-Shaft/notes.chart @@ -0,0 +1,6123 @@ +[Song] +{ + Name = "Theme From Shaft" + Artist = "Maynard Ferguson" + Charter = "GuitarZero132" + Album = "M.F. horn Two" + Year = ", 1972" + Offset = 0 + Resolution = 192 + Player2 = bass + Difficulty = 3 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "Jazz Fusion" + MediaType = "cd" + MusicStream = "song.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 133000 + 1536 = B 133000 + 2496 = B 131000 + 5376 = B 140000 + 6144 = B 130000 + 8832 = B 139000 + 9216 = B 131000 + 10752 = B 133000 + 12672 = B 131000 + 15360 = TS 3 + 15360 = B 132000 + 15936 = TS 4 + 16512 = B 135000 + 17472 = B 134000 + 18432 = B 136000 + 19008 = B 134000 + 20544 = B 133000 + 22464 = B 132000 + 23616 = B 132000 + 24384 = B 138000 + 25152 = B 132000 + 25920 = B 134000 + 26688 = B 130000 + 27456 = B 132000 + 28224 = B 132000 + 29760 = B 135000 + 31296 = B 133000 + 32064 = TS 5 + 32064 = B 135000 + 33024 = TS 4 + 33024 = B 130000 + 34560 = B 133000 + 35328 = TS 3 + 35712 = B 130000 + 35904 = TS 4 + 36864 = B 130000 + 37440 = B 134000 + 38208 = B 132000 + 39552 = B 135000 + 40512 = B 133000 + 42048 = B 135000 + 43968 = B 133000 + 45504 = B 132000 + 49152 = B 130000 + 49920 = B 137000 + 50496 = B 132000 + 51264 = B 128000 + 52032 = B 131000 + 52800 = B 136000 + 53568 = B 129000 + 55488 = B 133000 + 56064 = B 137000 + 56256 = B 143000 + 56640 = B 127000 + 57216 = B 134000 + 57792 = B 126000 + 58560 = B 131000 + 60672 = B 136000 + 61248 = B 134000 + 62784 = B 129000 + 63552 = B 132000 + 63744 = B 131000 + 65088 = TS 5 + 65088 = B 132000 + 66048 = TS 4 + 66048 = B 132000 + 66816 = B 134000 + 69120 = B 133000 + 72960 = B 136000 + 75264 = B 139000 + 77568 = B 139000 + 79104 = B 139000 + 80064 = B 134000 + 81024 = B 137000 + 82752 = B 138000 + 83712 = B 137000 + 84480 = B 136000 + 85824 = B 137000 + 88128 = B 136000 + 90048 = B 138000 + 90624 = B 139000 + 92160 = B 137000 + 94272 = B 135000 + 95232 = B 141000 + 96768 = B 127000 + 96960 = B 133000 + 97536 = B 134000 + 98304 = B 134000 + 99840 = B 133000 + 102144 = TS 5 + 102336 = B 135000 + 102912 = B 134000 + 103104 = TS 4 + 103104 = B 132000 + 104256 = B 134000 + 106176 = B 137000 + 106944 = B 137000 + 107712 = B 136000 + 109056 = B 132000 + 110784 = B 131000 + 112320 = B 139000 + 113088 = B 130000 + 115584 = B 137000 + 116160 = B 131000 + 118272 = B 136000 + 119232 = B 132000 + 121536 = B 137000 + 122304 = B 134000 +} +[Events] +{ + 1536 = E "section Percussion Intro" + 6144 = E "section Intro" + 12288 = E "section Keyboard Fills 1A" + 15936 = E "section Keyboard Fills 1B" + 22080 = E "section Keyboard Fills 1C" + 26688 = E "section Keyboard Fills 1D" + 33024 = E "section Low Riff 1A" + 40512 = E "section Low Riff 1B" + 47424 = E "section Chorus A" + 53568 = E "section Chorus B" + 59712 = E "section Saxophone Lead" + 66048 = E "section Low Riff 2" + 73728 = E "section Trombone Solo A" + 79872 = E "section Trombone Solo B" + 86016 = E "section Trombone Solo C" + 92160 = E "section Trombone Solo D" + 96768 = E "section Trumpet Lead" + 103104 = E "section Low Riff 3" + 113088 = E "section Intro Theme" + 119232 = E "section Keyboard Fills 2" +} +[ExpertSingle] +{ + 6144 = N 3 0 + 6144 = N 6 0 + 6240 = N 4 0 + 6240 = N 6 0 + 6336 = N 3 0 + 6336 = N 6 0 + 6432 = N 2 0 + 6432 = N 6 0 + 6624 = N 0 0 + 6624 = N 6 0 + 6720 = N 3 0 + 6720 = N 6 0 + 6816 = N 4 0 + 6816 = N 6 0 + 6912 = N 3 0 + 6912 = N 6 0 + 7008 = N 2 0 + 7008 = N 6 0 + 7200 = N 0 0 + 7200 = N 6 0 + 7296 = N 3 0 + 7296 = N 6 0 + 7392 = N 4 0 + 7392 = N 6 0 + 7488 = N 3 0 + 7488 = N 6 0 + 7584 = N 2 0 + 7584 = N 6 0 + 7680 = N 3 256 + 7680 = N 6 0 + 7680 = S 2 1536 + 7968 = N 1 0 + 7968 = N 6 0 + 8160 = N 0 0 + 8160 = N 6 0 + 8256 = N 3 256 + 8256 = N 6 0 + 8544 = N 1 0 + 8544 = N 6 0 + 8736 = N 0 0 + 8736 = N 6 0 + 8832 = N 1 0 + 8832 = N 6 0 + 9216 = N 3 0 + 9216 = N 6 0 + 9312 = N 4 0 + 9312 = N 6 0 + 9408 = N 3 0 + 9408 = N 6 0 + 9504 = N 2 0 + 9504 = N 6 0 + 9696 = N 0 0 + 9696 = N 6 0 + 9792 = N 3 0 + 9792 = N 6 0 + 9888 = N 4 0 + 9888 = N 6 0 + 9984 = N 3 0 + 9984 = N 6 0 + 10080 = N 2 0 + 10080 = N 6 0 + 10272 = N 0 0 + 10272 = N 6 0 + 10368 = N 3 0 + 10368 = N 6 0 + 10464 = N 4 0 + 10464 = N 6 0 + 10560 = N 3 0 + 10560 = N 6 0 + 10656 = N 2 0 + 10656 = N 6 0 + 10752 = N 3 352 + 10752 = N 6 0 + 11136 = N 2 0 + 11136 = N 6 0 + 11184 = N 1 0 + 11184 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 12288 = N 1 0 + 12288 = N 2 0 + 12288 = N 6 0 + 12288 = E solo + 12320 = N 1 0 + 12320 = N 3 0 + 12320 = N 6 0 + 12384 = N 3 0 + 12384 = N 6 0 + 12416 = N 3 0 + 12416 = N 6 0 + 12448 = N 3 0 + 12448 = N 6 0 + 12480 = N 3 0 + 12480 = N 6 0 + 12512 = N 3 0 + 12512 = N 6 0 + 12544 = N 3 0 + 12544 = N 6 0 + 12576 = N 3 0 + 12576 = N 6 0 + 12608 = N 3 0 + 12608 = N 6 0 + 12640 = N 3 0 + 12640 = N 6 0 + 12672 = N 3 0 + 12672 = N 6 0 + 12704 = N 3 0 + 12704 = N 6 0 + 12736 = N 3 0 + 12736 = N 6 0 + 12768 = N 3 0 + 12768 = N 6 0 + 12800 = N 3 0 + 12800 = N 6 0 + 12832 = N 3 0 + 12832 = N 6 0 + 12864 = N 3 0 + 12864 = N 6 0 + 12896 = N 3 0 + 12896 = N 6 0 + 12928 = N 3 0 + 12928 = N 6 0 + 12960 = N 3 0 + 12960 = N 6 0 + 12992 = N 3 0 + 12992 = N 6 0 + 13024 = N 3 0 + 13024 = N 6 0 + 13056 = N 3 0 + 13056 = N 6 0 + 13088 = N 3 0 + 13088 = N 6 0 + 13120 = N 3 0 + 13120 = N 6 0 + 13152 = N 3 0 + 13152 = N 6 0 + 13184 = N 3 0 + 13184 = N 6 0 + 13216 = N 3 0 + 13216 = N 6 0 + 13248 = N 3 0 + 13248 = N 6 0 + 13280 = N 3 0 + 13280 = N 6 0 + 13312 = N 3 0 + 13312 = N 6 0 + 13344 = N 3 0 + 13344 = N 6 0 + 13376 = N 3 0 + 13376 = N 6 0 + 13408 = N 3 0 + 13408 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13472 = N 3 0 + 13472 = N 6 0 + 13504 = N 3 0 + 13504 = N 6 0 + 13632 = N 1 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13664 = N 1 0 + 13664 = N 3 0 + 13664 = N 6 0 + 13696 = N 3 0 + 13696 = N 6 0 + 13728 = N 3 0 + 13728 = N 6 0 + 13760 = N 2 0 + 13760 = N 6 0 + 13824 = N 4 0 + 13824 = N 6 0 + 13851 = N 3 0 + 13851 = N 6 0 + 13879 = N 2 0 + 13879 = N 6 0 + 13906 = N 3 0 + 13906 = N 6 0 + 13934 = N 3 0 + 13934 = N 6 0 + 13961 = N 2 0 + 13961 = N 6 0 + 13989 = N 1 0 + 13989 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14043 = N 1 0 + 14043 = N 6 0 + 14071 = N 3 0 + 14071 = N 6 0 + 14098 = N 3 0 + 14098 = N 6 0 + 14126 = N 2 0 + 14126 = N 6 0 + 14153 = N 1 0 + 14153 = N 6 0 + 14181 = N 0 0 + 14181 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 15168 = S 2 768 + 15216 = N 0 0 + 15216 = N 6 0 + 15264 = N 1 0 + 15264 = N 6 0 + 15360 = N 2 0 + 15360 = N 4 0 + 15360 = N 6 0 + 15408 = N 2 0 + 15408 = N 4 0 + 15408 = N 6 0 + 15504 = N 3 0 + 15504 = N 4 0 + 15504 = N 6 0 + 15552 = N 3 0 + 15552 = N 4 0 + 15552 = N 6 0 + 15648 = N 2 0 + 15648 = N 4 0 + 15648 = N 6 0 + 15744 = N 2 0 + 15744 = N 4 0 + 15744 = N 6 0 + 15792 = N 0 0 + 15792 = N 6 0 + 15840 = N 1 0 + 15840 = N 6 0 + 16848 = N 0 0 + 16848 = N 6 0 + 16872 = N 1 0 + 16872 = N 6 0 + 16896 = N 2 0 + 16896 = N 6 0 + 16992 = N 4 128 + 16992 = N 6 0 + 17152 = N 3 0 + 17152 = N 6 0 + 17184 = N 2 0 + 17184 = N 6 0 + 17216 = N 1 0 + 17216 = N 6 0 + 17248 = N 0 0 + 17248 = N 6 0 + 18336 = N 0 0 + 18336 = N 6 0 + 18384 = N 0 0 + 18384 = N 6 0 + 18432 = N 0 0 + 18432 = N 2 0 + 18432 = N 6 0 + 18480 = N 0 0 + 18480 = N 2 0 + 18480 = N 6 0 + 18528 = N 0 0 + 18528 = N 6 0 + 18576 = N 0 0 + 18576 = N 2 0 + 18576 = N 6 0 + 18624 = N 1 0 + 18624 = N 2 0 + 18624 = N 6 0 + 18672 = N 0 0 + 18672 = N 6 0 + 18720 = N 0 0 + 18720 = N 2 0 + 18720 = N 6 0 + 18768 = N 0 0 + 18768 = N 2 0 + 18768 = N 6 0 + 19776 = N 1 0 + 19776 = N 6 0 + 19808 = N 2 0 + 19808 = N 6 0 + 19840 = N 3 0 + 19840 = N 6 0 + 19872 = N 4 0 + 19872 = N 6 0 + 19968 = N 3 0 + 19968 = N 6 0 + 20000 = N 2 0 + 20000 = N 6 0 + 20032 = N 1 0 + 20032 = N 6 0 + 20064 = N 0 0 + 20064 = N 6 0 + 20160 = N 1 0 + 20160 = N 6 0 + 20256 = N 0 0 + 20256 = N 6 0 + 20304 = N 2 0 + 20304 = N 6 0 + 20400 = N 0 0 + 20400 = N 6 0 + 20448 = N 3 0 + 20448 = N 6 0 + 20496 = N 4 0 + 20496 = N 6 0 + 21408 = N 1 0 + 21408 = N 6 0 + 21440 = N 2 0 + 21440 = N 6 0 + 21472 = N 3 0 + 21472 = N 6 0 + 21504 = N 4 112 + 21504 = N 6 0 + 21648 = N 2 0 + 21648 = N 6 0 + 21672 = N 1 0 + 21672 = N 6 0 + 21696 = N 2 0 + 21696 = N 6 0 + 21720 = N 1 0 + 21720 = N 6 0 + 21744 = N 0 0 + 21744 = N 6 0 + 21792 = N 3 0 + 21792 = N 6 0 + 21824 = N 3 0 + 21824 = N 6 0 + 21888 = N 3 0 + 21888 = N 6 0 + 21920 = N 3 0 + 21920 = N 6 0 + 21952 = N 0 0 + 21952 = N 6 0 + 22848 = N 2 0 + 22848 = N 3 0 + 22848 = N 6 0 + 22896 = N 2 0 + 22896 = N 4 0 + 22896 = N 6 0 + 23040 = N 1 0 + 23040 = N 6 0 + 23136 = N 2 0 + 23136 = N 3 0 + 23136 = N 6 0 + 23184 = N 2 0 + 23184 = N 4 0 + 23184 = N 6 0 + 23328 = N 1 0 + 23328 = N 6 0 + 23424 = N 2 0 + 23424 = N 6 0 + 23472 = N 1 0 + 23472 = N 6 0 + 23520 = N 0 0 + 23520 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 0 112 + 24576 = N 2 112 + 24576 = N 6 0 + 24720 = N 0 0 + 24720 = N 2 0 + 24720 = N 6 0 + 24752 = N 1 80 + 24752 = N 2 80 + 24752 = N 6 0 + 24864 = N 0 0 + 24864 = N 2 0 + 24864 = N 6 0 + 24896 = N 1 128 + 24896 = N 2 128 + 24896 = N 6 0 + 25056 = N 1 0 + 25056 = N 3 0 + 25056 = N 6 0 + 25088 = N 2 0 + 25088 = N 3 0 + 25088 = N 6 0 + 25920 = N 0 112 + 25920 = N 2 112 + 25920 = N 6 0 + 26064 = N 1 0 + 26064 = N 2 0 + 26064 = N 6 0 + 26160 = N 0 0 + 26160 = N 6 0 + 26208 = N 1 0 + 26208 = N 3 0 + 26208 = N 6 0 + 26240 = N 2 0 + 26240 = N 3 0 + 26240 = N 6 0 + 26496 = N 2 0 + 26496 = N 6 0 + 26528 = N 3 0 + 26528 = N 6 0 + 26560 = N 2 0 + 26560 = N 6 0 + 26592 = N 0 0 + 26592 = N 6 0 + 27552 = N 2 0 + 27552 = N 3 0 + 27552 = N 6 0 + 27584 = N 2 0 + 27584 = N 4 0 + 27584 = N 6 0 + 27712 = N 4 0 + 27712 = N 6 0 + 27744 = N 2 0 + 27744 = N 6 0 + 27776 = N 4 0 + 27776 = N 6 0 + 27808 = N 2 0 + 27808 = N 6 0 + 27840 = N 4 0 + 27840 = N 6 0 + 27872 = N 2 0 + 27872 = N 6 0 + 27904 = N 4 0 + 27904 = N 6 0 + 27936 = N 2 0 + 27936 = N 6 0 + 27968 = N 4 0 + 27968 = N 6 0 + 28000 = N 2 0 + 28000 = N 6 0 + 28032 = N 4 0 + 28032 = N 6 0 + 28064 = N 2 0 + 28064 = N 6 0 + 28096 = N 4 0 + 28096 = N 6 0 + 28128 = N 2 0 + 28128 = N 6 0 + 28160 = N 4 0 + 28160 = N 6 0 + 28192 = N 2 0 + 28192 = N 6 0 + 28224 = N 4 0 + 28224 = N 6 0 + 28256 = N 2 0 + 28256 = N 6 0 + 28288 = N 4 0 + 28288 = N 6 0 + 28320 = N 2 0 + 28320 = N 6 0 + 28352 = N 4 0 + 28352 = N 6 0 + 28384 = N 2 0 + 28384 = N 6 0 + 28416 = N 4 0 + 28416 = N 6 0 + 28448 = N 2 0 + 28448 = N 6 0 + 28480 = N 4 0 + 28480 = N 6 0 + 28512 = N 2 0 + 28512 = N 6 0 + 28544 = N 4 0 + 28544 = N 6 0 + 28576 = N 2 0 + 28576 = N 6 0 + 28608 = N 4 0 + 28608 = N 6 0 + 28640 = N 2 0 + 28640 = N 6 0 + 28672 = N 4 0 + 28672 = N 6 0 + 28704 = N 2 0 + 28704 = N 6 0 + 28736 = N 4 0 + 28736 = N 6 0 + 28768 = N 2 0 + 28768 = N 6 0 + 28800 = N 4 0 + 28800 = N 6 0 + 28832 = N 2 0 + 28832 = N 6 0 + 28864 = N 4 0 + 28864 = N 6 0 + 28992 = S 2 576 + 29088 = N 1 0 + 29088 = N 6 0 + 29184 = N 2 0 + 29184 = N 3 0 + 29184 = N 6 0 + 29216 = N 2 0 + 29216 = N 4 0 + 29216 = N 6 0 + 29328 = N 2 0 + 29328 = N 3 0 + 29328 = N 6 0 + 29360 = N 2 0 + 29360 = N 4 0 + 29360 = N 6 0 + 29472 = N 2 0 + 29472 = N 3 0 + 29472 = N 6 0 + 29504 = N 2 0 + 29504 = N 4 0 + 29504 = N 6 0 + 30816 = N 0 0 + 30816 = N 6 0 + 30912 = N 1 0 + 30912 = N 2 0 + 30912 = N 6 0 + 30960 = N 1 0 + 30960 = N 3 0 + 30960 = N 6 0 + 31104 = N 2 0 + 31104 = N 6 0 + 31200 = N 0 0 + 31200 = N 6 0 + 31296 = N 1 0 + 31296 = N 2 0 + 31296 = N 6 0 + 31344 = N 1 0 + 31344 = N 3 0 + 31344 = N 6 0 + 31680 = N 1 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31968 = N 1 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32064 = N 3 0 + 32064 = N 6 0 + 32160 = N 0 0 + 32160 = N 6 0 + 32256 = N 1 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32352 = N 3 0 + 32352 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 0 0 + 32544 = N 6 0 + 32640 = E soloend + 33024 = N 1 0 + 33024 = N 6 0 + 33072 = N 2 0 + 33072 = N 6 0 + 33120 = N 3 0 + 33120 = N 6 0 + 33408 = N 1 0 + 33408 = N 6 0 + 33456 = N 2 0 + 33456 = N 6 0 + 33504 = N 3 0 + 33504 = N 6 0 + 33792 = N 1 0 + 33792 = N 6 0 + 33840 = N 2 0 + 33840 = N 6 0 + 33888 = N 3 0 + 33888 = N 6 0 + 34080 = N 0 448 + 34080 = N 6 0 + 34560 = N 1 0 + 34560 = N 6 0 + 34608 = N 2 0 + 34608 = N 6 0 + 34656 = N 3 0 + 34656 = N 6 0 + 34944 = N 1 0 + 34944 = N 6 0 + 34992 = N 2 0 + 34992 = N 6 0 + 35040 = N 3 0 + 35040 = N 6 0 + 35328 = N 1 0 + 35328 = N 6 0 + 35376 = N 2 0 + 35376 = N 6 0 + 35424 = N 3 0 + 35424 = N 6 0 + 35616 = N 0 256 + 35616 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 35952 = N 2 0 + 35952 = N 6 0 + 36000 = N 3 0 + 36000 = N 6 0 + 36288 = N 1 0 + 36288 = N 6 0 + 36336 = N 2 0 + 36336 = N 6 0 + 36384 = N 3 0 + 36384 = N 6 0 + 36672 = N 1 0 + 36672 = N 6 0 + 36720 = N 2 0 + 36720 = N 6 0 + 36768 = N 3 0 + 36768 = N 6 0 + 36864 = N 2 0 + 36864 = N 6 0 + 36864 = S 2 768 + 36864 = E solo + 36912 = N 3 0 + 36912 = N 6 0 + 36960 = N 4 0 + 36960 = N 6 0 + 37008 = N 2 0 + 37008 = N 6 0 + 37056 = N 3 0 + 37056 = N 6 0 + 37104 = N 4 0 + 37104 = N 6 0 + 37152 = N 2 0 + 37152 = N 6 0 + 37200 = N 3 0 + 37200 = N 6 0 + 37248 = N 4 0 + 37248 = N 6 0 + 37296 = N 2 0 + 37296 = N 6 0 + 37344 = N 3 0 + 37344 = N 6 0 + 37392 = N 4 0 + 37392 = N 6 0 + 37440 = N 3 0 + 37440 = N 6 0 + 37472 = N 4 352 + 37472 = N 6 0 + 37920 = N 3 0 + 37920 = N 6 0 + 37968 = N 2 0 + 37968 = N 6 0 + 38064 = N 3 0 + 38064 = N 6 0 + 38112 = N 2 0 + 38112 = N 6 0 + 38208 = N 3 0 + 38208 = N 6 0 + 38256 = N 2 256 + 38256 = N 6 0 + 38544 = N 0 0 + 38544 = N 6 0 + 38592 = N 1 0 + 38592 = N 6 0 + 38736 = N 0 0 + 38736 = N 6 0 + 38784 = N 1 0 + 38784 = N 6 0 + 38832 = N 2 0 + 38832 = N 6 0 + 38880 = N 1 0 + 38880 = N 6 0 + 38928 = N 2 0 + 38928 = N 6 0 + 38976 = N 3 0 + 38976 = N 6 0 + 39024 = N 2 0 + 39024 = N 6 0 + 39072 = N 1 0 + 39072 = N 6 0 + 39120 = N 0 0 + 39120 = N 6 0 + 39168 = N 2 0 + 39168 = N 6 0 + 39200 = N 3 0 + 39200 = N 6 0 + 39232 = N 4 0 + 39232 = N 6 0 + 39264 = N 3 0 + 39264 = N 6 0 + 39296 = N 1 0 + 39296 = N 6 0 + 39328 = N 2 0 + 39328 = N 6 0 + 39360 = N 3 0 + 39360 = N 6 0 + 39488 = N 2 0 + 39488 = N 6 0 + 39520 = N 1 0 + 39520 = N 6 0 + 39552 = N 0 0 + 39552 = N 6 0 + 39648 = N 4 0 + 39648 = N 6 0 + 39696 = N 3 0 + 39696 = N 6 0 + 39744 = N 2 0 + 39744 = N 6 0 + 39792 = N 0 0 + 39792 = N 6 0 + 39840 = N 1 0 + 39840 = N 6 0 + 39936 = N 4 0 + 39936 = N 6 0 + 39984 = N 3 0 + 39984 = N 6 0 + 40032 = N 2 0 + 40032 = N 6 0 + 40080 = N 1 0 + 40080 = N 6 0 + 40128 = N 0 0 + 40128 = N 6 0 + 40152 = N 1 0 + 40152 = N 6 0 + 40176 = N 2 0 + 40176 = N 6 0 + 40200 = N 3 0 + 40200 = N 6 0 + 40224 = N 2 0 + 40224 = N 6 0 + 40248 = N 1 0 + 40248 = N 6 0 + 40272 = N 2 0 + 40272 = N 6 0 + 40296 = N 3 0 + 40296 = N 6 0 + 40320 = N 4 0 + 40320 = N 6 0 + 40512 = N 3 0 + 40512 = N 6 0 + 40608 = N 1 0 + 40608 = N 6 0 + 40704 = N 2 0 + 40704 = N 6 0 + 40800 = N 0 144 + 40800 = N 6 0 + 41136 = N 1 0 + 41136 = N 6 0 + 41184 = N 2 0 + 41184 = N 6 0 + 41232 = N 3 0 + 41232 = N 6 0 + 41280 = N 2 96 + 41280 = N 6 0 + 41408 = N 1 0 + 41408 = N 6 0 + 41440 = N 2 96 + 41440 = N 6 0 + 41568 = N 3 160 + 41568 = N 6 0 + 41760 = N 4 0 + 41760 = N 6 0 + 41808 = N 3 0 + 41808 = N 6 0 + 41856 = N 4 256 + 41856 = N 6 0 + 42144 = N 0 160 + 42144 = N 6 0 + 42336 = N 1 0 + 42336 = N 6 0 + 42384 = N 2 208 + 42384 = N 6 0 + 42624 = N 3 352 + 42624 = N 6 0 + 43008 = N 4 448 + 43008 = N 6 0 + 43488 = N 3 112 + 43488 = N 6 0 + 43632 = N 1 0 + 43632 = N 6 0 + 43680 = N 2 0 + 43680 = N 6 0 + 43776 = N 2 160 + 43776 = N 6 0 + 43776 = S 2 1152 + 43968 = N 2 112 + 43968 = N 6 0 + 44112 = N 2 0 + 44112 = N 6 0 + 44208 = N 2 0 + 44208 = N 6 0 + 44256 = N 2 0 + 44256 = N 6 0 + 44448 = N 2 160 + 44448 = N 6 0 + 44640 = N 2 0 + 44640 = N 6 0 + 44736 = N 2 112 + 44736 = N 6 0 + 44880 = N 2 112 + 44880 = N 6 0 + 45024 = N 1 0 + 45024 = N 6 0 + 45072 = N 2 0 + 45072 = N 6 0 + 45120 = N 0 0 + 45120 = N 6 0 + 45168 = N 3 0 + 45168 = N 6 0 + 45360 = N 1 0 + 45360 = N 6 0 + 45408 = N 2 0 + 45408 = N 6 0 + 45456 = N 3 0 + 45456 = N 6 0 + 45504 = N 4 0 + 45504 = N 6 0 + 45552 = N 2 0 + 45552 = N 6 0 + 45600 = N 1 0 + 45600 = N 6 0 + 45632 = N 2 0 + 45632 = N 6 0 + 45664 = N 0 0 + 45664 = N 6 0 + 45696 = N 1 0 + 45696 = N 6 0 + 45728 = N 2 0 + 45728 = N 6 0 + 45760 = N 3 0 + 45760 = N 6 0 + 45792 = N 4 0 + 45792 = N 6 0 + 45840 = N 0 0 + 45840 = N 6 0 + 45888 = N 2 0 + 45888 = N 6 0 + 45936 = N 3 0 + 45936 = N 6 0 + 45984 = N 4 0 + 45984 = N 6 0 + 46032 = N 2 0 + 46032 = N 6 0 + 46080 = N 3 0 + 46080 = N 6 0 + 46128 = N 1 0 + 46128 = N 6 0 + 46176 = N 2 0 + 46176 = N 6 0 + 46224 = N 4 0 + 46224 = N 6 0 + 46272 = N 0 0 + 46272 = N 6 0 + 46320 = N 1 0 + 46320 = N 6 0 + 46368 = N 3 0 + 46368 = N 6 0 + 46416 = N 1 0 + 46416 = N 6 0 + 46464 = N 2 0 + 46464 = N 6 0 + 46512 = N 4 0 + 46512 = N 6 0 + 46560 = N 3 0 + 46560 = N 6 0 + 46608 = N 0 0 + 46608 = N 6 0 + 46656 = N 4 0 + 46656 = N 6 0 + 46688 = N 3 0 + 46688 = N 6 0 + 46720 = N 2 0 + 46720 = N 6 0 + 46752 = N 1 0 + 46752 = N 6 0 + 46800 = N 3 0 + 46800 = N 6 0 + 46848 = N 2 0 + 46848 = N 6 0 + 46896 = N 1 0 + 46896 = N 6 0 + 46944 = N 0 0 + 46944 = N 6 0 + 46976 = N 1 0 + 46976 = N 6 0 + 47008 = N 2 0 + 47008 = N 6 0 + 47040 = N 4 0 + 47040 = N 6 0 + 47072 = N 3 0 + 47072 = N 6 0 + 47104 = N 2 0 + 47104 = N 6 0 + 47136 = N 3 0 + 47136 = N 6 0 + 47168 = N 2 0 + 47168 = N 6 0 + 47200 = N 1 0 + 47200 = N 6 0 + 47232 = N 2 0 + 47232 = N 6 0 + 47264 = N 1 0 + 47264 = N 6 0 + 47296 = N 0 96 + 47296 = N 6 0 + 47360 = E soloend + 47424 = N 4 864 + 47424 = N 6 0 + 48320 = N 3 0 + 48320 = N 6 0 + 48448 = N 2 0 + 48448 = N 6 0 + 48576 = N 1 0 + 48576 = N 6 0 + 48704 = N 0 0 + 48704 = N 6 0 + 48832 = N 1 0 + 48832 = N 6 0 + 48960 = N 2 160 + 48960 = N 6 0 + 49152 = N 0 0 + 49152 = N 6 0 + 49296 = N 1 0 + 49296 = N 6 0 + 49344 = N 2 0 + 49344 = N 6 0 + 49392 = N 0 0 + 49392 = N 6 0 + 49440 = N 1 0 + 49440 = N 6 0 + 49488 = N 0 0 + 49488 = N 6 0 + 49536 = N 1 256 + 49536 = N 6 0 + 49824 = N 0 0 + 49824 = N 6 0 + 49872 = N 1 0 + 49872 = N 6 0 + 49920 = N 2 0 + 49920 = N 6 0 + 49968 = N 4 0 + 49968 = N 6 0 + 50064 = N 1 0 + 50064 = N 6 0 + 50112 = N 2 0 + 50112 = N 6 0 + 50136 = N 3 0 + 50136 = N 6 0 + 50160 = N 2 0 + 50160 = N 6 0 + 50184 = N 1 0 + 50184 = N 6 0 + 50208 = N 2 0 + 50208 = N 6 0 + 50256 = N 1 0 + 50256 = N 6 0 + 50304 = N 2 0 + 50304 = N 6 0 + 50352 = N 1 0 + 50352 = N 6 0 + 50400 = N 0 0 + 50400 = N 6 0 + 50496 = N 4 864 + 50496 = N 6 0 + 51392 = N 3 0 + 51392 = N 6 0 + 51520 = N 2 0 + 51520 = N 6 0 + 51648 = N 1 0 + 51648 = N 6 0 + 51776 = N 0 0 + 51776 = N 6 0 + 51904 = N 1 0 + 51904 = N 6 0 + 52032 = N 3 0 + 52032 = N 6 0 + 52080 = N 4 160 + 52080 = N 6 0 + 52224 = S 2 1344 + 52272 = N 3 0 + 52272 = N 6 0 + 52368 = N 2 0 + 52368 = N 6 0 + 52416 = N 4 0 + 52416 = N 6 0 + 52464 = N 2 0 + 52464 = N 6 0 + 52512 = N 1 0 + 52512 = N 6 0 + 52560 = N 3 0 + 52560 = N 6 0 + 52608 = N 2 0 + 52608 = N 6 0 + 52656 = N 1 0 + 52656 = N 6 0 + 52704 = N 3 0 + 52704 = N 6 0 + 52752 = N 2 0 + 52752 = N 6 0 + 52800 = N 0 0 + 52800 = N 6 0 + 52848 = N 3 0 + 52848 = N 6 0 + 52896 = N 1 0 + 52896 = N 6 0 + 52944 = N 0 0 + 52944 = N 6 0 + 52992 = N 4 0 + 52992 = N 6 0 + 53024 = N 3 0 + 53024 = N 6 0 + 53056 = N 2 0 + 53056 = N 6 0 + 53088 = N 3 0 + 53088 = N 6 0 + 53136 = N 1 0 + 53136 = N 6 0 + 53184 = N 2 0 + 53184 = N 6 0 + 53232 = N 0 0 + 53232 = N 6 0 + 53280 = N 3 0 + 53280 = N 6 0 + 53328 = N 1 0 + 53328 = N 6 0 + 53376 = N 0 0 + 53376 = N 6 0 + 53424 = N 1 114 + 53424 = N 6 0 + 53568 = N 3 0 + 53568 = N 6 0 + 53600 = N 4 832 + 53600 = N 6 0 + 54464 = N 3 0 + 54464 = N 6 0 + 54592 = N 2 0 + 54592 = N 6 0 + 54720 = N 1 0 + 54720 = N 6 0 + 54848 = N 0 0 + 54848 = N 6 0 + 54976 = N 1 0 + 54976 = N 6 0 + 55104 = N 1 0 + 55104 = N 6 0 + 55128 = N 2 136 + 55128 = N 6 0 + 55296 = N 0 0 + 55296 = N 6 0 + 55344 = N 1 0 + 55344 = N 6 0 + 55392 = N 2 0 + 55392 = N 6 0 + 55440 = N 3 0 + 55440 = N 6 0 + 55488 = N 4 0 + 55488 = N 6 0 + 55536 = N 3 0 + 55536 = N 6 0 + 55584 = N 2 0 + 55584 = N 6 0 + 55632 = N 3 0 + 55632 = N 6 0 + 55680 = N 0 0 + 55680 = N 6 0 + 55728 = N 1 0 + 55728 = N 6 0 + 55776 = N 2 0 + 55776 = N 6 0 + 55824 = N 3 0 + 55824 = N 6 0 + 55872 = N 2 0 + 55872 = N 6 0 + 55910 = N 3 0 + 55910 = N 6 0 + 55949 = N 4 0 + 55949 = N 6 0 + 55987 = N 2 0 + 55987 = N 6 0 + 56026 = N 0 0 + 56026 = N 6 0 + 56064 = N 3 0 + 56064 = N 6 0 + 56112 = N 2 0 + 56112 = N 6 0 + 56160 = N 1 0 + 56160 = N 6 0 + 56208 = N 2 0 + 56208 = N 6 0 + 56256 = N 0 0 + 56256 = N 6 0 + 56352 = N 3 0 + 56352 = N 6 0 + 56400 = N 1 0 + 56400 = N 6 0 + 56448 = N 0 0 + 56448 = N 6 0 + 56496 = N 2 112 + 56496 = N 6 0 + 56640 = N 3 0 + 56640 = N 6 0 + 56672 = N 4 832 + 56672 = N 6 0 + 57536 = N 3 0 + 57536 = N 6 0 + 57664 = N 2 0 + 57664 = N 6 0 + 57792 = N 1 0 + 57792 = N 6 0 + 57920 = N 0 0 + 57920 = N 6 0 + 58048 = N 1 0 + 58048 = N 6 0 + 58176 = N 3 0 + 58176 = N 6 0 + 58200 = N 4 232 + 58200 = N 6 0 + 58464 = N 1 0 + 58464 = N 6 0 + 58512 = N 1 0 + 58512 = N 6 0 + 58608 = N 0 0 + 58608 = N 6 0 + 58656 = N 2 0 + 58656 = N 6 0 + 58752 = N 0 0 + 58752 = N 6 0 + 58800 = N 3 0 + 58800 = N 6 0 + 58848 = N 4 352 + 58848 = N 6 0 + 59232 = N 0 0 + 59232 = N 6 0 + 59280 = N 3 0 + 59280 = N 6 0 + 59376 = N 0 0 + 59376 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59472 = N 0 0 + 59472 = N 6 0 + 59520 = N 1 0 + 59520 = N 6 0 + 59616 = N 0 0 + 59616 = N 6 0 + 59712 = N 4 160 + 59712 = N 6 0 + 59904 = N 3 0 + 59904 = N 6 0 + 59952 = N 2 0 + 59952 = N 6 0 + 60048 = N 4 144 + 60048 = N 6 0 + 60384 = N 2 0 + 60384 = N 6 0 + 60432 = N 3 0 + 60432 = N 6 0 + 60480 = N 4 0 + 60480 = N 6 0 + 60576 = N 4 0 + 60576 = N 6 0 + 60672 = N 3 0 + 60672 = N 6 0 + 60720 = N 2 0 + 60720 = N 6 0 + 60816 = N 4 144 + 60816 = N 6 0 + 61152 = N 2 0 + 61152 = N 6 0 + 61152 = S 2 1440 + 61248 = N 3 192 + 61248 = N 6 0 + 61536 = N 1 112 + 61536 = N 6 0 + 61680 = N 2 0 + 61680 = N 6 0 + 61704 = N 1 0 + 61704 = N 6 0 + 61728 = N 0 0 + 61728 = N 6 0 + 61824 = N 2 0 + 61824 = N 6 0 + 61856 = N 3 224 + 61856 = N 6 0 + 62112 = N 1 112 + 62112 = N 6 0 + 62256 = N 2 0 + 62256 = N 6 0 + 62280 = N 1 0 + 62280 = N 6 0 + 62304 = N 0 0 + 62304 = N 6 0 + 62400 = N 1 0 + 62400 = N 6 0 + 62784 = N 4 160 + 62784 = N 6 0 + 62976 = N 3 0 + 62976 = N 6 0 + 63024 = N 2 0 + 63024 = N 6 0 + 63120 = N 4 144 + 63120 = N 6 0 + 63456 = N 2 0 + 63456 = N 6 0 + 63504 = N 3 0 + 63504 = N 6 0 + 63552 = N 4 0 + 63552 = N 6 0 + 63648 = N 4 0 + 63648 = N 6 0 + 63744 = N 3 0 + 63744 = N 6 0 + 63792 = N 2 0 + 63792 = N 6 0 + 63888 = N 4 144 + 63888 = N 6 0 + 64224 = N 2 0 + 64224 = N 6 0 + 64320 = N 3 192 + 64320 = N 6 0 + 64608 = N 1 112 + 64608 = N 6 0 + 64752 = N 2 0 + 64752 = N 6 0 + 64776 = N 1 0 + 64776 = N 6 0 + 64800 = N 0 0 + 64800 = N 6 0 + 64896 = N 2 0 + 64896 = N 6 0 + 64928 = N 3 224 + 64928 = N 6 0 + 65184 = N 1 112 + 65184 = N 6 0 + 65328 = N 2 0 + 65328 = N 6 0 + 65352 = N 1 0 + 65352 = N 6 0 + 65376 = N 0 0 + 65376 = N 6 0 + 65472 = N 1 0 + 65472 = N 6 0 + 66048 = N 1 0 + 66048 = N 6 0 + 66096 = N 2 0 + 66096 = N 6 0 + 66144 = N 3 0 + 66144 = N 6 0 + 66432 = N 1 0 + 66432 = N 6 0 + 66480 = N 2 0 + 66480 = N 6 0 + 66528 = N 3 0 + 66528 = N 6 0 + 66816 = N 1 0 + 66816 = N 6 0 + 66864 = N 2 0 + 66864 = N 6 0 + 66912 = N 3 0 + 66912 = N 6 0 + 67104 = N 0 288 + 67104 = N 6 0 + 67584 = N 1 0 + 67584 = N 6 0 + 67632 = N 2 0 + 67632 = N 6 0 + 67680 = N 3 0 + 67680 = N 6 0 + 67968 = N 1 0 + 67968 = N 6 0 + 68016 = N 2 0 + 68016 = N 6 0 + 68064 = N 3 0 + 68064 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68400 = N 2 0 + 68400 = N 6 0 + 68448 = N 3 0 + 68448 = N 6 0 + 68640 = N 0 288 + 68640 = N 6 0 + 69120 = N 2 0 + 69120 = N 6 0 + 69120 = S 2 1344 + 69168 = N 3 0 + 69168 = N 6 0 + 69216 = N 4 0 + 69216 = N 6 0 + 69504 = N 2 0 + 69504 = N 6 0 + 69552 = N 3 0 + 69552 = N 6 0 + 69600 = N 4 0 + 69600 = N 6 0 + 69888 = N 2 0 + 69888 = N 6 0 + 69936 = N 3 0 + 69936 = N 6 0 + 69984 = N 4 0 + 69984 = N 6 0 + 70176 = N 1 288 + 70176 = N 6 0 + 70656 = N 2 0 + 70656 = N 6 0 + 70704 = N 3 0 + 70704 = N 6 0 + 70752 = N 4 0 + 70752 = N 6 0 + 71040 = N 2 0 + 71040 = N 6 0 + 71088 = N 3 0 + 71088 = N 6 0 + 71136 = N 4 0 + 71136 = N 6 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71472 = N 3 0 + 71472 = N 6 0 + 71520 = N 4 0 + 71520 = N 6 0 + 71712 = N 3 0 + 71712 = N 6 0 + 71744 = N 4 352 + 71744 = N 6 0 + 72192 = N 3 0 + 72192 = N 6 0 + 72224 = N 4 320 + 72224 = N 6 0 + 72576 = N 3 352 + 72576 = N 6 0 + 72960 = N 2 352 + 72960 = N 6 0 + 73344 = N 1 352 + 73344 = N 6 0 + 73728 = N 0 192 + 73728 = N 6 0 + 74976 = N 1 0 + 74976 = N 6 0 + 74976 = E solo + 75024 = N 2 0 + 75024 = N 6 0 + 75072 = N 3 0 + 75072 = N 6 0 + 75120 = N 4 0 + 75120 = N 6 0 + 75168 = N 3 0 + 75168 = N 6 0 + 75216 = N 2 0 + 75216 = N 6 0 + 75264 = N 3 0 + 75264 = N 6 0 + 75312 = N 2 0 + 75312 = N 6 0 + 75360 = N 1 0 + 75360 = N 6 0 + 75792 = N 3 0 + 75792 = N 6 0 + 75840 = N 4 0 + 75840 = N 6 0 + 75888 = N 3 0 + 75888 = N 6 0 + 75936 = N 1 0 + 75936 = N 6 0 + 75984 = N 2 0 + 75984 = N 6 0 + 76032 = N 3 0 + 76032 = N 6 0 + 76080 = N 2 0 + 76080 = N 6 0 + 76128 = N 1 0 + 76128 = N 6 0 + 76176 = N 0 0 + 76176 = N 6 0 + 76224 = N 1 0 + 76224 = N 6 0 + 76272 = N 1 0 + 76272 = N 6 0 + 76848 = N 0 0 + 76848 = N 6 0 + 76896 = N 1 0 + 76896 = N 6 0 + 76944 = N 2 0 + 76944 = N 6 0 + 77040 = N 3 0 + 77040 = N 6 0 + 77136 = N 4 0 + 77136 = N 6 0 + 77232 = N 2 0 + 77232 = N 6 0 + 77328 = N 4 0 + 77328 = N 6 0 + 77376 = N 3 0 + 77376 = N 6 0 + 77424 = N 2 0 + 77424 = N 6 0 + 77472 = N 3 0 + 77472 = N 6 0 + 77520 = N 2 0 + 77520 = N 6 0 + 77568 = N 1 0 + 77568 = N 6 0 + 77616 = N 0 0 + 77616 = N 6 0 + 77664 = N 2 0 + 77664 = N 6 0 + 77712 = N 1 0 + 77712 = N 6 0 + 77760 = N 2 0 + 77760 = N 6 0 + 77808 = N 1 0 + 77808 = N 6 0 + 77856 = N 0 0 + 77856 = N 6 0 + 78768 = N 0 0 + 78768 = N 6 0 + 78864 = N 1 0 + 78864 = N 6 0 + 78960 = N 2 0 + 78960 = N 6 0 + 79056 = N 1 0 + 79056 = N 6 0 + 79152 = N 2 0 + 79152 = N 6 0 + 79248 = N 3 0 + 79248 = N 6 0 + 79344 = N 2 0 + 79344 = N 6 0 + 79392 = N 3 0 + 79392 = N 6 0 + 79440 = N 4 0 + 79440 = N 6 0 + 79488 = N 0 0 + 79488 = N 6 0 + 79536 = N 1 0 + 79536 = N 6 0 + 79584 = N 2 0 + 79584 = N 6 0 + 79632 = N 3 0 + 79632 = N 6 0 + 79680 = N 2 0 + 79680 = N 6 0 + 79718 = N 3 0 + 79718 = N 6 0 + 79757 = N 4 0 + 79757 = N 6 0 + 79795 = N 3 0 + 79795 = N 6 0 + 79834 = N 2 0 + 79834 = N 6 0 + 79872 = N 3 0 + 79872 = N 6 0 + 79920 = N 2 0 + 79920 = N 6 0 + 79968 = N 1 0 + 79968 = N 6 0 + 80016 = N 0 0 + 80016 = N 6 0 + 80064 = N 3 0 + 80064 = N 6 0 + 80088 = N 4 0 + 80088 = N 6 0 + 80112 = N 3 0 + 80112 = N 6 0 + 80136 = N 2 0 + 80136 = N 6 0 + 80208 = N 2 0 + 80208 = N 6 0 + 80256 = N 1 0 + 80256 = N 6 0 + 80304 = N 2 0 + 80304 = N 6 0 + 80352 = N 3 0 + 80352 = N 6 0 + 80400 = N 2 0 + 80400 = N 6 0 + 80448 = N 1 0 + 80448 = N 6 0 + 80496 = N 2 0 + 80496 = N 6 0 + 80544 = N 0 0 + 80544 = N 6 0 + 81024 = S 2 2112 + 81168 = N 3 0 + 81168 = N 6 0 + 81216 = N 4 0 + 81216 = N 6 0 + 81360 = N 3 0 + 81360 = N 6 0 + 81384 = N 4 0 + 81384 = N 6 0 + 81504 = N 2 0 + 81504 = N 6 0 + 81648 = N 3 0 + 81648 = N 6 0 + 81696 = N 4 0 + 81696 = N 6 0 + 81744 = N 2 0 + 81744 = N 6 0 + 81792 = N 3 0 + 81792 = N 6 0 + 81936 = N 2 0 + 81936 = N 6 0 + 81984 = N 3 0 + 81984 = N 6 0 + 82016 = N 2 0 + 82016 = N 6 0 + 82048 = N 1 0 + 82048 = N 6 0 + 82080 = N 0 0 + 82080 = N 6 0 + 82128 = N 3 0 + 82128 = N 6 0 + 82176 = N 2 0 + 82176 = N 6 0 + 82224 = N 0 0 + 82224 = N 6 0 + 82272 = N 4 0 + 82272 = N 6 0 + 82320 = N 3 0 + 82320 = N 6 0 + 82368 = N 2 0 + 82368 = N 6 0 + 82416 = N 3 0 + 82416 = N 6 0 + 82464 = N 4 0 + 82464 = N 6 0 + 82512 = N 3 0 + 82512 = N 6 0 + 82560 = N 2 0 + 82560 = N 6 0 + 82608 = N 1 0 + 82608 = N 6 0 + 82656 = N 3 0 + 82656 = N 6 0 + 82704 = N 2 0 + 82704 = N 6 0 + 82752 = N 3 0 + 82752 = N 6 0 + 82800 = N 4 0 + 82800 = N 6 0 + 82848 = N 1 0 + 82848 = N 6 0 + 82896 = N 2 0 + 82896 = N 6 0 + 82944 = N 0 0 + 82944 = N 6 0 + 83616 = N 0 0 + 83616 = N 6 0 + 83664 = N 1 0 + 83664 = N 6 0 + 83712 = N 2 112 + 83712 = N 6 0 + 83856 = N 1 0 + 83856 = N 6 0 + 83904 = N 2 0 + 83904 = N 6 0 + 83952 = N 3 0 + 83952 = N 6 0 + 84000 = N 2 0 + 84000 = N 6 0 + 84048 = N 3 0 + 84048 = N 6 0 + 84096 = N 4 0 + 84096 = N 6 0 + 84144 = N 3 0 + 84144 = N 6 0 + 84192 = N 2 0 + 84192 = N 6 0 + 84240 = N 1 0 + 84240 = N 6 0 + 84288 = N 2 0 + 84288 = N 6 0 + 84336 = N 1 0 + 84336 = N 6 0 + 84384 = N 0 0 + 84384 = N 6 0 + 84432 = N 1 0 + 84432 = N 6 0 + 84480 = N 3 0 + 84480 = N 6 0 + 84512 = N 2 0 + 84512 = N 6 0 + 84544 = N 1 0 + 84544 = N 6 0 + 84576 = N 0 0 + 84576 = N 6 0 + 84608 = N 1 0 + 84608 = N 6 0 + 84640 = N 2 0 + 84640 = N 6 0 + 84672 = N 3 0 + 84672 = N 6 0 + 84704 = N 2 0 + 84704 = N 6 0 + 84736 = N 1 0 + 84736 = N 6 0 + 84768 = N 0 0 + 84768 = N 6 0 + 84800 = N 1 0 + 84800 = N 6 0 + 84832 = N 2 0 + 84832 = N 6 0 + 84864 = N 3 0 + 84864 = N 6 0 + 84896 = N 2 0 + 84896 = N 6 0 + 84928 = N 1 0 + 84928 = N 6 0 + 84960 = N 0 0 + 84960 = N 6 0 + 84992 = N 1 0 + 84992 = N 6 0 + 85024 = N 2 0 + 85024 = N 6 0 + 85056 = N 3 0 + 85056 = N 6 0 + 85088 = N 2 0 + 85088 = N 6 0 + 85120 = N 1 0 + 85120 = N 6 0 + 85152 = N 0 0 + 85152 = N 6 0 + 85184 = N 1 0 + 85184 = N 6 0 + 85216 = N 2 0 + 85216 = N 6 0 + 85248 = N 3 0 + 85248 = N 6 0 + 85280 = N 2 0 + 85280 = N 6 0 + 85312 = N 1 0 + 85312 = N 6 0 + 85344 = N 0 0 + 85344 = N 6 0 + 85680 = N 4 0 + 85680 = N 6 0 + 85728 = N 3 0 + 85728 = N 6 0 + 85776 = N 2 0 + 85776 = N 6 0 + 85824 = N 3 0 + 85824 = N 6 0 + 85872 = N 2 0 + 85872 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 85968 = N 2 0 + 85968 = N 6 0 + 86016 = N 3 0 + 86016 = N 6 0 + 86064 = N 2 0 + 86064 = N 6 0 + 86112 = N 1 0 + 86112 = N 6 0 + 86160 = N 2 0 + 86160 = N 6 0 + 86208 = N 3 0 + 86208 = N 6 0 + 86256 = N 2 0 + 86256 = N 6 0 + 86304 = N 1 0 + 86304 = N 6 0 + 86352 = N 0 0 + 86352 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86448 = N 3 0 + 86448 = N 6 0 + 86496 = N 4 0 + 86496 = N 6 0 + 86832 = N 0 0 + 86832 = N 6 0 + 86928 = N 1 0 + 86928 = N 6 0 + 87024 = N 2 0 + 87024 = N 6 0 + 87120 = N 1 0 + 87120 = N 6 0 + 87216 = N 3 0 + 87216 = N 6 0 + 87312 = N 4 0 + 87312 = N 6 0 + 87408 = N 3 0 + 87408 = N 6 0 + 87456 = N 4 0 + 87456 = N 6 0 + 87504 = N 3 0 + 87504 = N 6 0 + 87552 = N 4 0 + 87552 = N 6 0 + 87600 = N 3 0 + 87600 = N 6 0 + 87648 = N 1 0 + 87648 = N 6 0 + 87696 = N 3 0 + 87696 = N 6 0 + 87744 = N 2 0 + 87744 = N 6 0 + 87792 = N 0 0 + 87792 = N 6 0 + 87840 = N 2 0 + 87840 = N 6 0 + 87872 = N 1 0 + 87872 = N 6 0 + 87904 = N 0 0 + 87904 = N 6 0 + 88368 = N 0 0 + 88368 = N 6 0 + 88416 = N 1 0 + 88416 = N 6 0 + 88464 = N 2 0 + 88464 = N 6 0 + 88512 = N 1 0 + 88512 = N 6 0 + 88560 = N 2 0 + 88560 = N 6 0 + 88656 = N 3 0 + 88656 = N 6 0 + 88752 = N 2 0 + 88752 = N 6 0 + 88848 = N 3 0 + 88848 = N 6 0 + 88944 = N 4 112 + 88944 = N 6 0 + 89088 = N 4 0 + 89088 = N 6 0 + 89136 = N 3 0 + 89136 = N 6 0 + 89184 = N 2 0 + 89184 = N 6 0 + 89232 = N 1 0 + 89232 = N 6 0 + 89280 = N 2 0 + 89280 = N 6 0 + 89328 = N 1 0 + 89328 = N 6 0 + 89376 = N 0 0 + 89376 = N 6 0 + 89904 = N 3 0 + 89904 = N 6 0 + 89952 = N 1 0 + 89952 = N 6 0 + 90000 = N 3 0 + 90000 = N 6 0 + 90048 = N 2 0 + 90048 = N 6 0 + 90096 = N 1 0 + 90096 = N 6 0 + 90144 = N 2 0 + 90144 = N 6 0 + 90192 = N 0 0 + 90192 = N 6 0 + 90240 = N 4 0 + 90240 = N 6 0 + 90288 = N 3 0 + 90288 = N 6 0 + 90336 = N 2 0 + 90336 = N 6 0 + 90384 = N 1 0 + 90384 = N 6 0 + 90432 = N 2 0 + 90432 = N 6 0 + 90528 = N 0 0 + 90528 = N 6 0 + 90624 = N 4 0 + 90624 = N 6 0 + 90672 = N 1 0 + 90672 = N 6 0 + 91200 = S 2 960 + 91248 = N 2 0 + 91248 = N 6 0 + 91296 = N 4 0 + 91296 = N 6 0 + 91392 = N 2 0 + 91392 = N 6 0 + 91536 = N 1 0 + 91536 = N 6 0 + 91560 = N 2 0 + 91560 = N 6 0 + 91584 = N 3 0 + 91584 = N 6 0 + 91632 = N 1 0 + 91632 = N 6 0 + 91728 = N 2 0 + 91728 = N 6 0 + 91824 = N 0 0 + 91824 = N 6 0 + 91920 = N 1 0 + 91920 = N 6 0 + 92016 = N 0 0 + 92016 = N 6 0 + 92112 = N 0 0 + 92112 = N 6 0 + 92448 = N 1 0 + 92448 = N 6 0 + 92496 = N 0 0 + 92496 = N 6 0 + 92544 = N 1 0 + 92544 = N 6 0 + 92592 = N 2 0 + 92592 = N 6 0 + 92640 = N 3 0 + 92640 = N 6 0 + 92688 = N 1 0 + 92688 = N 6 0 + 92736 = N 2 0 + 92736 = N 6 0 + 92784 = N 3 0 + 92784 = N 6 0 + 92832 = N 4 0 + 92832 = N 6 0 + 92880 = N 3 0 + 92880 = N 6 0 + 92928 = N 2 0 + 92928 = N 6 0 + 92976 = N 1 0 + 92976 = N 6 0 + 93024 = N 3 0 + 93024 = N 6 0 + 93072 = N 2 0 + 93072 = N 6 0 + 93120 = N 3 0 + 93120 = N 6 0 + 93152 = N 2 0 + 93152 = N 6 0 + 93184 = N 1 0 + 93184 = N 6 0 + 93216 = N 0 0 + 93216 = N 6 0 + 93264 = N 3 0 + 93264 = N 6 0 + 93312 = N 2 0 + 93312 = N 6 0 + 93360 = N 0 0 + 93360 = N 6 0 + 93408 = N 1 0 + 93408 = N 6 0 + 93456 = N 0 0 + 93456 = N 6 0 + 93504 = N 4 0 + 93504 = N 6 0 + 93552 = N 3 0 + 93552 = N 6 0 + 93600 = N 2 0 + 93600 = N 6 0 + 93648 = N 1 0 + 93648 = N 6 0 + 93792 = N 1 0 + 93792 = N 6 0 + 93840 = N 2 0 + 93840 = N 6 0 + 93888 = N 3 0 + 93888 = N 6 0 + 93936 = N 2 0 + 93936 = N 6 0 + 93984 = N 3 0 + 93984 = N 6 0 + 94032 = N 2 0 + 94032 = N 6 0 + 94080 = N 3 0 + 94080 = N 6 0 + 94128 = N 2 0 + 94128 = N 6 0 + 94176 = N 1 0 + 94176 = N 6 0 + 94368 = N 2 0 + 94368 = N 6 0 + 94416 = N 1 0 + 94416 = N 6 0 + 94464 = N 0 0 + 94464 = N 6 0 + 94512 = N 1 0 + 94512 = N 6 0 + 94560 = N 2 0 + 94560 = N 6 0 + 94608 = N 3 0 + 94608 = N 6 0 + 94656 = N 4 0 + 94656 = N 6 0 + 94704 = N 1 0 + 94704 = N 6 0 + 94800 = N 2 0 + 94800 = N 6 0 + 94824 = N 3 0 + 94824 = N 6 0 + 94848 = N 4 0 + 94848 = N 6 0 + 95088 = N 3 0 + 95088 = N 6 0 + 95136 = N 2 0 + 95136 = N 6 0 + 95232 = N 3 0 + 95232 = N 6 0 + 95280 = N 2 0 + 95280 = N 6 0 + 95376 = N 3 0 + 95376 = N 6 0 + 95424 = N 2 0 + 95424 = N 6 0 + 95520 = N 3 0 + 95520 = N 6 0 + 95568 = N 2 0 + 95568 = N 6 0 + 95664 = N 3 0 + 95664 = N 6 0 + 95712 = N 2 0 + 95712 = N 6 0 + 95808 = N 4 0 + 95808 = N 6 0 + 95846 = N 3 0 + 95846 = N 6 0 + 95885 = N 2 0 + 95885 = N 6 0 + 95923 = N 1 0 + 95923 = N 6 0 + 96384 = E soloend + 96768 = N 4 160 + 96768 = N 6 0 + 96960 = N 3 0 + 96960 = N 6 0 + 97008 = N 2 0 + 97008 = N 6 0 + 97104 = N 4 192 + 97104 = N 6 0 + 97440 = N 2 0 + 97440 = N 6 0 + 97488 = N 3 0 + 97488 = N 6 0 + 97536 = N 4 0 + 97536 = N 6 0 + 97632 = N 4 0 + 97632 = N 6 0 + 97728 = N 3 0 + 97728 = N 6 0 + 97776 = N 2 0 + 97776 = N 6 0 + 97872 = N 4 192 + 97872 = N 6 0 + 98208 = N 2 0 + 98208 = N 6 0 + 98304 = N 3 256 + 98304 = N 6 0 + 98592 = N 1 0 + 98592 = N 6 0 + 98784 = N 0 0 + 98784 = N 6 0 + 98880 = N 3 256 + 98880 = N 6 0 + 99168 = N 1 0 + 99168 = N 6 0 + 99360 = N 0 0 + 99360 = N 6 0 + 99456 = N 1 0 + 99456 = N 6 0 + 99840 = N 4 160 + 99840 = N 6 0 + 99840 = S 2 1344 + 100032 = N 3 0 + 100032 = N 6 0 + 100080 = N 2 0 + 100080 = N 6 0 + 100176 = N 4 192 + 100176 = N 6 0 + 100512 = N 2 0 + 100512 = N 6 0 + 100560 = N 3 0 + 100560 = N 6 0 + 100608 = N 4 0 + 100608 = N 6 0 + 100704 = N 4 0 + 100704 = N 6 0 + 100800 = N 3 0 + 100800 = N 6 0 + 100848 = N 2 0 + 100848 = N 6 0 + 100944 = N 4 240 + 100944 = N 6 0 + 101280 = N 2 0 + 101280 = N 6 0 + 101376 = N 3 0 + 101376 = N 6 0 + 101664 = N 1 112 + 101664 = N 6 0 + 101808 = N 2 0 + 101808 = N 6 0 + 101832 = N 1 0 + 101832 = N 6 0 + 101856 = N 0 0 + 101856 = N 6 0 + 101952 = N 3 256 + 101952 = N 6 0 + 102240 = N 1 112 + 102240 = N 6 0 + 102384 = N 2 0 + 102384 = N 6 0 + 102408 = N 1 0 + 102408 = N 6 0 + 102432 = N 0 0 + 102432 = N 6 0 + 102528 = N 1 192 + 102528 = N 6 0 + 103104 = N 1 0 + 103104 = N 6 0 + 103152 = N 2 0 + 103152 = N 6 0 + 103200 = N 3 0 + 103200 = N 6 0 + 103488 = N 1 0 + 103488 = N 6 0 + 103536 = N 2 0 + 103536 = N 6 0 + 103584 = N 3 0 + 103584 = N 6 0 + 103872 = N 1 0 + 103872 = N 6 0 + 103920 = N 2 0 + 103920 = N 6 0 + 103968 = N 3 0 + 103968 = N 6 0 + 104160 = N 0 288 + 104160 = N 6 0 + 104640 = N 1 0 + 104640 = N 6 0 + 104688 = N 2 0 + 104688 = N 6 0 + 104736 = N 3 0 + 104736 = N 6 0 + 105024 = N 1 0 + 105024 = N 6 0 + 105072 = N 2 0 + 105072 = N 6 0 + 105120 = N 3 0 + 105120 = N 6 0 + 105408 = N 1 0 + 105408 = N 6 0 + 105456 = N 2 0 + 105456 = N 6 0 + 105504 = N 3 0 + 105504 = N 6 0 + 105696 = N 0 288 + 105696 = N 6 0 + 106176 = N 2 0 + 106176 = N 6 0 + 106224 = N 3 0 + 106224 = N 6 0 + 106272 = N 4 0 + 106272 = N 6 0 + 106560 = N 2 0 + 106560 = N 6 0 + 106608 = N 3 0 + 106608 = N 6 0 + 106656 = N 4 0 + 106656 = N 6 0 + 106944 = N 2 0 + 106944 = N 6 0 + 106992 = N 3 0 + 106992 = N 6 0 + 107040 = N 4 0 + 107040 = N 6 0 + 107232 = N 1 288 + 107232 = N 6 0 + 107712 = N 2 0 + 107712 = N 6 0 + 107712 = S 2 1536 + 107760 = N 3 0 + 107760 = N 6 0 + 107808 = N 4 0 + 107808 = N 6 0 + 108096 = N 2 0 + 108096 = N 6 0 + 108144 = N 3 0 + 108144 = N 6 0 + 108192 = N 4 0 + 108192 = N 6 0 + 108480 = N 2 0 + 108480 = N 6 0 + 108528 = N 3 0 + 108528 = N 6 0 + 108576 = N 4 0 + 108576 = N 6 0 + 108768 = N 3 0 + 108768 = N 6 0 + 108800 = N 4 4256 + 108800 = N 6 0 + 113088 = N 3 0 + 113088 = N 6 0 + 113184 = N 4 0 + 113184 = N 6 0 + 113280 = N 3 0 + 113280 = N 6 0 + 113376 = N 2 0 + 113376 = N 6 0 + 113568 = N 0 0 + 113568 = N 6 0 + 113664 = N 3 0 + 113664 = N 6 0 + 113760 = N 4 0 + 113760 = N 6 0 + 113856 = N 3 0 + 113856 = N 6 0 + 113952 = N 2 0 + 113952 = N 6 0 + 114144 = N 0 0 + 114144 = N 6 0 + 114240 = N 3 0 + 114240 = N 6 0 + 114336 = N 4 0 + 114336 = N 6 0 + 114432 = N 3 0 + 114432 = N 6 0 + 114528 = N 2 0 + 114528 = N 6 0 + 114624 = N 3 256 + 114624 = N 6 0 + 114912 = N 1 0 + 114912 = N 6 0 + 115104 = N 0 0 + 115104 = N 6 0 + 115200 = N 3 256 + 115200 = N 6 0 + 115488 = N 1 0 + 115488 = N 6 0 + 115680 = N 0 0 + 115680 = N 6 0 + 115776 = N 1 0 + 115776 = N 6 0 + 116160 = N 3 0 + 116160 = N 6 0 + 116256 = N 4 0 + 116256 = N 6 0 + 116352 = N 3 0 + 116352 = N 6 0 + 116448 = N 2 0 + 116448 = N 6 0 + 116640 = N 0 0 + 116640 = N 6 0 + 116736 = N 3 0 + 116736 = N 6 0 + 116832 = N 4 0 + 116832 = N 6 0 + 116928 = N 3 0 + 116928 = N 6 0 + 117024 = N 2 0 + 117024 = N 6 0 + 117216 = N 0 0 + 117216 = N 6 0 + 117312 = N 3 0 + 117312 = N 6 0 + 117408 = N 4 0 + 117408 = N 6 0 + 117504 = N 3 0 + 117504 = N 6 0 + 117600 = N 2 0 + 117600 = N 6 0 + 117696 = N 3 352 + 117696 = N 6 0 + 118080 = N 2 0 + 118080 = N 6 0 + 118128 = N 1 0 + 118128 = N 6 0 + 118176 = N 0 0 + 118176 = N 6 0 + 120096 = N 0 0 + 120096 = N 6 0 + 120096 = E solo + 120192 = N 1 0 + 120192 = N 3 0 + 120192 = N 6 0 + 120224 = N 2 0 + 120224 = N 3 0 + 120224 = N 6 0 + 120320 = N 1 0 + 120320 = N 3 0 + 120320 = N 6 0 + 120352 = N 2 0 + 120352 = N 3 0 + 120352 = N 6 0 + 120432 = N 0 0 + 120432 = N 6 0 + 120480 = N 2 0 + 120480 = N 4 0 + 120480 = N 6 0 + 120576 = N 3 0 + 120576 = N 6 0 + 120608 = N 2 0 + 120608 = N 6 0 + 120640 = N 1 0 + 120640 = N 6 0 + 120672 = N 0 0 + 120672 = N 6 0 + 121536 = N 1 0 + 121536 = N 6 0 + 121568 = N 2 0 + 121568 = N 6 0 + 121600 = N 3 0 + 121600 = N 6 0 + 121632 = N 3 0 + 121632 = N 4 0 + 121632 = N 6 0 + 121728 = N 3 0 + 121728 = N 6 0 + 121776 = N 2 0 + 121776 = N 6 0 + 121824 = N 1 0 + 121824 = N 6 0 + 121920 = N 3 0 + 121920 = N 6 0 + 122016 = N 2 0 + 122016 = N 6 0 + 122064 = N 3 0 + 122064 = N 6 0 + 122160 = N 2 0 + 122160 = N 6 0 + 122208 = N 1 0 + 122208 = N 6 0 + 122256 = N 0 0 + 122256 = N 6 0 + 122304 = N 1 0 + 122304 = N 6 0 + 123168 = N 0 0 + 123168 = N 6 0 + 123264 = N 1 0 + 123264 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123392 = N 1 0 + 123392 = N 6 0 + 123424 = N 2 0 + 123424 = N 6 0 + 123456 = N 3 0 + 123456 = N 6 0 + 123616 = N 1 0 + 123616 = N 6 0 + 123648 = N 2 0 + 123648 = N 6 0 + 123680 = N 3 0 + 123680 = N 6 0 + 124704 = N 0 0 + 124704 = N 6 0 + 124800 = N 1 0 + 124800 = N 6 0 + 124832 = N 2 0 + 124832 = N 6 0 + 124864 = N 3 0 + 124864 = N 6 0 + 124896 = N 4 0 + 124896 = N 6 0 + 124992 = N 3 0 + 124992 = N 6 0 + 125024 = N 2 0 + 125024 = N 6 0 + 125056 = N 1 0 + 125056 = N 6 0 + 125088 = N 0 0 + 125088 = N 6 0 + 125184 = N 1 0 + 125184 = N 6 0 + 125280 = N 2 0 + 125280 = N 6 0 + 125376 = E soloend +} +[HardSingle] +{ + 6144 = N 3 0 + 6144 = N 6 0 + 6240 = N 4 0 + 6240 = N 6 0 + 6336 = N 3 0 + 6336 = N 6 0 + 6432 = N 2 0 + 6432 = N 6 0 + 6624 = N 0 0 + 6624 = N 6 0 + 6720 = N 3 0 + 6720 = N 6 0 + 6816 = N 4 0 + 6816 = N 6 0 + 6912 = N 3 0 + 6912 = N 6 0 + 7008 = N 2 0 + 7008 = N 6 0 + 7200 = N 0 0 + 7200 = N 6 0 + 7296 = N 3 0 + 7296 = N 6 0 + 7392 = N 4 0 + 7392 = N 6 0 + 7488 = N 3 0 + 7488 = N 6 0 + 7584 = N 2 0 + 7584 = N 6 0 + 7680 = N 3 256 + 7680 = N 6 0 + 7680 = S 2 1536 + 7968 = N 1 0 + 7968 = N 6 0 + 8160 = N 0 0 + 8160 = N 6 0 + 8256 = N 3 256 + 8256 = N 6 0 + 8544 = N 1 0 + 8544 = N 6 0 + 8736 = N 0 0 + 8736 = N 6 0 + 8832 = N 1 0 + 8832 = N 6 0 + 9216 = N 3 0 + 9216 = N 6 0 + 9312 = N 4 0 + 9312 = N 6 0 + 9408 = N 3 0 + 9408 = N 6 0 + 9504 = N 2 0 + 9504 = N 6 0 + 9696 = N 0 0 + 9696 = N 6 0 + 9792 = N 3 0 + 9792 = N 6 0 + 9888 = N 4 0 + 9888 = N 6 0 + 9984 = N 3 0 + 9984 = N 6 0 + 10080 = N 2 0 + 10080 = N 6 0 + 10272 = N 0 0 + 10272 = N 6 0 + 10368 = N 3 0 + 10368 = N 6 0 + 10464 = N 4 0 + 10464 = N 6 0 + 10560 = N 3 0 + 10560 = N 6 0 + 10656 = N 2 0 + 10656 = N 6 0 + 10752 = N 3 352 + 10752 = N 6 0 + 11136 = N 2 0 + 11136 = N 6 0 + 11184 = N 1 0 + 11184 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 12288 = N 1 160 + 12288 = N 3 160 + 12288 = N 6 0 + 12288 = E solo + 12480 = N 3 0 + 12480 = N 6 0 + 12528 = N 3 0 + 12528 = N 6 0 + 12576 = N 3 0 + 12576 = N 6 0 + 12624 = N 3 0 + 12624 = N 6 0 + 12672 = N 3 0 + 12672 = N 6 0 + 12720 = N 3 0 + 12720 = N 6 0 + 12768 = N 3 0 + 12768 = N 6 0 + 12816 = N 3 0 + 12816 = N 6 0 + 12864 = N 3 0 + 12864 = N 6 0 + 12912 = N 3 0 + 12912 = N 6 0 + 12960 = N 3 0 + 12960 = N 6 0 + 13008 = N 3 0 + 13008 = N 6 0 + 13056 = N 3 0 + 13056 = N 6 0 + 13104 = N 3 0 + 13104 = N 6 0 + 13152 = N 3 0 + 13152 = N 6 0 + 13200 = N 3 0 + 13200 = N 6 0 + 13248 = N 3 0 + 13248 = N 6 0 + 13296 = N 3 0 + 13296 = N 6 0 + 13344 = N 3 0 + 13344 = N 6 0 + 13392 = N 3 0 + 13392 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13632 = N 1 0 + 13632 = N 3 0 + 13632 = N 6 0 + 13776 = N 2 0 + 13776 = N 6 0 + 13824 = N 3 0 + 13824 = N 6 0 + 13872 = N 2 0 + 13872 = N 6 0 + 13920 = N 3 0 + 13920 = N 6 0 + 13968 = N 2 0 + 13968 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14064 = N 0 0 + 14064 = N 6 0 + 14112 = N 2 0 + 14112 = N 6 0 + 14160 = N 1 0 + 14160 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 15168 = S 2 768 + 15216 = N 0 0 + 15216 = N 6 0 + 15264 = N 1 0 + 15264 = N 6 0 + 15360 = N 2 0 + 15360 = N 4 0 + 15360 = N 6 0 + 15504 = N 3 0 + 15504 = N 4 0 + 15504 = N 6 0 + 15648 = N 2 0 + 15648 = N 4 0 + 15648 = N 6 0 + 15744 = N 2 0 + 15744 = N 4 0 + 15744 = N 6 0 + 15840 = N 1 0 + 15840 = N 6 0 + 16848 = N 2 0 + 16848 = N 6 0 + 16896 = N 3 0 + 16896 = N 6 0 + 16992 = N 4 160 + 16992 = N 6 0 + 17184 = N 3 0 + 17184 = N 6 0 + 17232 = N 2 0 + 17232 = N 6 0 + 18336 = N 0 0 + 18336 = N 6 0 + 18432 = N 0 0 + 18432 = N 2 0 + 18432 = N 6 0 + 18480 = N 0 0 + 18480 = N 2 0 + 18480 = N 6 0 + 18576 = N 1 0 + 18576 = N 6 0 + 18624 = N 2 0 + 18624 = N 6 0 + 18720 = N 0 0 + 18720 = N 2 0 + 18720 = N 6 0 + 18768 = N 0 0 + 18768 = N 2 0 + 18768 = N 6 0 + 19776 = N 2 0 + 19776 = N 6 0 + 19824 = N 3 0 + 19824 = N 6 0 + 19872 = N 4 0 + 19872 = N 6 0 + 19968 = N 2 0 + 19968 = N 6 0 + 20016 = N 1 0 + 20016 = N 6 0 + 20064 = N 0 0 + 20064 = N 6 0 + 20160 = N 1 0 + 20160 = N 6 0 + 20256 = N 0 0 + 20256 = N 6 0 + 20304 = N 2 0 + 20304 = N 6 0 + 20448 = N 3 0 + 20448 = N 6 0 + 20496 = N 4 0 + 20496 = N 6 0 + 21408 = N 2 0 + 21408 = N 6 0 + 21456 = N 3 0 + 21456 = N 6 0 + 21504 = N 4 112 + 21504 = N 6 0 + 21648 = N 3 0 + 21648 = N 6 0 + 21696 = N 2 0 + 21696 = N 6 0 + 21744 = N 1 0 + 21744 = N 6 0 + 21792 = N 3 0 + 21792 = N 6 0 + 21888 = N 3 0 + 21888 = N 6 0 + 21936 = N 0 0 + 21936 = N 6 0 + 22848 = N 2 0 + 22848 = N 4 0 + 22848 = N 6 0 + 23040 = N 1 0 + 23040 = N 6 0 + 23136 = N 2 0 + 23136 = N 4 0 + 23136 = N 6 0 + 23328 = N 1 0 + 23328 = N 6 0 + 23424 = N 2 0 + 23424 = N 6 0 + 23472 = N 1 0 + 23472 = N 6 0 + 23520 = N 0 0 + 23520 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 0 112 + 24576 = N 2 112 + 24576 = N 6 0 + 24720 = N 1 112 + 24720 = N 2 112 + 24720 = N 6 0 + 24864 = N 1 160 + 24864 = N 2 160 + 24864 = N 6 0 + 25056 = N 1 0 + 25056 = N 3 0 + 25056 = N 6 0 + 25920 = N 0 112 + 25920 = N 2 112 + 25920 = N 6 0 + 26064 = N 1 0 + 26064 = N 2 0 + 26064 = N 6 0 + 26208 = N 1 0 + 26208 = N 3 0 + 26208 = N 6 0 + 26496 = N 2 0 + 26496 = N 6 0 + 26544 = N 1 0 + 26544 = N 6 0 + 26592 = N 0 0 + 26592 = N 6 0 + 27552 = N 2 0 + 27552 = N 4 0 + 27552 = N 6 0 + 27744 = N 2 0 + 27744 = N 6 0 + 27792 = N 4 0 + 27792 = N 6 0 + 27840 = N 2 0 + 27840 = N 6 0 + 27888 = N 4 0 + 27888 = N 6 0 + 27936 = N 2 0 + 27936 = N 6 0 + 27984 = N 4 0 + 27984 = N 6 0 + 28032 = N 2 0 + 28032 = N 6 0 + 28080 = N 4 0 + 28080 = N 6 0 + 28128 = N 2 0 + 28128 = N 6 0 + 28176 = N 4 0 + 28176 = N 6 0 + 28224 = N 2 0 + 28224 = N 6 0 + 28272 = N 4 0 + 28272 = N 6 0 + 28320 = N 2 0 + 28320 = N 6 0 + 28368 = N 4 0 + 28368 = N 6 0 + 28416 = N 2 0 + 28416 = N 6 0 + 28464 = N 4 0 + 28464 = N 6 0 + 28512 = N 2 0 + 28512 = N 6 0 + 28560 = N 4 0 + 28560 = N 6 0 + 28608 = N 2 0 + 28608 = N 6 0 + 28656 = N 4 0 + 28656 = N 6 0 + 28704 = N 2 0 + 28704 = N 6 0 + 28752 = N 4 0 + 28752 = N 6 0 + 28800 = N 2 0 + 28800 = N 6 0 + 28848 = N 4 0 + 28848 = N 6 0 + 28992 = S 2 576 + 29088 = N 1 0 + 29088 = N 6 0 + 29184 = N 2 0 + 29184 = N 4 0 + 29184 = N 6 0 + 29328 = N 2 0 + 29328 = N 4 0 + 29328 = N 6 0 + 29472 = N 2 0 + 29472 = N 4 0 + 29472 = N 6 0 + 30816 = N 0 0 + 30816 = N 6 0 + 30912 = N 1 0 + 30912 = N 3 0 + 30912 = N 6 0 + 31104 = N 2 0 + 31104 = N 6 0 + 31200 = N 0 0 + 31200 = N 6 0 + 31296 = N 1 0 + 31296 = N 3 0 + 31296 = N 6 0 + 31680 = N 1 0 + 31680 = N 3 0 + 31680 = N 6 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32064 = N 3 0 + 32064 = N 6 0 + 32160 = N 0 0 + 32160 = N 6 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32352 = N 3 0 + 32352 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 0 0 + 32544 = N 6 0 + 32640 = E soloend + 33024 = N 1 0 + 33024 = N 6 0 + 33072 = N 2 0 + 33072 = N 6 0 + 33120 = N 3 0 + 33120 = N 6 0 + 33408 = N 1 0 + 33408 = N 6 0 + 33456 = N 2 0 + 33456 = N 6 0 + 33504 = N 3 0 + 33504 = N 6 0 + 33792 = N 1 0 + 33792 = N 6 0 + 33840 = N 2 0 + 33840 = N 6 0 + 33888 = N 3 0 + 33888 = N 6 0 + 34080 = N 0 448 + 34080 = N 6 0 + 34560 = N 1 0 + 34560 = N 6 0 + 34608 = N 2 0 + 34608 = N 6 0 + 34656 = N 3 0 + 34656 = N 6 0 + 34944 = N 1 0 + 34944 = N 6 0 + 34992 = N 2 0 + 34992 = N 6 0 + 35040 = N 3 0 + 35040 = N 6 0 + 35328 = N 1 0 + 35328 = N 6 0 + 35376 = N 2 0 + 35376 = N 6 0 + 35424 = N 3 0 + 35424 = N 6 0 + 35616 = N 0 256 + 35616 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 35952 = N 2 0 + 35952 = N 6 0 + 36000 = N 3 0 + 36000 = N 6 0 + 36288 = N 1 0 + 36288 = N 6 0 + 36336 = N 2 0 + 36336 = N 6 0 + 36384 = N 3 0 + 36384 = N 6 0 + 36672 = N 1 0 + 36672 = N 6 0 + 36720 = N 2 0 + 36720 = N 6 0 + 36768 = N 3 0 + 36768 = N 6 0 + 36864 = N 3 0 + 36864 = N 6 0 + 36864 = S 2 768 + 36864 = E solo + 36960 = N 4 0 + 36960 = N 6 0 + 37008 = N 3 0 + 37008 = N 6 0 + 37104 = N 4 0 + 37104 = N 6 0 + 37152 = N 3 0 + 37152 = N 6 0 + 37248 = N 4 0 + 37248 = N 6 0 + 37296 = N 3 0 + 37296 = N 6 0 + 37392 = N 4 0 + 37392 = N 6 0 + 37440 = N 4 384 + 37440 = N 6 0 + 37920 = N 3 0 + 37920 = N 6 0 + 37968 = N 2 0 + 37968 = N 6 0 + 38064 = N 3 0 + 38064 = N 6 0 + 38112 = N 2 0 + 38112 = N 6 0 + 38208 = N 3 0 + 38208 = N 6 0 + 38256 = N 2 256 + 38256 = N 6 0 + 38592 = N 1 0 + 38592 = N 6 0 + 38784 = N 0 0 + 38784 = N 6 0 + 38832 = N 1 0 + 38832 = N 6 0 + 38880 = N 2 0 + 38880 = N 6 0 + 38976 = N 3 0 + 38976 = N 6 0 + 39024 = N 2 0 + 39024 = N 6 0 + 39072 = N 1 0 + 39072 = N 6 0 + 39168 = N 2 0 + 39168 = N 6 0 + 39216 = N 3 0 + 39216 = N 6 0 + 39264 = N 1 0 + 39264 = N 6 0 + 39312 = N 3 0 + 39312 = N 6 0 + 39360 = N 2 0 + 39360 = N 6 0 + 39504 = N 1 0 + 39504 = N 6 0 + 39552 = N 0 0 + 39552 = N 6 0 + 39648 = N 4 0 + 39648 = N 6 0 + 39696 = N 3 0 + 39696 = N 6 0 + 39744 = N 2 0 + 39744 = N 6 0 + 39840 = N 1 0 + 39840 = N 6 0 + 39936 = N 2 0 + 39936 = N 6 0 + 39984 = N 1 0 + 39984 = N 6 0 + 40032 = N 0 0 + 40032 = N 6 0 + 40128 = N 0 0 + 40128 = N 6 0 + 40176 = N 1 0 + 40176 = N 6 0 + 40224 = N 2 0 + 40224 = N 6 0 + 40272 = N 3 0 + 40272 = N 6 0 + 40320 = N 4 0 + 40320 = N 6 0 + 40512 = N 3 0 + 40512 = N 6 0 + 40608 = N 1 0 + 40608 = N 6 0 + 40704 = N 2 0 + 40704 = N 6 0 + 40800 = N 0 144 + 40800 = N 6 0 + 41136 = N 1 0 + 41136 = N 6 0 + 41184 = N 2 0 + 41184 = N 6 0 + 41280 = N 2 96 + 41280 = N 6 0 + 41408 = N 2 128 + 41408 = N 6 0 + 41568 = N 3 160 + 41568 = N 6 0 + 41760 = N 4 0 + 41760 = N 6 0 + 41856 = N 4 256 + 41856 = N 6 0 + 42144 = N 0 160 + 42144 = N 6 0 + 42336 = N 2 256 + 42336 = N 6 0 + 42624 = N 3 352 + 42624 = N 6 0 + 43008 = N 4 448 + 43008 = N 6 0 + 43488 = N 3 112 + 43488 = N 6 0 + 43680 = N 2 0 + 43680 = N 6 0 + 43776 = N 2 160 + 43776 = N 6 0 + 43776 = S 2 1152 + 43968 = N 2 112 + 43968 = N 6 0 + 44112 = N 2 0 + 44112 = N 6 0 + 44208 = N 2 0 + 44208 = N 6 0 + 44256 = N 2 0 + 44256 = N 6 0 + 44448 = N 2 160 + 44448 = N 6 0 + 44640 = N 2 0 + 44640 = N 6 0 + 44736 = N 2 112 + 44736 = N 6 0 + 44880 = N 2 112 + 44880 = N 6 0 + 45024 = N 1 0 + 45024 = N 6 0 + 45072 = N 2 0 + 45072 = N 6 0 + 45168 = N 3 0 + 45168 = N 6 0 + 45360 = N 1 0 + 45360 = N 6 0 + 45408 = N 2 0 + 45408 = N 6 0 + 45456 = N 3 0 + 45456 = N 6 0 + 45504 = N 4 0 + 45504 = N 6 0 + 45600 = N 2 0 + 45600 = N 6 0 + 45648 = N 1 0 + 45648 = N 6 0 + 45696 = N 2 0 + 45696 = N 6 0 + 45744 = N 3 0 + 45744 = N 6 0 + 45792 = N 4 0 + 45792 = N 6 0 + 45888 = N 2 0 + 45888 = N 6 0 + 45936 = N 3 0 + 45936 = N 6 0 + 45984 = N 4 0 + 45984 = N 6 0 + 46080 = N 3 0 + 46080 = N 6 0 + 46176 = N 0 0 + 46176 = N 6 0 + 46224 = N 2 0 + 46224 = N 6 0 + 46320 = N 1 0 + 46320 = N 6 0 + 46368 = N 3 0 + 46368 = N 6 0 + 46464 = N 2 0 + 46464 = N 6 0 + 46512 = N 4 0 + 46512 = N 6 0 + 46560 = N 3 0 + 46560 = N 6 0 + 46656 = N 4 0 + 46656 = N 6 0 + 46704 = N 3 0 + 46704 = N 6 0 + 46752 = N 2 0 + 46752 = N 6 0 + 46800 = N 3 0 + 46800 = N 6 0 + 46848 = N 2 0 + 46848 = N 6 0 + 46896 = N 1 0 + 46896 = N 6 0 + 47040 = N 3 0 + 47040 = N 6 0 + 47088 = N 2 0 + 47088 = N 6 0 + 47136 = N 1 0 + 47136 = N 6 0 + 47184 = N 2 0 + 47184 = N 6 0 + 47232 = N 1 0 + 47232 = N 6 0 + 47280 = N 0 112 + 47280 = N 6 0 + 47376 = E soloend + 47424 = N 4 864 + 47424 = N 6 0 + 48320 = N 3 0 + 48320 = N 6 0 + 48448 = N 2 0 + 48448 = N 6 0 + 48576 = N 1 0 + 48576 = N 6 0 + 48704 = N 0 0 + 48704 = N 6 0 + 48832 = N 1 0 + 48832 = N 6 0 + 48960 = N 2 160 + 48960 = N 6 0 + 49152 = N 0 0 + 49152 = N 6 0 + 49296 = N 1 0 + 49296 = N 6 0 + 49344 = N 2 0 + 49344 = N 6 0 + 49440 = N 1 0 + 49440 = N 6 0 + 49536 = N 1 256 + 49536 = N 6 0 + 49824 = N 0 0 + 49824 = N 6 0 + 49872 = N 1 0 + 49872 = N 6 0 + 49920 = N 2 0 + 49920 = N 6 0 + 49968 = N 4 0 + 49968 = N 6 0 + 50064 = N 1 0 + 50064 = N 6 0 + 50112 = N 3 0 + 50112 = N 6 0 + 50208 = N 2 0 + 50208 = N 6 0 + 50256 = N 1 0 + 50256 = N 6 0 + 50304 = N 2 0 + 50304 = N 6 0 + 50352 = N 1 0 + 50352 = N 6 0 + 50400 = N 0 0 + 50400 = N 6 0 + 50496 = N 4 864 + 50496 = N 6 0 + 51392 = N 3 0 + 51392 = N 6 0 + 51520 = N 2 0 + 51520 = N 6 0 + 51648 = N 1 0 + 51648 = N 6 0 + 51776 = N 0 0 + 51776 = N 6 0 + 51904 = N 1 0 + 51904 = N 6 0 + 52032 = N 4 208 + 52032 = N 6 0 + 52224 = S 2 1344 + 52272 = N 3 0 + 52272 = N 6 0 + 52368 = N 2 0 + 52368 = N 6 0 + 52416 = N 4 0 + 52416 = N 6 0 + 52512 = N 2 0 + 52512 = N 6 0 + 52560 = N 3 0 + 52560 = N 6 0 + 52656 = N 1 0 + 52656 = N 6 0 + 52704 = N 3 0 + 52704 = N 6 0 + 52800 = N 1 0 + 52800 = N 6 0 + 52848 = N 2 0 + 52848 = N 6 0 + 52944 = N 0 0 + 52944 = N 6 0 + 52992 = N 2 0 + 52992 = N 6 0 + 53088 = N 1 0 + 53088 = N 6 0 + 53136 = N 0 0 + 53136 = N 6 0 + 53280 = N 2 0 + 53280 = N 6 0 + 53328 = N 1 0 + 53328 = N 6 0 + 53376 = N 0 0 + 53376 = N 6 0 + 53568 = N 4 864 + 53568 = N 6 0 + 54464 = N 3 0 + 54464 = N 6 0 + 54592 = N 2 0 + 54592 = N 6 0 + 54720 = N 1 0 + 54720 = N 6 0 + 54848 = N 0 0 + 54848 = N 6 0 + 54976 = N 1 0 + 54976 = N 6 0 + 55104 = N 2 160 + 55104 = N 6 0 + 55296 = N 0 0 + 55296 = N 6 0 + 55488 = N 4 0 + 55488 = N 6 0 + 55536 = N 3 0 + 55536 = N 6 0 + 55584 = N 2 0 + 55584 = N 6 0 + 55680 = N 0 0 + 55680 = N 6 0 + 55728 = N 1 0 + 55728 = N 6 0 + 55776 = N 2 0 + 55776 = N 6 0 + 55872 = N 1 0 + 55872 = N 6 0 + 55920 = N 2 0 + 55920 = N 6 0 + 55968 = N 3 0 + 55968 = N 6 0 + 56064 = N 2 0 + 56064 = N 6 0 + 56112 = N 1 0 + 56112 = N 6 0 + 56160 = N 0 0 + 56160 = N 6 0 + 56208 = N 1 0 + 56208 = N 6 0 + 56352 = N 3 0 + 56352 = N 6 0 + 56400 = N 1 0 + 56400 = N 6 0 + 56496 = N 2 112 + 56496 = N 6 0 + 56640 = N 4 864 + 56640 = N 6 0 + 57536 = N 3 0 + 57536 = N 6 0 + 57664 = N 2 0 + 57664 = N 6 0 + 57792 = N 1 0 + 57792 = N 6 0 + 57920 = N 0 0 + 57920 = N 6 0 + 58048 = N 1 0 + 58048 = N 6 0 + 58176 = N 4 240 + 58176 = N 6 0 + 58512 = N 1 0 + 58512 = N 6 0 + 58656 = N 2 0 + 58656 = N 6 0 + 58800 = N 3 0 + 58800 = N 6 0 + 58848 = N 4 352 + 58848 = N 6 0 + 59232 = N 0 0 + 59232 = N 6 0 + 59280 = N 3 0 + 59280 = N 6 0 + 59376 = N 0 0 + 59376 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59520 = N 1 0 + 59520 = N 6 0 + 59616 = N 0 0 + 59616 = N 6 0 + 59712 = N 4 160 + 59712 = N 6 0 + 59904 = N 3 0 + 59904 = N 6 0 + 59952 = N 2 0 + 59952 = N 6 0 + 60048 = N 4 144 + 60048 = N 6 0 + 60384 = N 2 0 + 60384 = N 6 0 + 60432 = N 3 0 + 60432 = N 6 0 + 60480 = N 4 0 + 60480 = N 6 0 + 60576 = N 4 0 + 60576 = N 6 0 + 60672 = N 3 0 + 60672 = N 6 0 + 60720 = N 2 0 + 60720 = N 6 0 + 60816 = N 4 144 + 60816 = N 6 0 + 61152 = N 2 0 + 61152 = N 6 0 + 61152 = S 2 1440 + 61248 = N 3 192 + 61248 = N 6 0 + 61536 = N 1 112 + 61536 = N 6 0 + 61728 = N 0 0 + 61728 = N 6 0 + 61824 = N 3 256 + 61824 = N 6 0 + 62112 = N 1 112 + 62112 = N 6 0 + 62304 = N 0 0 + 62304 = N 6 0 + 62400 = N 1 0 + 62400 = N 6 0 + 62784 = N 4 160 + 62784 = N 6 0 + 62976 = N 3 0 + 62976 = N 6 0 + 63024 = N 2 0 + 63024 = N 6 0 + 63120 = N 4 144 + 63120 = N 6 0 + 63456 = N 2 0 + 63456 = N 6 0 + 63504 = N 3 0 + 63504 = N 6 0 + 63552 = N 4 0 + 63552 = N 6 0 + 63648 = N 4 0 + 63648 = N 6 0 + 63744 = N 3 0 + 63744 = N 6 0 + 63792 = N 2 0 + 63792 = N 6 0 + 63888 = N 4 144 + 63888 = N 6 0 + 64224 = N 2 0 + 64224 = N 6 0 + 64320 = N 3 192 + 64320 = N 6 0 + 64608 = N 1 112 + 64608 = N 6 0 + 64800 = N 0 0 + 64800 = N 6 0 + 64896 = N 3 256 + 64896 = N 6 0 + 65184 = N 1 112 + 65184 = N 6 0 + 65376 = N 0 0 + 65376 = N 6 0 + 65472 = N 1 0 + 65472 = N 6 0 + 66048 = N 1 0 + 66048 = N 6 0 + 66096 = N 2 0 + 66096 = N 6 0 + 66144 = N 3 0 + 66144 = N 6 0 + 66432 = N 1 0 + 66432 = N 6 0 + 66480 = N 2 0 + 66480 = N 6 0 + 66528 = N 3 0 + 66528 = N 6 0 + 66816 = N 1 0 + 66816 = N 6 0 + 66864 = N 2 0 + 66864 = N 6 0 + 66912 = N 3 0 + 66912 = N 6 0 + 67104 = N 0 288 + 67104 = N 6 0 + 67584 = N 1 0 + 67584 = N 6 0 + 67632 = N 2 0 + 67632 = N 6 0 + 67680 = N 3 0 + 67680 = N 6 0 + 67968 = N 1 0 + 67968 = N 6 0 + 68016 = N 2 0 + 68016 = N 6 0 + 68064 = N 3 0 + 68064 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68400 = N 2 0 + 68400 = N 6 0 + 68448 = N 3 0 + 68448 = N 6 0 + 68640 = N 0 288 + 68640 = N 6 0 + 69120 = N 2 0 + 69120 = N 6 0 + 69120 = S 2 1344 + 69168 = N 3 0 + 69168 = N 6 0 + 69216 = N 4 0 + 69216 = N 6 0 + 69504 = N 2 0 + 69504 = N 6 0 + 69552 = N 3 0 + 69552 = N 6 0 + 69600 = N 4 0 + 69600 = N 6 0 + 69888 = N 2 0 + 69888 = N 6 0 + 69936 = N 3 0 + 69936 = N 6 0 + 69984 = N 4 0 + 69984 = N 6 0 + 70176 = N 1 288 + 70176 = N 6 0 + 70656 = N 2 0 + 70656 = N 6 0 + 70704 = N 3 0 + 70704 = N 6 0 + 70752 = N 4 0 + 70752 = N 6 0 + 71040 = N 2 0 + 71040 = N 6 0 + 71088 = N 3 0 + 71088 = N 6 0 + 71136 = N 4 0 + 71136 = N 6 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71472 = N 3 0 + 71472 = N 6 0 + 71520 = N 4 0 + 71520 = N 6 0 + 71712 = N 4 384 + 71712 = N 6 0 + 72192 = N 4 352 + 72192 = N 6 0 + 72576 = N 3 352 + 72576 = N 6 0 + 72960 = N 2 352 + 72960 = N 6 0 + 73344 = N 1 352 + 73344 = N 6 0 + 73728 = N 0 192 + 73728 = N 6 0 + 74976 = N 1 0 + 74976 = N 6 0 + 74976 = E solo + 75024 = N 2 0 + 75024 = N 6 0 + 75072 = N 3 0 + 75072 = N 6 0 + 75120 = N 4 0 + 75120 = N 6 0 + 75168 = N 3 0 + 75168 = N 6 0 + 75264 = N 3 0 + 75264 = N 6 0 + 75312 = N 2 0 + 75312 = N 6 0 + 75360 = N 1 0 + 75360 = N 6 0 + 75792 = N 3 0 + 75792 = N 6 0 + 75840 = N 4 0 + 75840 = N 6 0 + 75936 = N 1 0 + 75936 = N 6 0 + 75984 = N 2 0 + 75984 = N 6 0 + 76032 = N 3 0 + 76032 = N 6 0 + 76080 = N 2 0 + 76080 = N 6 0 + 76128 = N 1 0 + 76128 = N 6 0 + 76176 = N 0 0 + 76176 = N 6 0 + 76224 = N 1 0 + 76224 = N 6 0 + 76896 = N 1 0 + 76896 = N 6 0 + 76944 = N 2 0 + 76944 = N 6 0 + 77040 = N 3 0 + 77040 = N 6 0 + 77136 = N 4 0 + 77136 = N 6 0 + 77232 = N 3 0 + 77232 = N 6 0 + 77328 = N 4 0 + 77328 = N 6 0 + 77376 = N 3 0 + 77376 = N 6 0 + 77424 = N 2 0 + 77424 = N 6 0 + 77472 = N 1 0 + 77472 = N 6 0 + 77568 = N 3 0 + 77568 = N 6 0 + 77616 = N 2 0 + 77616 = N 6 0 + 77664 = N 1 0 + 77664 = N 6 0 + 77760 = N 2 0 + 77760 = N 6 0 + 77808 = N 1 0 + 77808 = N 6 0 + 77856 = N 0 0 + 77856 = N 6 0 + 78768 = N 0 0 + 78768 = N 6 0 + 78864 = N 1 0 + 78864 = N 6 0 + 78960 = N 2 0 + 78960 = N 6 0 + 79056 = N 1 0 + 79056 = N 6 0 + 79152 = N 2 0 + 79152 = N 6 0 + 79248 = N 3 0 + 79248 = N 6 0 + 79344 = N 2 0 + 79344 = N 6 0 + 79392 = N 3 0 + 79392 = N 6 0 + 79488 = N 0 0 + 79488 = N 6 0 + 79536 = N 1 0 + 79536 = N 6 0 + 79584 = N 2 0 + 79584 = N 6 0 + 79680 = N 2 0 + 79680 = N 6 0 + 79728 = N 3 0 + 79728 = N 6 0 + 79776 = N 4 0 + 79776 = N 6 0 + 79824 = N 3 0 + 79824 = N 6 0 + 79872 = N 2 0 + 79872 = N 6 0 + 79968 = N 1 0 + 79968 = N 6 0 + 80016 = N 0 0 + 80016 = N 6 0 + 80064 = N 1 0 + 80064 = N 6 0 + 80112 = N 0 0 + 80112 = N 6 0 + 80208 = N 1 0 + 80208 = N 6 0 + 80256 = N 0 0 + 80256 = N 6 0 + 80304 = N 1 0 + 80304 = N 6 0 + 80352 = N 2 0 + 80352 = N 6 0 + 80448 = N 1 0 + 80448 = N 6 0 + 80544 = N 0 0 + 80544 = N 6 0 + 81024 = S 2 2112 + 81168 = N 3 0 + 81168 = N 6 0 + 81216 = N 4 0 + 81216 = N 6 0 + 81360 = N 4 0 + 81360 = N 6 0 + 81504 = N 2 0 + 81504 = N 6 0 + 81648 = N 3 0 + 81648 = N 6 0 + 81696 = N 4 0 + 81696 = N 6 0 + 81792 = N 3 0 + 81792 = N 6 0 + 81936 = N 2 0 + 81936 = N 6 0 + 81984 = N 3 0 + 81984 = N 6 0 + 82032 = N 2 0 + 82032 = N 6 0 + 82080 = N 1 0 + 82080 = N 6 0 + 82128 = N 3 0 + 82128 = N 6 0 + 82176 = N 2 0 + 82176 = N 6 0 + 82272 = N 2 0 + 82272 = N 6 0 + 82320 = N 1 0 + 82320 = N 6 0 + 82368 = N 0 0 + 82368 = N 6 0 + 82464 = N 2 0 + 82464 = N 6 0 + 82512 = N 1 0 + 82512 = N 6 0 + 82560 = N 0 0 + 82560 = N 6 0 + 82656 = N 2 0 + 82656 = N 6 0 + 82704 = N 1 0 + 82704 = N 6 0 + 82752 = N 2 0 + 82752 = N 6 0 + 82848 = N 1 0 + 82848 = N 6 0 + 82944 = N 0 0 + 82944 = N 6 0 + 83616 = N 0 0 + 83616 = N 6 0 + 83664 = N 1 0 + 83664 = N 6 0 + 83712 = N 2 112 + 83712 = N 6 0 + 83856 = N 1 0 + 83856 = N 6 0 + 83904 = N 2 0 + 83904 = N 6 0 + 83952 = N 3 0 + 83952 = N 6 0 + 84000 = N 4 0 + 84000 = N 6 0 + 84096 = N 3 0 + 84096 = N 6 0 + 84144 = N 2 0 + 84144 = N 6 0 + 84192 = N 1 0 + 84192 = N 6 0 + 84288 = N 2 0 + 84288 = N 6 0 + 84336 = N 1 0 + 84336 = N 6 0 + 84384 = N 0 0 + 84384 = N 6 0 + 84432 = N 1 0 + 84432 = N 6 0 + 84480 = N 2 0 + 84480 = N 6 0 + 84528 = N 1 0 + 84528 = N 6 0 + 84576 = N 0 0 + 84576 = N 6 0 + 84624 = N 1 0 + 84624 = N 6 0 + 84672 = N 2 0 + 84672 = N 6 0 + 84720 = N 1 0 + 84720 = N 6 0 + 84768 = N 0 0 + 84768 = N 6 0 + 84816 = N 1 0 + 84816 = N 6 0 + 84864 = N 2 0 + 84864 = N 6 0 + 84912 = N 1 0 + 84912 = N 6 0 + 84960 = N 0 0 + 84960 = N 6 0 + 85008 = N 1 0 + 85008 = N 6 0 + 85056 = N 2 0 + 85056 = N 6 0 + 85104 = N 1 0 + 85104 = N 6 0 + 85152 = N 0 0 + 85152 = N 6 0 + 85200 = N 1 0 + 85200 = N 6 0 + 85248 = N 2 0 + 85248 = N 6 0 + 85296 = N 1 0 + 85296 = N 6 0 + 85344 = N 0 0 + 85344 = N 6 0 + 85680 = N 4 0 + 85680 = N 6 0 + 85728 = N 3 0 + 85728 = N 6 0 + 85824 = N 3 0 + 85824 = N 6 0 + 85872 = N 2 0 + 85872 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 86016 = N 2 0 + 86016 = N 6 0 + 86064 = N 1 0 + 86064 = N 6 0 + 86112 = N 0 0 + 86112 = N 6 0 + 86208 = N 2 0 + 86208 = N 6 0 + 86256 = N 1 0 + 86256 = N 6 0 + 86304 = N 0 0 + 86304 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86448 = N 3 0 + 86448 = N 6 0 + 86496 = N 4 0 + 86496 = N 6 0 + 86832 = N 0 0 + 86832 = N 6 0 + 86928 = N 1 0 + 86928 = N 6 0 + 87024 = N 2 0 + 87024 = N 6 0 + 87120 = N 1 0 + 87120 = N 6 0 + 87216 = N 3 0 + 87216 = N 6 0 + 87312 = N 4 0 + 87312 = N 6 0 + 87408 = N 3 0 + 87408 = N 6 0 + 87456 = N 4 0 + 87456 = N 6 0 + 87504 = N 3 0 + 87504 = N 6 0 + 87552 = N 4 0 + 87552 = N 6 0 + 87600 = N 3 0 + 87600 = N 6 0 + 87648 = N 2 0 + 87648 = N 6 0 + 87744 = N 3 0 + 87744 = N 6 0 + 87792 = N 1 0 + 87792 = N 6 0 + 87840 = N 2 0 + 87840 = N 6 0 + 88368 = N 0 0 + 88368 = N 6 0 + 88416 = N 1 0 + 88416 = N 6 0 + 88464 = N 2 0 + 88464 = N 6 0 + 88512 = N 1 0 + 88512 = N 6 0 + 88656 = N 3 0 + 88656 = N 6 0 + 88752 = N 2 0 + 88752 = N 6 0 + 88848 = N 3 0 + 88848 = N 6 0 + 88944 = N 4 112 + 88944 = N 6 0 + 89088 = N 4 0 + 89088 = N 6 0 + 89136 = N 3 0 + 89136 = N 6 0 + 89184 = N 2 0 + 89184 = N 6 0 + 89280 = N 3 0 + 89280 = N 6 0 + 89328 = N 2 0 + 89328 = N 6 0 + 89376 = N 1 0 + 89376 = N 6 0 + 89904 = N 3 0 + 89904 = N 6 0 + 89952 = N 1 0 + 89952 = N 6 0 + 90000 = N 3 0 + 90000 = N 6 0 + 90048 = N 2 0 + 90048 = N 6 0 + 90096 = N 1 0 + 90096 = N 6 0 + 90144 = N 2 0 + 90144 = N 6 0 + 90240 = N 3 0 + 90240 = N 6 0 + 90288 = N 2 0 + 90288 = N 6 0 + 90336 = N 1 0 + 90336 = N 6 0 + 90432 = N 2 0 + 90432 = N 6 0 + 90528 = N 0 0 + 90528 = N 6 0 + 90624 = N 4 0 + 90624 = N 6 0 + 91200 = S 2 960 + 91248 = N 2 0 + 91248 = N 6 0 + 91296 = N 4 0 + 91296 = N 6 0 + 91392 = N 2 0 + 91392 = N 6 0 + 91536 = N 1 0 + 91536 = N 6 0 + 91584 = N 3 0 + 91584 = N 6 0 + 91632 = N 1 0 + 91632 = N 6 0 + 91728 = N 2 0 + 91728 = N 6 0 + 91824 = N 0 0 + 91824 = N 6 0 + 91920 = N 1 0 + 91920 = N 6 0 + 92016 = N 0 0 + 92016 = N 6 0 + 92112 = N 0 0 + 92112 = N 6 0 + 92448 = N 1 0 + 92448 = N 6 0 + 92496 = N 0 0 + 92496 = N 6 0 + 92544 = N 1 0 + 92544 = N 6 0 + 92592 = N 2 0 + 92592 = N 6 0 + 92640 = N 3 0 + 92640 = N 6 0 + 92736 = N 2 0 + 92736 = N 6 0 + 92784 = N 3 0 + 92784 = N 6 0 + 92832 = N 4 0 + 92832 = N 6 0 + 92928 = N 3 0 + 92928 = N 6 0 + 92976 = N 2 0 + 92976 = N 6 0 + 93024 = N 1 0 + 93024 = N 6 0 + 93120 = N 2 0 + 93120 = N 6 0 + 93168 = N 1 0 + 93168 = N 6 0 + 93216 = N 0 0 + 93216 = N 6 0 + 93312 = N 2 0 + 93312 = N 6 0 + 93360 = N 0 0 + 93360 = N 6 0 + 93408 = N 1 0 + 93408 = N 6 0 + 93504 = N 2 0 + 93504 = N 6 0 + 93600 = N 1 0 + 93600 = N 6 0 + 93648 = N 0 0 + 93648 = N 6 0 + 93792 = N 1 0 + 93792 = N 6 0 + 93840 = N 2 0 + 93840 = N 6 0 + 93888 = N 3 0 + 93888 = N 6 0 + 93984 = N 3 0 + 93984 = N 6 0 + 94080 = N 3 0 + 94080 = N 6 0 + 94128 = N 2 0 + 94128 = N 6 0 + 94176 = N 1 0 + 94176 = N 6 0 + 94368 = N 2 0 + 94368 = N 6 0 + 94416 = N 1 0 + 94416 = N 6 0 + 94464 = N 0 0 + 94464 = N 6 0 + 94512 = N 1 0 + 94512 = N 6 0 + 94560 = N 2 0 + 94560 = N 6 0 + 94656 = N 3 0 + 94656 = N 6 0 + 94704 = N 1 0 + 94704 = N 6 0 + 94848 = N 3 0 + 94848 = N 6 0 + 95088 = N 3 0 + 95088 = N 6 0 + 95232 = N 3 0 + 95232 = N 6 0 + 95376 = N 3 0 + 95376 = N 6 0 + 95520 = N 3 0 + 95520 = N 6 0 + 95664 = N 3 0 + 95664 = N 6 0 + 95808 = N 4 0 + 95808 = N 6 0 + 95856 = N 3 0 + 95856 = N 6 0 + 95904 = N 2 0 + 95904 = N 6 0 + 96384 = E soloend + 96768 = N 4 160 + 96768 = N 6 0 + 96960 = N 3 0 + 96960 = N 6 0 + 97008 = N 2 0 + 97008 = N 6 0 + 97104 = N 4 192 + 97104 = N 6 0 + 97440 = N 2 0 + 97440 = N 6 0 + 97488 = N 3 0 + 97488 = N 6 0 + 97536 = N 4 0 + 97536 = N 6 0 + 97632 = N 4 0 + 97632 = N 6 0 + 97728 = N 3 0 + 97728 = N 6 0 + 97776 = N 2 0 + 97776 = N 6 0 + 97872 = N 4 192 + 97872 = N 6 0 + 98208 = N 2 0 + 98208 = N 6 0 + 98304 = N 3 256 + 98304 = N 6 0 + 98592 = N 1 0 + 98592 = N 6 0 + 98784 = N 0 0 + 98784 = N 6 0 + 98880 = N 3 256 + 98880 = N 6 0 + 99168 = N 1 0 + 99168 = N 6 0 + 99360 = N 0 0 + 99360 = N 6 0 + 99456 = N 1 0 + 99456 = N 6 0 + 99840 = N 4 160 + 99840 = N 6 0 + 99840 = S 2 1344 + 100032 = N 3 0 + 100032 = N 6 0 + 100080 = N 2 0 + 100080 = N 6 0 + 100176 = N 4 192 + 100176 = N 6 0 + 100512 = N 2 0 + 100512 = N 6 0 + 100560 = N 3 0 + 100560 = N 6 0 + 100608 = N 4 0 + 100608 = N 6 0 + 100704 = N 4 0 + 100704 = N 6 0 + 100800 = N 3 0 + 100800 = N 6 0 + 100848 = N 2 0 + 100848 = N 6 0 + 100944 = N 4 240 + 100944 = N 6 0 + 101280 = N 2 0 + 101280 = N 6 0 + 101376 = N 3 0 + 101376 = N 6 0 + 101664 = N 1 112 + 101664 = N 6 0 + 101856 = N 0 0 + 101856 = N 6 0 + 101952 = N 3 256 + 101952 = N 6 0 + 102240 = N 1 112 + 102240 = N 6 0 + 102432 = N 0 0 + 102432 = N 6 0 + 102528 = N 1 192 + 102528 = N 6 0 + 103104 = N 1 0 + 103104 = N 6 0 + 103152 = N 2 0 + 103152 = N 6 0 + 103200 = N 3 0 + 103200 = N 6 0 + 103488 = N 1 0 + 103488 = N 6 0 + 103536 = N 2 0 + 103536 = N 6 0 + 103584 = N 3 0 + 103584 = N 6 0 + 103872 = N 1 0 + 103872 = N 6 0 + 103920 = N 2 0 + 103920 = N 6 0 + 103968 = N 3 0 + 103968 = N 6 0 + 104160 = N 0 288 + 104160 = N 6 0 + 104640 = N 1 0 + 104640 = N 6 0 + 104688 = N 2 0 + 104688 = N 6 0 + 104736 = N 3 0 + 104736 = N 6 0 + 105024 = N 1 0 + 105024 = N 6 0 + 105072 = N 2 0 + 105072 = N 6 0 + 105120 = N 3 0 + 105120 = N 6 0 + 105408 = N 1 0 + 105408 = N 6 0 + 105456 = N 2 0 + 105456 = N 6 0 + 105504 = N 3 0 + 105504 = N 6 0 + 105696 = N 0 288 + 105696 = N 6 0 + 106176 = N 2 0 + 106176 = N 6 0 + 106224 = N 3 0 + 106224 = N 6 0 + 106272 = N 4 0 + 106272 = N 6 0 + 106560 = N 2 0 + 106560 = N 6 0 + 106608 = N 3 0 + 106608 = N 6 0 + 106656 = N 4 0 + 106656 = N 6 0 + 106944 = N 2 0 + 106944 = N 6 0 + 106992 = N 3 0 + 106992 = N 6 0 + 107040 = N 4 0 + 107040 = N 6 0 + 107232 = N 1 288 + 107232 = N 6 0 + 107712 = N 2 0 + 107712 = N 6 0 + 107712 = S 2 1536 + 107760 = N 3 0 + 107760 = N 6 0 + 107808 = N 4 0 + 107808 = N 6 0 + 108096 = N 2 0 + 108096 = N 6 0 + 108144 = N 3 0 + 108144 = N 6 0 + 108192 = N 4 0 + 108192 = N 6 0 + 108480 = N 2 0 + 108480 = N 6 0 + 108528 = N 3 0 + 108528 = N 6 0 + 108576 = N 4 0 + 108576 = N 6 0 + 108768 = N 4 4288 + 108768 = N 6 0 + 113088 = N 3 0 + 113088 = N 6 0 + 113184 = N 4 0 + 113184 = N 6 0 + 113280 = N 3 0 + 113280 = N 6 0 + 113376 = N 2 0 + 113376 = N 6 0 + 113568 = N 0 0 + 113568 = N 6 0 + 113664 = N 3 0 + 113664 = N 6 0 + 113760 = N 4 0 + 113760 = N 6 0 + 113856 = N 3 0 + 113856 = N 6 0 + 113952 = N 2 0 + 113952 = N 6 0 + 114144 = N 0 0 + 114144 = N 6 0 + 114240 = N 3 0 + 114240 = N 6 0 + 114336 = N 4 0 + 114336 = N 6 0 + 114432 = N 3 0 + 114432 = N 6 0 + 114528 = N 2 0 + 114528 = N 6 0 + 114624 = N 3 256 + 114624 = N 6 0 + 114912 = N 1 0 + 114912 = N 6 0 + 115104 = N 0 0 + 115104 = N 6 0 + 115200 = N 3 256 + 115200 = N 6 0 + 115488 = N 1 0 + 115488 = N 6 0 + 115680 = N 0 0 + 115680 = N 6 0 + 115776 = N 1 0 + 115776 = N 6 0 + 116160 = N 3 0 + 116160 = N 6 0 + 116256 = N 4 0 + 116256 = N 6 0 + 116352 = N 3 0 + 116352 = N 6 0 + 116448 = N 2 0 + 116448 = N 6 0 + 116640 = N 0 0 + 116640 = N 6 0 + 116736 = N 3 0 + 116736 = N 6 0 + 116832 = N 4 0 + 116832 = N 6 0 + 116928 = N 3 0 + 116928 = N 6 0 + 117024 = N 2 0 + 117024 = N 6 0 + 117216 = N 0 0 + 117216 = N 6 0 + 117312 = N 3 0 + 117312 = N 6 0 + 117408 = N 4 0 + 117408 = N 6 0 + 117504 = N 3 0 + 117504 = N 6 0 + 117600 = N 2 0 + 117600 = N 6 0 + 117696 = N 3 352 + 117696 = N 6 0 + 118080 = N 2 0 + 118080 = N 6 0 + 118128 = N 1 0 + 118128 = N 6 0 + 118176 = N 0 0 + 118176 = N 6 0 + 120096 = N 1 0 + 120096 = N 6 0 + 120096 = E solo + 120192 = N 2 0 + 120192 = N 4 0 + 120192 = N 6 0 + 120336 = N 2 0 + 120336 = N 4 0 + 120336 = N 6 0 + 120480 = N 3 0 + 120480 = N 4 0 + 120480 = N 6 0 + 120576 = N 3 0 + 120576 = N 6 0 + 120624 = N 2 0 + 120624 = N 6 0 + 120672 = N 1 0 + 120672 = N 6 0 + 121536 = N 2 0 + 121536 = N 6 0 + 121584 = N 3 0 + 121584 = N 6 0 + 121632 = N 4 0 + 121632 = N 6 0 + 121728 = N 3 0 + 121728 = N 6 0 + 121776 = N 2 0 + 121776 = N 6 0 + 121824 = N 1 0 + 121824 = N 6 0 + 121920 = N 3 0 + 121920 = N 6 0 + 122016 = N 2 0 + 122016 = N 6 0 + 122064 = N 3 0 + 122064 = N 6 0 + 122160 = N 2 0 + 122160 = N 6 0 + 122208 = N 1 0 + 122208 = N 6 0 + 122304 = N 1 0 + 122304 = N 6 0 + 123168 = N 0 0 + 123168 = N 6 0 + 123264 = N 1 0 + 123264 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123408 = N 1 0 + 123408 = N 6 0 + 123456 = N 3 0 + 123456 = N 6 0 + 123616 = N 1 0 + 123616 = N 6 0 + 123680 = N 3 0 + 123680 = N 6 0 + 124704 = N 0 0 + 124704 = N 6 0 + 124800 = N 2 0 + 124800 = N 6 0 + 124848 = N 3 0 + 124848 = N 6 0 + 124896 = N 4 0 + 124896 = N 6 0 + 124992 = N 2 0 + 124992 = N 6 0 + 125040 = N 1 0 + 125040 = N 6 0 + 125088 = N 0 0 + 125088 = N 6 0 + 125184 = N 1 0 + 125184 = N 6 0 + 125280 = N 2 0 + 125280 = N 6 0 + 125376 = E soloend +} +[MediumSingle] +{ + 6144 = N 2 0 + 6144 = N 6 0 + 6240 = N 3 0 + 6240 = N 6 0 + 6336 = N 2 0 + 6336 = N 6 0 + 6432 = N 1 0 + 6432 = N 6 0 + 6720 = N 2 0 + 6720 = N 6 0 + 6816 = N 3 0 + 6816 = N 6 0 + 6912 = N 2 0 + 6912 = N 6 0 + 7008 = N 1 0 + 7008 = N 6 0 + 7296 = N 2 0 + 7296 = N 6 0 + 7392 = N 3 0 + 7392 = N 6 0 + 7488 = N 2 0 + 7488 = N 6 0 + 7584 = N 1 0 + 7584 = N 6 0 + 7680 = N 2 256 + 7680 = N 6 0 + 7680 = S 2 1536 + 7968 = N 1 0 + 7968 = N 6 0 + 8160 = N 0 0 + 8160 = N 6 0 + 8256 = N 2 256 + 8256 = N 6 0 + 8544 = N 1 0 + 8544 = N 6 0 + 8736 = N 0 0 + 8736 = N 6 0 + 8832 = N 1 0 + 8832 = N 6 0 + 9216 = N 2 0 + 9216 = N 6 0 + 9312 = N 3 0 + 9312 = N 6 0 + 9408 = N 2 0 + 9408 = N 6 0 + 9504 = N 1 0 + 9504 = N 6 0 + 9792 = N 2 0 + 9792 = N 6 0 + 9888 = N 3 0 + 9888 = N 6 0 + 9984 = N 2 0 + 9984 = N 6 0 + 10080 = N 1 0 + 10080 = N 6 0 + 10368 = N 2 0 + 10368 = N 6 0 + 10464 = N 3 0 + 10464 = N 6 0 + 10560 = N 2 0 + 10560 = N 6 0 + 10656 = N 1 0 + 10656 = N 6 0 + 10752 = N 2 448 + 10752 = N 6 0 + 11232 = N 0 0 + 11232 = N 6 0 + 12288 = N 1 160 + 12288 = N 2 160 + 12288 = N 6 0 + 12288 = E solo + 12480 = N 3 0 + 12480 = N 6 0 + 12576 = N 3 0 + 12576 = N 6 0 + 12672 = N 3 0 + 12672 = N 6 0 + 12768 = N 3 0 + 12768 = N 6 0 + 12864 = N 3 0 + 12864 = N 6 0 + 12960 = N 3 0 + 12960 = N 6 0 + 13056 = N 3 0 + 13056 = N 6 0 + 13152 = N 3 0 + 13152 = N 6 0 + 13248 = N 3 0 + 13248 = N 6 0 + 13344 = N 3 0 + 13344 = N 6 0 + 13440 = N 3 0 + 13440 = N 6 0 + 13632 = N 1 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13776 = N 2 0 + 13776 = N 6 0 + 13920 = N 3 0 + 13920 = N 6 0 + 14016 = N 2 0 + 14016 = N 6 0 + 14112 = N 1 0 + 14112 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 15168 = S 2 768 + 15264 = N 1 0 + 15264 = N 6 0 + 15360 = N 1 0 + 15360 = N 2 0 + 15360 = N 6 0 + 15504 = N 1 0 + 15504 = N 3 0 + 15504 = N 6 0 + 15648 = N 1 0 + 15648 = N 2 0 + 15648 = N 6 0 + 15744 = N 1 0 + 15744 = N 2 0 + 15744 = N 6 0 + 15840 = N 1 0 + 15840 = N 6 0 + 16896 = N 2 0 + 16896 = N 6 0 + 16992 = N 3 160 + 16992 = N 6 0 + 17184 = N 2 0 + 17184 = N 6 0 + 18336 = N 0 0 + 18336 = N 6 0 + 18432 = N 0 0 + 18432 = N 2 0 + 18432 = N 6 0 + 18624 = N 1 0 + 18624 = N 2 0 + 18624 = N 6 0 + 18720 = N 0 0 + 18720 = N 2 0 + 18720 = N 6 0 + 19776 = N 2 0 + 19776 = N 6 0 + 19872 = N 3 0 + 19872 = N 6 0 + 19968 = N 1 0 + 19968 = N 6 0 + 20064 = N 0 0 + 20064 = N 6 0 + 20160 = N 1 0 + 20160 = N 6 0 + 20304 = N 2 0 + 20304 = N 6 0 + 20448 = N 3 0 + 20448 = N 6 0 + 21408 = N 2 0 + 21408 = N 6 0 + 21504 = N 3 0 + 21504 = N 6 0 + 21696 = N 1 0 + 21696 = N 6 0 + 21792 = N 2 0 + 21792 = N 6 0 + 21888 = N 2 0 + 21888 = N 6 0 + 22848 = N 1 0 + 22848 = N 3 0 + 22848 = N 6 0 + 23040 = N 1 0 + 23040 = N 6 0 + 23136 = N 1 0 + 23136 = N 3 0 + 23136 = N 6 0 + 23328 = N 1 0 + 23328 = N 6 0 + 23424 = N 2 0 + 23424 = N 6 0 + 23520 = N 0 0 + 23520 = N 6 0 + 24480 = N 0 0 + 24480 = N 6 0 + 24576 = N 0 0 + 24576 = N 2 0 + 24576 = N 6 0 + 24720 = N 1 0 + 24720 = N 2 0 + 24720 = N 6 0 + 24864 = N 1 0 + 24864 = N 2 0 + 24864 = N 6 0 + 25056 = N 1 0 + 25056 = N 3 0 + 25056 = N 6 0 + 25920 = N 0 0 + 25920 = N 2 0 + 25920 = N 6 0 + 26064 = N 1 0 + 26064 = N 2 0 + 26064 = N 6 0 + 26208 = N 1 0 + 26208 = N 3 0 + 26208 = N 6 0 + 26496 = N 2 0 + 26496 = N 6 0 + 26592 = N 0 0 + 26592 = N 6 0 + 27552 = N 1 0 + 27552 = N 3 0 + 27552 = N 6 0 + 27744 = N 1 0 + 27744 = N 6 0 + 27840 = N 1 0 + 27840 = N 6 0 + 27936 = N 1 0 + 27936 = N 6 0 + 28032 = N 1 0 + 28032 = N 6 0 + 28128 = N 1 0 + 28128 = N 6 0 + 28224 = N 1 0 + 28224 = N 6 0 + 28320 = N 1 0 + 28320 = N 6 0 + 28416 = N 1 0 + 28416 = N 6 0 + 28512 = N 1 0 + 28512 = N 6 0 + 28608 = N 1 0 + 28608 = N 6 0 + 28704 = N 1 0 + 28704 = N 6 0 + 28800 = N 1 0 + 28800 = N 6 0 + 28992 = S 2 576 + 29088 = N 1 0 + 29088 = N 6 0 + 29184 = N 1 0 + 29184 = N 3 0 + 29184 = N 6 0 + 29328 = N 1 0 + 29328 = N 3 0 + 29328 = N 6 0 + 29472 = N 1 0 + 29472 = N 3 0 + 29472 = N 6 0 + 30816 = N 1 0 + 30816 = N 6 0 + 30912 = N 1 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31104 = N 2 0 + 31104 = N 6 0 + 31296 = N 1 0 + 31296 = N 2 0 + 31296 = N 6 0 + 31680 = N 1 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31968 = N 1 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32160 = N 1 0 + 32160 = N 6 0 + 32256 = N 1 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32544 = N 0 0 + 32544 = N 6 0 + 32640 = E soloend + 33024 = N 1 0 + 33024 = N 6 0 + 33120 = N 2 0 + 33120 = N 6 0 + 33408 = N 1 0 + 33408 = N 6 0 + 33504 = N 2 0 + 33504 = N 6 0 + 33792 = N 1 0 + 33792 = N 6 0 + 33888 = N 2 0 + 33888 = N 6 0 + 34080 = N 0 448 + 34080 = N 6 0 + 34560 = N 1 0 + 34560 = N 6 0 + 34656 = N 2 0 + 34656 = N 6 0 + 34944 = N 1 0 + 34944 = N 6 0 + 35040 = N 2 0 + 35040 = N 6 0 + 35328 = N 1 0 + 35328 = N 6 0 + 35424 = N 2 0 + 35424 = N 6 0 + 35616 = N 0 256 + 35616 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36000 = N 2 0 + 36000 = N 6 0 + 36288 = N 1 0 + 36288 = N 6 0 + 36384 = N 2 0 + 36384 = N 6 0 + 36672 = N 1 0 + 36672 = N 6 0 + 36768 = N 2 0 + 36768 = N 6 0 + 36864 = N 3 0 + 36864 = N 6 0 + 36864 = S 2 768 + 36864 = E solo + 37008 = N 3 0 + 37008 = N 6 0 + 37152 = N 3 0 + 37152 = N 6 0 + 37296 = N 3 0 + 37296 = N 6 0 + 37440 = N 3 384 + 37440 = N 6 0 + 37920 = N 2 0 + 37920 = N 6 0 + 38064 = N 2 0 + 38064 = N 6 0 + 38208 = N 2 352 + 38208 = N 6 0 + 38592 = N 1 0 + 38592 = N 6 0 + 38784 = N 0 0 + 38784 = N 6 0 + 38880 = N 1 0 + 38880 = N 6 0 + 38976 = N 2 0 + 38976 = N 6 0 + 39072 = N 1 0 + 39072 = N 6 0 + 39168 = N 3 0 + 39168 = N 6 0 + 39264 = N 2 0 + 39264 = N 6 0 + 39360 = N 3 0 + 39360 = N 6 0 + 39552 = N 1 0 + 39552 = N 6 0 + 39648 = N 2 0 + 39648 = N 6 0 + 39744 = N 1 0 + 39744 = N 6 0 + 39840 = N 0 0 + 39840 = N 6 0 + 39936 = N 1 0 + 39936 = N 6 0 + 40032 = N 0 0 + 40032 = N 6 0 + 40128 = N 1 0 + 40128 = N 6 0 + 40224 = N 2 0 + 40224 = N 6 0 + 40320 = N 3 0 + 40320 = N 6 0 + 40512 = N 2 0 + 40512 = N 6 0 + 40704 = N 1 0 + 40704 = N 6 0 + 40800 = N 0 144 + 40800 = N 6 0 + 41184 = N 1 0 + 41184 = N 6 0 + 41280 = N 1 96 + 41280 = N 6 0 + 41408 = N 1 128 + 41408 = N 6 0 + 41568 = N 2 160 + 41568 = N 6 0 + 41760 = N 3 352 + 41760 = N 6 0 + 42144 = N 0 160 + 42144 = N 6 0 + 42336 = N 1 256 + 42336 = N 6 0 + 42624 = N 2 352 + 42624 = N 6 0 + 43008 = N 3 448 + 43008 = N 6 0 + 43488 = N 2 112 + 43488 = N 6 0 + 43680 = N 1 0 + 43680 = N 6 0 + 43776 = N 1 160 + 43776 = N 6 0 + 43776 = S 2 1152 + 43968 = N 1 112 + 43968 = N 6 0 + 44112 = N 1 0 + 44112 = N 6 0 + 44256 = N 1 0 + 44256 = N 6 0 + 44448 = N 1 160 + 44448 = N 6 0 + 44640 = N 1 0 + 44640 = N 6 0 + 44736 = N 1 112 + 44736 = N 6 0 + 44880 = N 1 112 + 44880 = N 6 0 + 45024 = N 1 0 + 45024 = N 6 0 + 45120 = N 0 0 + 45120 = N 6 0 + 45216 = N 2 0 + 45216 = N 6 0 + 45408 = N 1 0 + 45408 = N 6 0 + 45504 = N 2 0 + 45504 = N 6 0 + 45600 = N 1 0 + 45600 = N 6 0 + 45696 = N 0 0 + 45696 = N 6 0 + 45792 = N 1 0 + 45792 = N 6 0 + 45888 = N 2 0 + 45888 = N 6 0 + 45984 = N 3 0 + 45984 = N 6 0 + 46080 = N 2 0 + 46080 = N 6 0 + 46176 = N 0 0 + 46176 = N 6 0 + 46320 = N 1 0 + 46320 = N 6 0 + 46464 = N 2 0 + 46464 = N 6 0 + 46560 = N 3 0 + 46560 = N 6 0 + 46656 = N 2 0 + 46656 = N 6 0 + 46752 = N 1 0 + 46752 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 47040 = N 2 0 + 47040 = N 6 0 + 47136 = N 1 0 + 47136 = N 6 0 + 47232 = N 0 0 + 47232 = N 6 0 + 47376 = E soloend + 47424 = N 3 864 + 47424 = N 6 0 + 48320 = N 3 0 + 48320 = N 6 0 + 48448 = N 2 0 + 48448 = N 6 0 + 48576 = N 1 0 + 48576 = N 6 0 + 48704 = N 0 0 + 48704 = N 6 0 + 48832 = N 1 0 + 48832 = N 6 0 + 48960 = N 2 160 + 48960 = N 6 0 + 49152 = N 0 0 + 49152 = N 6 0 + 49344 = N 2 0 + 49344 = N 6 0 + 49440 = N 1 0 + 49440 = N 6 0 + 49536 = N 1 256 + 49536 = N 6 0 + 49824 = N 0 0 + 49824 = N 6 0 + 49968 = N 3 0 + 49968 = N 6 0 + 50112 = N 2 0 + 50112 = N 6 0 + 50208 = N 1 0 + 50208 = N 6 0 + 50304 = N 1 0 + 50304 = N 6 0 + 50400 = N 0 0 + 50400 = N 6 0 + 50496 = N 3 864 + 50496 = N 6 0 + 51392 = N 3 0 + 51392 = N 6 0 + 51520 = N 2 0 + 51520 = N 6 0 + 51648 = N 1 0 + 51648 = N 6 0 + 51776 = N 0 0 + 51776 = N 6 0 + 51904 = N 1 0 + 51904 = N 6 0 + 52032 = N 3 208 + 52032 = N 6 0 + 52224 = S 2 1344 + 52272 = N 2 0 + 52272 = N 6 0 + 52416 = N 1 0 + 52416 = N 6 0 + 52560 = N 0 0 + 52560 = N 6 0 + 52704 = N 3 0 + 52704 = N 6 0 + 52848 = N 2 0 + 52848 = N 6 0 + 52992 = N 1 0 + 52992 = N 6 0 + 53088 = N 0 0 + 53088 = N 6 0 + 53280 = N 1 0 + 53280 = N 6 0 + 53568 = N 3 864 + 53568 = N 6 0 + 54464 = N 3 0 + 54464 = N 6 0 + 54592 = N 2 0 + 54592 = N 6 0 + 54720 = N 1 0 + 54720 = N 6 0 + 54848 = N 0 0 + 54848 = N 6 0 + 54976 = N 1 0 + 54976 = N 6 0 + 55104 = N 2 160 + 55104 = N 6 0 + 55296 = N 0 0 + 55296 = N 6 0 + 55488 = N 3 0 + 55488 = N 6 0 + 55584 = N 2 0 + 55584 = N 6 0 + 55680 = N 0 0 + 55680 = N 6 0 + 55776 = N 1 0 + 55776 = N 6 0 + 55872 = N 2 0 + 55872 = N 6 0 + 55968 = N 3 0 + 55968 = N 6 0 + 56112 = N 2 0 + 56112 = N 6 0 + 56208 = N 1 0 + 56208 = N 6 0 + 56352 = N 0 0 + 56352 = N 6 0 + 56496 = N 1 112 + 56496 = N 6 0 + 56640 = N 3 864 + 56640 = N 6 0 + 57536 = N 3 0 + 57536 = N 6 0 + 57664 = N 2 0 + 57664 = N 6 0 + 57792 = N 1 0 + 57792 = N 6 0 + 57920 = N 0 0 + 57920 = N 6 0 + 58048 = N 1 0 + 58048 = N 6 0 + 58176 = N 3 240 + 58176 = N 6 0 + 58512 = N 0 0 + 58512 = N 6 0 + 58656 = N 1 0 + 58656 = N 6 0 + 58848 = N 2 352 + 58848 = N 6 0 + 59280 = N 3 0 + 59280 = N 6 0 + 59424 = N 2 0 + 59424 = N 6 0 + 59520 = N 1 0 + 59520 = N 6 0 + 59712 = N 3 160 + 59712 = N 6 0 + 59904 = N 2 0 + 59904 = N 6 0 + 60048 = N 3 144 + 60048 = N 6 0 + 60384 = N 1 0 + 60384 = N 6 0 + 60480 = N 3 0 + 60480 = N 6 0 + 60576 = N 3 0 + 60576 = N 6 0 + 60672 = N 2 0 + 60672 = N 6 0 + 60816 = N 3 144 + 60816 = N 6 0 + 61152 = S 2 1440 + 61248 = N 2 192 + 61248 = N 6 0 + 61536 = N 1 112 + 61536 = N 6 0 + 61728 = N 0 0 + 61728 = N 6 0 + 61824 = N 2 256 + 61824 = N 6 0 + 62112 = N 1 112 + 62112 = N 6 0 + 62304 = N 0 0 + 62304 = N 6 0 + 62400 = N 1 0 + 62400 = N 6 0 + 62784 = N 3 160 + 62784 = N 6 0 + 62976 = N 2 0 + 62976 = N 6 0 + 63120 = N 3 144 + 63120 = N 6 0 + 63456 = N 1 0 + 63456 = N 6 0 + 63552 = N 3 0 + 63552 = N 6 0 + 63648 = N 3 0 + 63648 = N 6 0 + 63744 = N 2 0 + 63744 = N 6 0 + 63888 = N 3 144 + 63888 = N 6 0 + 64224 = N 1 0 + 64224 = N 6 0 + 64320 = N 2 192 + 64320 = N 6 0 + 64608 = N 1 112 + 64608 = N 6 0 + 64800 = N 0 0 + 64800 = N 6 0 + 64896 = N 2 256 + 64896 = N 6 0 + 65184 = N 1 112 + 65184 = N 6 0 + 65376 = N 0 0 + 65376 = N 6 0 + 65472 = N 1 0 + 65472 = N 6 0 + 66048 = N 1 0 + 66048 = N 6 0 + 66096 = N 2 0 + 66096 = N 6 0 + 66144 = N 3 0 + 66144 = N 6 0 + 66432 = N 1 0 + 66432 = N 6 0 + 66528 = N 2 0 + 66528 = N 6 0 + 66816 = N 1 0 + 66816 = N 6 0 + 66912 = N 2 0 + 66912 = N 6 0 + 67104 = N 0 288 + 67104 = N 6 0 + 67584 = N 1 0 + 67584 = N 6 0 + 67680 = N 2 0 + 67680 = N 6 0 + 67968 = N 1 0 + 67968 = N 6 0 + 68064 = N 2 0 + 68064 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68448 = N 2 0 + 68448 = N 6 0 + 68640 = N 0 288 + 68640 = N 6 0 + 69120 = N 2 0 + 69120 = N 6 0 + 69120 = S 2 1344 + 69216 = N 3 0 + 69216 = N 6 0 + 69504 = N 2 0 + 69504 = N 6 0 + 69600 = N 3 0 + 69600 = N 6 0 + 69888 = N 2 0 + 69888 = N 6 0 + 69984 = N 3 0 + 69984 = N 6 0 + 70176 = N 1 288 + 70176 = N 6 0 + 70656 = N 2 0 + 70656 = N 6 0 + 70752 = N 3 0 + 70752 = N 6 0 + 71040 = N 2 0 + 71040 = N 6 0 + 71136 = N 3 0 + 71136 = N 6 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71520 = N 3 0 + 71520 = N 6 0 + 71712 = N 3 384 + 71712 = N 6 0 + 72192 = N 3 736 + 72192 = N 6 0 + 72960 = N 2 352 + 72960 = N 6 0 + 73344 = N 1 352 + 73344 = N 6 0 + 73728 = N 0 192 + 73728 = N 6 0 + 74976 = N 2 0 + 74976 = N 6 0 + 74976 = E solo + 75072 = N 3 0 + 75072 = N 6 0 + 75168 = N 3 0 + 75168 = N 6 0 + 75264 = N 3 0 + 75264 = N 6 0 + 75360 = N 2 0 + 75360 = N 6 0 + 75840 = N 2 0 + 75840 = N 6 0 + 75936 = N 1 0 + 75936 = N 6 0 + 76032 = N 2 0 + 76032 = N 6 0 + 76128 = N 1 0 + 76128 = N 6 0 + 76224 = N 0 0 + 76224 = N 6 0 + 76896 = N 0 0 + 76896 = N 6 0 + 77040 = N 1 0 + 77040 = N 6 0 + 77136 = N 2 0 + 77136 = N 6 0 + 77232 = N 1 0 + 77232 = N 6 0 + 77376 = N 3 0 + 77376 = N 6 0 + 77472 = N 2 0 + 77472 = N 6 0 + 77568 = N 1 0 + 77568 = N 6 0 + 77664 = N 0 0 + 77664 = N 6 0 + 77760 = N 1 0 + 77760 = N 6 0 + 77856 = N 0 0 + 77856 = N 6 0 + 78768 = N 0 0 + 78768 = N 6 0 + 78864 = N 1 0 + 78864 = N 6 0 + 78960 = N 2 0 + 78960 = N 6 0 + 79056 = N 0 0 + 79056 = N 6 0 + 79152 = N 1 0 + 79152 = N 6 0 + 79248 = N 2 0 + 79248 = N 6 0 + 79392 = N 3 0 + 79392 = N 6 0 + 79488 = N 0 0 + 79488 = N 6 0 + 79584 = N 1 0 + 79584 = N 6 0 + 79680 = N 2 0 + 79680 = N 6 0 + 79776 = N 3 0 + 79776 = N 6 0 + 79872 = N 2 0 + 79872 = N 6 0 + 79968 = N 1 0 + 79968 = N 6 0 + 80064 = N 1 0 + 80064 = N 6 0 + 80256 = N 0 0 + 80256 = N 6 0 + 80352 = N 2 0 + 80352 = N 6 0 + 80448 = N 1 0 + 80448 = N 6 0 + 80544 = N 0 0 + 80544 = N 6 0 + 81024 = S 2 2112 + 81216 = N 3 0 + 81216 = N 6 0 + 81360 = N 3 0 + 81360 = N 6 0 + 81504 = N 2 0 + 81504 = N 6 0 + 81696 = N 1 0 + 81696 = N 6 0 + 81792 = N 0 0 + 81792 = N 6 0 + 81984 = N 3 0 + 81984 = N 6 0 + 82080 = N 1 0 + 82080 = N 6 0 + 82176 = N 2 0 + 82176 = N 6 0 + 82272 = N 1 0 + 82272 = N 6 0 + 82368 = N 0 0 + 82368 = N 6 0 + 82464 = N 1 0 + 82464 = N 6 0 + 82560 = N 0 0 + 82560 = N 6 0 + 82656 = N 2 0 + 82656 = N 6 0 + 82752 = N 2 0 + 82752 = N 6 0 + 82848 = N 1 0 + 82848 = N 6 0 + 82944 = N 0 0 + 82944 = N 6 0 + 83616 = N 0 0 + 83616 = N 6 0 + 83712 = N 1 112 + 83712 = N 6 0 + 83904 = N 1 0 + 83904 = N 6 0 + 84000 = N 2 0 + 84000 = N 6 0 + 84096 = N 3 0 + 84096 = N 6 0 + 84192 = N 2 0 + 84192 = N 6 0 + 84288 = N 1 0 + 84288 = N 6 0 + 84384 = N 0 0 + 84384 = N 6 0 + 84480 = N 1 0 + 84480 = N 6 0 + 84576 = N 0 0 + 84576 = N 6 0 + 84672 = N 1 0 + 84672 = N 6 0 + 84768 = N 0 0 + 84768 = N 6 0 + 84864 = N 1 0 + 84864 = N 6 0 + 84960 = N 0 0 + 84960 = N 6 0 + 85056 = N 1 0 + 85056 = N 6 0 + 85152 = N 0 0 + 85152 = N 6 0 + 85248 = N 1 0 + 85248 = N 6 0 + 85344 = N 0 0 + 85344 = N 6 0 + 85728 = N 3 0 + 85728 = N 6 0 + 85824 = N 3 0 + 85824 = N 6 0 + 85920 = N 1 0 + 85920 = N 6 0 + 86016 = N 2 0 + 86016 = N 6 0 + 86112 = N 0 0 + 86112 = N 6 0 + 86208 = N 2 0 + 86208 = N 6 0 + 86304 = N 0 0 + 86304 = N 6 0 + 86400 = N 2 0 + 86400 = N 6 0 + 86496 = N 3 0 + 86496 = N 6 0 + 86832 = N 0 0 + 86832 = N 6 0 + 86928 = N 1 0 + 86928 = N 6 0 + 87024 = N 2 0 + 87024 = N 6 0 + 87120 = N 1 0 + 87120 = N 6 0 + 87216 = N 2 0 + 87216 = N 6 0 + 87312 = N 3 0 + 87312 = N 6 0 + 87456 = N 3 0 + 87456 = N 6 0 + 87552 = N 3 0 + 87552 = N 6 0 + 87648 = N 1 0 + 87648 = N 6 0 + 87744 = N 2 0 + 87744 = N 6 0 + 87840 = N 1 0 + 87840 = N 6 0 + 88416 = N 0 0 + 88416 = N 6 0 + 88512 = N 1 0 + 88512 = N 6 0 + 88656 = N 2 0 + 88656 = N 6 0 + 88752 = N 1 0 + 88752 = N 6 0 + 88848 = N 2 0 + 88848 = N 6 0 + 88944 = N 3 112 + 88944 = N 6 0 + 89088 = N 3 0 + 89088 = N 6 0 + 89184 = N 2 0 + 89184 = N 6 0 + 89280 = N 1 0 + 89280 = N 6 0 + 89376 = N 0 0 + 89376 = N 6 0 + 89952 = N 2 0 + 89952 = N 6 0 + 90048 = N 3 0 + 90048 = N 6 0 + 90144 = N 3 0 + 90144 = N 6 0 + 90240 = N 2 0 + 90240 = N 6 0 + 90336 = N 1 0 + 90336 = N 6 0 + 90432 = N 2 0 + 90432 = N 6 0 + 90528 = N 0 0 + 90528 = N 6 0 + 90624 = N 3 0 + 90624 = N 6 0 + 91200 = S 2 960 + 91296 = N 3 0 + 91296 = N 6 0 + 91392 = N 1 0 + 91392 = N 6 0 + 91584 = N 2 0 + 91584 = N 6 0 + 91728 = N 1 0 + 91728 = N 6 0 + 91920 = N 2 0 + 91920 = N 6 0 + 92016 = N 0 0 + 92016 = N 6 0 + 92112 = N 0 0 + 92112 = N 6 0 + 92448 = N 0 0 + 92448 = N 6 0 + 92544 = N 0 0 + 92544 = N 6 0 + 92640 = N 1 0 + 92640 = N 6 0 + 92736 = N 2 0 + 92736 = N 6 0 + 92832 = N 3 0 + 92832 = N 6 0 + 92928 = N 2 0 + 92928 = N 6 0 + 93024 = N 1 0 + 93024 = N 6 0 + 93120 = N 1 0 + 93120 = N 6 0 + 93216 = N 0 0 + 93216 = N 6 0 + 93312 = N 3 0 + 93312 = N 6 0 + 93408 = N 2 0 + 93408 = N 6 0 + 93504 = N 1 0 + 93504 = N 6 0 + 93600 = N 0 0 + 93600 = N 6 0 + 93792 = N 1 0 + 93792 = N 6 0 + 93888 = N 2 0 + 93888 = N 6 0 + 93984 = N 2 0 + 93984 = N 6 0 + 94080 = N 2 0 + 94080 = N 6 0 + 94176 = N 1 0 + 94176 = N 6 0 + 94368 = N 1 0 + 94368 = N 6 0 + 94464 = N 0 0 + 94464 = N 6 0 + 94560 = N 1 0 + 94560 = N 6 0 + 94656 = N 2 0 + 94656 = N 6 0 + 94848 = N 2 0 + 94848 = N 6 0 + 95088 = N 2 0 + 95088 = N 6 0 + 95232 = N 2 0 + 95232 = N 6 0 + 95376 = N 2 0 + 95376 = N 6 0 + 95520 = N 2 0 + 95520 = N 6 0 + 95664 = N 2 0 + 95664 = N 6 0 + 95808 = N 3 0 + 95808 = N 6 0 + 95952 = N 1 0 + 95952 = N 6 0 + 96384 = E soloend + 96768 = N 3 160 + 96768 = N 6 0 + 96960 = N 2 0 + 96960 = N 6 0 + 97104 = N 3 192 + 97104 = N 6 0 + 97440 = N 1 0 + 97440 = N 6 0 + 97536 = N 3 0 + 97536 = N 6 0 + 97632 = N 3 0 + 97632 = N 6 0 + 97728 = N 2 0 + 97728 = N 6 0 + 97872 = N 3 192 + 97872 = N 6 0 + 98208 = N 1 0 + 98208 = N 6 0 + 98304 = N 2 256 + 98304 = N 6 0 + 98592 = N 1 0 + 98592 = N 6 0 + 98784 = N 0 0 + 98784 = N 6 0 + 98880 = N 2 256 + 98880 = N 6 0 + 99168 = N 1 0 + 99168 = N 6 0 + 99360 = N 0 0 + 99360 = N 6 0 + 99456 = N 1 0 + 99456 = N 6 0 + 99840 = N 3 160 + 99840 = N 6 0 + 99840 = S 2 1344 + 100032 = N 2 0 + 100032 = N 6 0 + 100176 = N 3 192 + 100176 = N 6 0 + 100512 = N 1 0 + 100512 = N 6 0 + 100608 = N 3 0 + 100608 = N 6 0 + 100704 = N 3 0 + 100704 = N 6 0 + 100800 = N 2 0 + 100800 = N 6 0 + 100944 = N 3 240 + 100944 = N 6 0 + 101280 = N 1 0 + 101280 = N 6 0 + 101376 = N 2 0 + 101376 = N 6 0 + 101664 = N 1 112 + 101664 = N 6 0 + 101856 = N 0 0 + 101856 = N 6 0 + 101952 = N 2 256 + 101952 = N 6 0 + 102240 = N 1 112 + 102240 = N 6 0 + 102432 = N 0 0 + 102432 = N 6 0 + 102528 = N 1 192 + 102528 = N 6 0 + 103104 = N 1 0 + 103104 = N 6 0 + 103200 = N 2 0 + 103200 = N 6 0 + 103488 = N 1 0 + 103488 = N 6 0 + 103584 = N 2 0 + 103584 = N 6 0 + 103872 = N 1 0 + 103872 = N 6 0 + 103968 = N 2 0 + 103968 = N 6 0 + 104160 = N 0 288 + 104160 = N 6 0 + 104640 = N 1 0 + 104640 = N 6 0 + 104736 = N 2 0 + 104736 = N 6 0 + 105024 = N 1 0 + 105024 = N 6 0 + 105120 = N 2 0 + 105120 = N 6 0 + 105408 = N 1 0 + 105408 = N 6 0 + 105504 = N 2 0 + 105504 = N 6 0 + 105696 = N 0 288 + 105696 = N 6 0 + 106176 = N 2 0 + 106176 = N 6 0 + 106272 = N 3 0 + 106272 = N 6 0 + 106560 = N 2 0 + 106560 = N 6 0 + 106656 = N 3 0 + 106656 = N 6 0 + 106944 = N 2 0 + 106944 = N 6 0 + 107040 = N 3 0 + 107040 = N 6 0 + 107232 = N 1 288 + 107232 = N 6 0 + 107712 = N 2 0 + 107712 = N 6 0 + 107712 = S 2 1536 + 107808 = N 3 0 + 107808 = N 6 0 + 108096 = N 2 0 + 108096 = N 6 0 + 108192 = N 3 0 + 108192 = N 6 0 + 108480 = N 2 0 + 108480 = N 6 0 + 108576 = N 3 0 + 108576 = N 6 0 + 108768 = N 3 4288 + 108768 = N 6 0 + 113088 = N 2 0 + 113088 = N 6 0 + 113184 = N 3 0 + 113184 = N 6 0 + 113280 = N 2 0 + 113280 = N 6 0 + 113376 = N 1 0 + 113376 = N 6 0 + 113664 = N 2 0 + 113664 = N 6 0 + 113760 = N 3 0 + 113760 = N 6 0 + 113856 = N 2 0 + 113856 = N 6 0 + 113952 = N 1 0 + 113952 = N 6 0 + 114240 = N 2 0 + 114240 = N 6 0 + 114336 = N 3 0 + 114336 = N 6 0 + 114432 = N 2 0 + 114432 = N 6 0 + 114528 = N 1 0 + 114528 = N 6 0 + 114624 = N 2 256 + 114624 = N 6 0 + 114912 = N 1 0 + 114912 = N 6 0 + 115104 = N 0 0 + 115104 = N 6 0 + 115200 = N 2 256 + 115200 = N 6 0 + 115488 = N 1 0 + 115488 = N 6 0 + 115680 = N 0 0 + 115680 = N 6 0 + 115776 = N 1 0 + 115776 = N 6 0 + 116160 = N 2 0 + 116160 = N 6 0 + 116256 = N 3 0 + 116256 = N 6 0 + 116352 = N 2 0 + 116352 = N 6 0 + 116448 = N 1 0 + 116448 = N 6 0 + 116736 = N 2 0 + 116736 = N 6 0 + 116832 = N 3 0 + 116832 = N 6 0 + 116928 = N 2 0 + 116928 = N 6 0 + 117024 = N 1 0 + 117024 = N 6 0 + 117312 = N 2 0 + 117312 = N 6 0 + 117408 = N 3 0 + 117408 = N 6 0 + 117504 = N 2 0 + 117504 = N 6 0 + 117600 = N 1 0 + 117600 = N 6 0 + 117696 = N 2 448 + 117696 = N 6 0 + 118176 = N 0 0 + 118176 = N 6 0 + 120096 = N 1 0 + 120096 = N 6 0 + 120096 = E solo + 120192 = N 1 0 + 120192 = N 2 0 + 120192 = N 6 0 + 120336 = N 1 0 + 120336 = N 2 0 + 120336 = N 6 0 + 120480 = N 1 0 + 120480 = N 3 0 + 120480 = N 6 0 + 120576 = N 2 0 + 120576 = N 6 0 + 120672 = N 0 0 + 120672 = N 6 0 + 121536 = N 2 0 + 121536 = N 6 0 + 121632 = N 3 0 + 121632 = N 6 0 + 121728 = N 2 0 + 121728 = N 6 0 + 121824 = N 1 0 + 121824 = N 6 0 + 121920 = N 2 0 + 121920 = N 6 0 + 122064 = N 2 0 + 122064 = N 6 0 + 122208 = N 1 0 + 122208 = N 6 0 + 122304 = N 1 0 + 122304 = N 6 0 + 123168 = N 0 0 + 123168 = N 6 0 + 123264 = N 1 0 + 123264 = N 6 0 + 123456 = N 2 0 + 123456 = N 6 0 + 123616 = N 2 0 + 123616 = N 6 0 + 124800 = N 2 0 + 124800 = N 6 0 + 124896 = N 3 0 + 124896 = N 6 0 + 124992 = N 2 0 + 124992 = N 6 0 + 125088 = N 1 0 + 125088 = N 6 0 + 125184 = N 2 0 + 125184 = N 6 0 + 125376 = E soloend +} +[EasySingle] +{ + 6144 = N 2 0 + 6144 = N 6 0 + 6432 = N 1 0 + 6432 = N 6 0 + 6720 = N 2 0 + 6720 = N 6 0 + 7008 = N 1 0 + 7008 = N 6 0 + 7296 = N 2 0 + 7296 = N 6 0 + 7488 = N 2 0 + 7488 = N 6 0 + 7680 = N 1 256 + 7680 = N 6 0 + 7680 = S 2 1536 + 7968 = N 0 0 + 7968 = N 6 0 + 8256 = N 1 256 + 8256 = N 6 0 + 8544 = N 0 0 + 8544 = N 6 0 + 8832 = N 0 0 + 8832 = N 6 0 + 9216 = N 2 0 + 9216 = N 6 0 + 9504 = N 1 0 + 9504 = N 6 0 + 9792 = N 2 0 + 9792 = N 6 0 + 10080 = N 1 0 + 10080 = N 6 0 + 10368 = N 2 0 + 10368 = N 6 0 + 10560 = N 2 0 + 10560 = N 6 0 + 10752 = N 1 448 + 10752 = N 6 0 + 12288 = N 2 160 + 12288 = N 6 0 + 12288 = E solo + 12480 = N 2 0 + 12480 = N 6 0 + 12672 = N 2 0 + 12672 = N 6 0 + 12864 = N 2 0 + 12864 = N 6 0 + 13056 = N 2 0 + 13056 = N 6 0 + 13248 = N 2 0 + 13248 = N 6 0 + 13440 = N 2 0 + 13440 = N 6 0 + 13632 = N 2 0 + 13632 = N 6 0 + 13776 = N 1 0 + 13776 = N 6 0 + 14016 = N 1 0 + 14016 = N 6 0 + 14208 = N 0 0 + 14208 = N 6 0 + 15168 = S 2 768 + 15360 = N 1 0 + 15360 = N 6 0 + 15504 = N 2 0 + 15504 = N 6 0 + 15648 = N 1 0 + 15648 = N 6 0 + 15744 = N 1 0 + 15744 = N 6 0 + 16896 = N 1 0 + 16896 = N 6 0 + 17184 = N 0 0 + 17184 = N 6 0 + 18336 = N 0 0 + 18336 = N 6 0 + 18432 = N 1 0 + 18432 = N 6 0 + 18624 = N 2 0 + 18624 = N 6 0 + 18720 = N 1 0 + 18720 = N 6 0 + 19776 = N 1 0 + 19776 = N 6 0 + 19968 = N 0 0 + 19968 = N 6 0 + 20160 = N 0 0 + 20160 = N 6 0 + 20304 = N 1 0 + 20304 = N 6 0 + 20448 = N 2 0 + 20448 = N 6 0 + 21504 = N 2 0 + 21504 = N 6 0 + 21792 = N 1 0 + 21792 = N 6 0 + 21888 = N 1 0 + 21888 = N 6 0 + 22848 = N 1 0 + 22848 = N 6 0 + 23136 = N 1 0 + 23136 = N 6 0 + 23424 = N 0 0 + 23424 = N 6 0 + 24576 = N 0 0 + 24576 = N 6 0 + 24720 = N 1 0 + 24720 = N 6 0 + 24864 = N 1 0 + 24864 = N 6 0 + 25056 = N 2 0 + 25056 = N 6 0 + 25920 = N 0 0 + 25920 = N 6 0 + 26064 = N 1 0 + 26064 = N 6 0 + 26208 = N 2 0 + 26208 = N 6 0 + 26496 = N 1 0 + 26496 = N 6 0 + 27552 = N 1 0 + 27552 = N 6 0 + 27840 = N 1 0 + 27840 = N 6 0 + 28032 = N 1 0 + 28032 = N 6 0 + 28224 = N 1 0 + 28224 = N 6 0 + 28416 = N 1 0 + 28416 = N 6 0 + 28608 = N 1 0 + 28608 = N 6 0 + 28800 = N 1 0 + 28800 = N 6 0 + 28992 = S 2 576 + 29184 = N 1 0 + 29184 = N 6 0 + 29328 = N 1 0 + 29328 = N 6 0 + 29472 = N 1 0 + 29472 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31296 = N 2 0 + 31296 = N 6 0 + 31680 = N 2 0 + 31680 = N 6 0 + 31968 = N 2 0 + 31968 = N 6 0 + 32256 = N 2 0 + 32256 = N 6 0 + 32448 = N 0 0 + 32448 = N 6 0 + 32640 = E soloend + 33024 = N 1 0 + 33024 = N 6 0 + 33408 = N 1 0 + 33408 = N 6 0 + 33792 = N 1 0 + 33792 = N 6 0 + 34080 = N 0 448 + 34080 = N 6 0 + 34560 = N 1 0 + 34560 = N 6 0 + 34944 = N 1 0 + 34944 = N 6 0 + 35328 = N 1 0 + 35328 = N 6 0 + 35616 = N 0 256 + 35616 = N 6 0 + 35904 = N 1 0 + 35904 = N 6 0 + 36288 = N 1 0 + 36288 = N 6 0 + 36672 = N 1 0 + 36672 = N 6 0 + 36864 = N 2 0 + 36864 = N 6 0 + 36864 = S 2 768 + 36864 = E solo + 37152 = N 2 0 + 37152 = N 6 0 + 37440 = N 2 384 + 37440 = N 6 0 + 37920 = N 1 0 + 37920 = N 6 0 + 38208 = N 1 352 + 38208 = N 6 0 + 38592 = N 1 0 + 38592 = N 6 0 + 38784 = N 0 0 + 38784 = N 6 0 + 38976 = N 1 0 + 38976 = N 6 0 + 39168 = N 2 0 + 39168 = N 6 0 + 39360 = N 2 0 + 39360 = N 6 0 + 39552 = N 1 0 + 39552 = N 6 0 + 39744 = N 0 0 + 39744 = N 6 0 + 39936 = N 0 0 + 39936 = N 6 0 + 40128 = N 1 0 + 40128 = N 6 0 + 40320 = N 2 0 + 40320 = N 6 0 + 40512 = N 2 0 + 40512 = N 6 0 + 40704 = N 1 0 + 40704 = N 6 0 + 40800 = N 0 144 + 40800 = N 6 0 + 41280 = N 1 0 + 41280 = N 6 0 + 41408 = N 1 0 + 41408 = N 6 0 + 41568 = N 2 544 + 41568 = N 6 0 + 42144 = N 0 160 + 42144 = N 6 0 + 42336 = N 1 1120 + 42336 = N 6 0 + 43488 = N 2 112 + 43488 = N 6 0 + 43776 = N 1 160 + 43776 = N 6 0 + 43776 = S 2 1152 + 43968 = N 1 112 + 43968 = N 6 0 + 44256 = N 1 0 + 44256 = N 6 0 + 44448 = N 1 160 + 44448 = N 6 0 + 44736 = N 1 112 + 44736 = N 6 0 + 45024 = N 1 0 + 45024 = N 6 0 + 45216 = N 2 0 + 45216 = N 6 0 + 45504 = N 1 0 + 45504 = N 6 0 + 45696 = N 0 0 + 45696 = N 6 0 + 45888 = N 1 0 + 45888 = N 6 0 + 46080 = N 0 0 + 46080 = N 6 0 + 46272 = N 1 0 + 46272 = N 6 0 + 46464 = N 2 0 + 46464 = N 6 0 + 46656 = N 1 0 + 46656 = N 6 0 + 46848 = N 0 0 + 46848 = N 6 0 + 47040 = N 1 0 + 47040 = N 6 0 + 47232 = N 0 0 + 47232 = N 6 0 + 47376 = E soloend + 47424 = N 2 832 + 47424 = N 6 0 + 48288 = N 1 0 + 48288 = N 6 0 + 48576 = N 0 0 + 48576 = N 6 0 + 48832 = N 0 0 + 48832 = N 6 0 + 48960 = N 1 160 + 48960 = N 6 0 + 49344 = N 2 0 + 49344 = N 6 0 + 49536 = N 1 256 + 49536 = N 6 0 + 49968 = N 2 0 + 49968 = N 6 0 + 50112 = N 1 0 + 50112 = N 6 0 + 50304 = N 0 0 + 50304 = N 6 0 + 50496 = N 2 864 + 50496 = N 6 0 + 51392 = N 1 0 + 51392 = N 6 0 + 51648 = N 0 0 + 51648 = N 6 0 + 51904 = N 0 0 + 51904 = N 6 0 + 52032 = N 2 208 + 52032 = N 6 0 + 52224 = S 2 1344 + 52272 = N 1 0 + 52272 = N 6 0 + 52416 = N 0 0 + 52416 = N 6 0 + 52704 = N 2 0 + 52704 = N 6 0 + 52992 = N 1 0 + 52992 = N 6 0 + 53280 = N 0 0 + 53280 = N 6 0 + 53568 = N 2 864 + 53568 = N 6 0 + 54464 = N 1 0 + 54464 = N 6 0 + 54720 = N 0 0 + 54720 = N 6 0 + 54976 = N 0 0 + 54976 = N 6 0 + 55104 = N 1 160 + 55104 = N 6 0 + 55296 = N 0 0 + 55296 = N 6 0 + 55488 = N 1 0 + 55488 = N 6 0 + 55680 = N 1 0 + 55680 = N 6 0 + 55872 = N 1 0 + 55872 = N 6 0 + 55968 = N 2 0 + 55968 = N 6 0 + 56112 = N 1 0 + 56112 = N 6 0 + 56352 = N 0 0 + 56352 = N 6 0 + 56640 = N 2 864 + 56640 = N 6 0 + 57536 = N 1 0 + 57536 = N 6 0 + 57792 = N 0 0 + 57792 = N 6 0 + 58048 = N 0 0 + 58048 = N 6 0 + 58176 = N 2 240 + 58176 = N 6 0 + 58512 = N 0 0 + 58512 = N 6 0 + 58656 = N 1 0 + 58656 = N 6 0 + 58848 = N 2 352 + 58848 = N 6 0 + 59280 = N 1 0 + 59280 = N 6 0 + 59520 = N 0 0 + 59520 = N 6 0 + 59712 = N 2 160 + 59712 = N 6 0 + 59904 = N 1 0 + 59904 = N 6 0 + 60048 = N 2 144 + 60048 = N 6 0 + 60480 = N 2 0 + 60480 = N 6 0 + 60672 = N 1 0 + 60672 = N 6 0 + 60816 = N 2 144 + 60816 = N 6 0 + 61152 = S 2 1440 + 61248 = N 1 192 + 61248 = N 6 0 + 61536 = N 0 112 + 61536 = N 6 0 + 61824 = N 1 256 + 61824 = N 6 0 + 62112 = N 0 112 + 62112 = N 6 0 + 62400 = N 0 0 + 62400 = N 6 0 + 62784 = N 2 160 + 62784 = N 6 0 + 62976 = N 1 0 + 62976 = N 6 0 + 63120 = N 2 144 + 63120 = N 6 0 + 63552 = N 2 0 + 63552 = N 6 0 + 63744 = N 1 0 + 63744 = N 6 0 + 63888 = N 2 144 + 63888 = N 6 0 + 64320 = N 1 192 + 64320 = N 6 0 + 64608 = N 0 112 + 64608 = N 6 0 + 64896 = N 1 256 + 64896 = N 6 0 + 65184 = N 0 112 + 65184 = N 6 0 + 65472 = N 0 0 + 65472 = N 6 0 + 66048 = N 1 0 + 66048 = N 6 0 + 66432 = N 1 0 + 66432 = N 6 0 + 66816 = N 1 0 + 66816 = N 6 0 + 67104 = N 0 288 + 67104 = N 6 0 + 67584 = N 1 0 + 67584 = N 6 0 + 67968 = N 1 0 + 67968 = N 6 0 + 68352 = N 1 0 + 68352 = N 6 0 + 68640 = N 0 288 + 68640 = N 6 0 + 69120 = N 2 0 + 69120 = N 6 0 + 69120 = S 2 1344 + 69504 = N 2 0 + 69504 = N 6 0 + 69888 = N 2 0 + 69888 = N 6 0 + 70176 = N 1 288 + 70176 = N 6 0 + 70656 = N 2 0 + 70656 = N 6 0 + 71040 = N 2 0 + 71040 = N 6 0 + 71424 = N 2 0 + 71424 = N 6 0 + 71712 = N 2 384 + 71712 = N 6 0 + 72192 = N 2 736 + 72192 = N 6 0 + 72960 = N 1 736 + 72960 = N 6 0 + 73728 = N 0 192 + 73728 = N 6 0 + 74976 = E solo + 75072 = N 2 0 + 75072 = N 6 0 + 75264 = N 2 0 + 75264 = N 6 0 + 75840 = N 2 0 + 75840 = N 6 0 + 76032 = N 1 0 + 76032 = N 6 0 + 76224 = N 0 0 + 76224 = N 6 0 + 76896 = N 0 0 + 76896 = N 6 0 + 77136 = N 1 0 + 77136 = N 6 0 + 77376 = N 2 0 + 77376 = N 6 0 + 77568 = N 1 0 + 77568 = N 6 0 + 77760 = N 0 0 + 77760 = N 6 0 + 78768 = N 0 0 + 78768 = N 6 0 + 78960 = N 1 0 + 78960 = N 6 0 + 79152 = N 2 0 + 79152 = N 6 0 + 79344 = N 0 0 + 79344 = N 6 0 + 79488 = N 1 0 + 79488 = N 6 0 + 79680 = N 2 0 + 79680 = N 6 0 + 79872 = N 1 0 + 79872 = N 6 0 + 80064 = N 0 0 + 80064 = N 6 0 + 80256 = N 1 0 + 80256 = N 6 0 + 80448 = N 0 0 + 80448 = N 6 0 + 81024 = S 2 2112 + 81216 = N 2 0 + 81216 = N 6 0 + 81360 = N 2 0 + 81360 = N 6 0 + 81504 = N 1 0 + 81504 = N 6 0 + 81696 = N 0 0 + 81696 = N 6 0 + 81984 = N 2 0 + 81984 = N 6 0 + 82176 = N 1 0 + 82176 = N 6 0 + 82368 = N 0 0 + 82368 = N 6 0 + 82560 = N 0 0 + 82560 = N 6 0 + 82752 = N 1 0 + 82752 = N 6 0 + 82944 = N 0 0 + 82944 = N 6 0 + 83712 = N 1 112 + 83712 = N 6 0 + 83904 = N 1 0 + 83904 = N 6 0 + 84096 = N 2 0 + 84096 = N 6 0 + 84288 = N 1 0 + 84288 = N 6 0 + 84480 = N 0 0 + 84480 = N 6 0 + 84672 = N 0 0 + 84672 = N 6 0 + 84864 = N 0 0 + 84864 = N 6 0 + 85056 = N 0 0 + 85056 = N 6 0 + 85248 = N 0 0 + 85248 = N 6 0 + 85824 = N 2 0 + 85824 = N 6 0 + 86016 = N 1 0 + 86016 = N 6 0 + 86208 = N 1 0 + 86208 = N 6 0 + 86400 = N 1 0 + 86400 = N 6 0 + 86832 = N 0 0 + 86832 = N 6 0 + 87024 = N 1 0 + 87024 = N 6 0 + 87216 = N 2 0 + 87216 = N 6 0 + 87552 = N 2 0 + 87552 = N 6 0 + 87744 = N 1 0 + 87744 = N 6 0 + 88512 = N 0 0 + 88512 = N 6 0 + 88656 = N 1 0 + 88656 = N 6 0 + 88848 = N 1 0 + 88848 = N 6 0 + 88944 = N 2 112 + 88944 = N 6 0 + 89088 = N 2 0 + 89088 = N 6 0 + 89280 = N 1 0 + 89280 = N 6 0 + 90048 = N 2 0 + 90048 = N 6 0 + 90240 = N 1 0 + 90240 = N 6 0 + 90432 = N 0 0 + 90432 = N 6 0 + 90624 = N 2 0 + 90624 = N 6 0 + 91200 = S 2 960 + 91296 = N 2 0 + 91296 = N 6 0 + 91584 = N 1 0 + 91584 = N 6 0 + 91920 = N 0 0 + 91920 = N 6 0 + 92448 = N 0 0 + 92448 = N 6 0 + 92544 = N 0 0 + 92544 = N 6 0 + 92736 = N 1 0 + 92736 = N 6 0 + 92928 = N 2 0 + 92928 = N 6 0 + 93120 = N 1 0 + 93120 = N 6 0 + 93312 = N 2 0 + 93312 = N 6 0 + 93504 = N 0 0 + 93504 = N 6 0 + 93888 = N 1 0 + 93888 = N 6 0 + 93984 = N 1 0 + 93984 = N 6 0 + 94080 = N 1 0 + 94080 = N 6 0 + 94464 = N 0 0 + 94464 = N 6 0 + 94656 = N 1 0 + 94656 = N 6 0 + 94848 = N 1 0 + 94848 = N 6 0 + 95088 = N 1 0 + 95088 = N 6 0 + 95376 = N 1 0 + 95376 = N 6 0 + 95664 = N 1 0 + 95664 = N 6 0 + 95808 = N 2 0 + 95808 = N 6 0 + 96384 = E soloend + 96768 = N 2 160 + 96768 = N 6 0 + 96960 = N 1 0 + 96960 = N 6 0 + 97104 = N 2 192 + 97104 = N 6 0 + 97536 = N 2 0 + 97536 = N 6 0 + 97728 = N 1 0 + 97728 = N 6 0 + 97872 = N 2 192 + 97872 = N 6 0 + 98304 = N 1 256 + 98304 = N 6 0 + 98592 = N 0 0 + 98592 = N 6 0 + 98880 = N 1 256 + 98880 = N 6 0 + 99168 = N 0 0 + 99168 = N 6 0 + 99456 = N 0 0 + 99456 = N 6 0 + 99840 = N 2 160 + 99840 = N 6 0 + 99840 = S 2 1344 + 100032 = N 1 0 + 100032 = N 6 0 + 100176 = N 2 192 + 100176 = N 6 0 + 100608 = N 2 0 + 100608 = N 6 0 + 100800 = N 1 0 + 100800 = N 6 0 + 100944 = N 2 240 + 100944 = N 6 0 + 101376 = N 1 0 + 101376 = N 6 0 + 101664 = N 0 112 + 101664 = N 6 0 + 101952 = N 1 256 + 101952 = N 6 0 + 102240 = N 0 112 + 102240 = N 6 0 + 102528 = N 0 192 + 102528 = N 6 0 + 103104 = N 1 0 + 103104 = N 6 0 + 103488 = N 1 0 + 103488 = N 6 0 + 103872 = N 1 0 + 103872 = N 6 0 + 104160 = N 0 288 + 104160 = N 6 0 + 104640 = N 1 0 + 104640 = N 6 0 + 105024 = N 1 0 + 105024 = N 6 0 + 105408 = N 1 0 + 105408 = N 6 0 + 105696 = N 0 288 + 105696 = N 6 0 + 106176 = N 2 0 + 106176 = N 6 0 + 106560 = N 2 0 + 106560 = N 6 0 + 106944 = N 2 0 + 106944 = N 6 0 + 107232 = N 1 288 + 107232 = N 6 0 + 107712 = N 2 0 + 107712 = N 6 0 + 107712 = S 2 1536 + 108096 = N 2 0 + 108096 = N 6 0 + 108480 = N 2 0 + 108480 = N 6 0 + 108768 = N 2 4288 + 108768 = N 6 0 + 113088 = N 2 0 + 113088 = N 6 0 + 113376 = N 1 0 + 113376 = N 6 0 + 113664 = N 2 0 + 113664 = N 6 0 + 113952 = N 1 0 + 113952 = N 6 0 + 114240 = N 2 0 + 114240 = N 6 0 + 114432 = N 2 0 + 114432 = N 6 0 + 114624 = N 1 256 + 114624 = N 6 0 + 114912 = N 0 0 + 114912 = N 6 0 + 115200 = N 1 256 + 115200 = N 6 0 + 115488 = N 0 0 + 115488 = N 6 0 + 115776 = N 0 0 + 115776 = N 6 0 + 116160 = N 2 0 + 116160 = N 6 0 + 116448 = N 1 0 + 116448 = N 6 0 + 116736 = N 2 0 + 116736 = N 6 0 + 117024 = N 1 0 + 117024 = N 6 0 + 117312 = N 2 0 + 117312 = N 6 0 + 117504 = N 2 0 + 117504 = N 6 0 + 117696 = N 1 448 + 117696 = N 6 0 + 120096 = E solo + 120192 = N 1 0 + 120192 = N 6 0 + 120336 = N 1 0 + 120336 = N 6 0 + 120480 = N 2 0 + 120480 = N 6 0 + 120576 = N 1 0 + 120576 = N 6 0 + 121536 = N 2 0 + 121536 = N 6 0 + 121728 = N 1 0 + 121728 = N 6 0 + 121920 = N 2 0 + 121920 = N 6 0 + 122064 = N 2 0 + 122064 = N 6 0 + 122208 = N 1 0 + 122208 = N 6 0 + 123168 = N 0 0 + 123168 = N 6 0 + 123264 = N 1 0 + 123264 = N 6 0 + 123456 = N 2 0 + 123456 = N 6 0 + 123616 = N 2 0 + 123616 = N 6 0 + 124800 = N 2 0 + 124800 = N 6 0 + 124992 = N 1 0 + 124992 = N 6 0 + 125184 = N 1 0 + 125184 = N 6 0 + 125376 = E soloend +} diff --git a/songs/Owane-Rock-Is-Too-Heavy/notes.chart b/songs/Owane-Rock-Is-Too-Heavy/notes.chart new file mode 100644 index 0000000..96f7378 --- /dev/null +++ b/songs/Owane-Rock-Is-Too-Heavy/notes.chart @@ -0,0 +1,13401 @@ +[Song] +{ + Name = "Rock Is Too Heavy" + Artist = "Owane" + Charter = "GuitarZero132" + Album = "Yeah Whatever" + Year = ", 2018" + Offset = 0 + Resolution = 192 + Player2 = bass + Difficulty = 6 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "Jazz Fusion" + MediaType = "cd" + MusicStream = "song.ogg" + GuitarStream = "drumbsdfklj.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 161000 + 1152 = B 162000 + 1536 = B 160000 + 21504 = TS 3 + 22080 = TS 4 + 23616 = TS 3 + 24768 = TS 5 + 26688 = TS 4 + 28992 = TS 6 + 30144 = TS 5 + 31104 = TS 6 + 32256 = TS 4 + 33024 = TS 6 + 34176 = TS 4 + 37248 = TS 3 + 37824 = TS 5 + 38784 = TS 9 3 + 39552 = B 160000 + 39648 = TS 4 + 58848 = TS 4 + 60384 = TS 7 3 + 61056 = TS 4 + 62592 = TS 7 3 + 63264 = TS 4 + 64800 = TS 7 3 + 65472 = TS 4 + 67008 = TS 7 3 + 67680 = TS 4 + 69216 = TS 7 3 + 69888 = TS 4 + 71424 = TS 7 3 + 72096 = TS 4 + 73632 = TS 7 3 + 74304 = TS 4 + 75840 = TS 7 3 + 76512 = TS 4 + 84960 = TS 3 + 85536 = TS 5 + 86496 = TS 4 + 89568 = TS 3 + 90144 = TS 5 + 91104 = TS 4 +} +[Events] +{ + 1536 = E "section Intro" + 4608 = E "section Verse 1A" + 9216 = E "section Verse 1B" + 15360 = E "section Chorus 1" + 22080 = E "section Trippy Part" + 32256 = E "section Guitar Solo 1" + 41952 = E "section Bridge" + 46560 = E "section Guitar Solo 2A" + 52704 = E "section Guitar Solo 2B" + 58848 = E "section Break" + 67680 = E "section Guitar Lead" + 76512 = E "section Guitar Solo 3A" + 85536 = E "section Guitar Solo 3B" + 91872 = E "section Quiet Part 1" + 104160 = E "section Verse 2A" + 108768 = E "section Verse 2B" + 114912 = E "section Chorus 2" + 121056 = E "section Quiet Part 2" + 127200 = E "section Loud Part" + 139488 = E "section Outro Solo A" + 145632 = E "section Outro Solo B" +} +[ExpertSingle] +{ + 1536 = N 2 0 + 1536 = N 4 0 + 1632 = N 2 256 + 1632 = N 4 256 + 1920 = N 2 0 + 2016 = N 2 0 + 2208 = N 0 0 + 2304 = N 1 0 + 2304 = N 5 0 + 2400 = N 2 0 + 2496 = N 3 0 + 2688 = N 3 0 + 2784 = N 4 0 + 2784 = N 5 0 + 2880 = N 3 0 + 2880 = N 5 0 + 2976 = N 2 0 + 2976 = N 5 0 + 3072 = N 2 0 + 3072 = N 4 0 + 3168 = N 2 256 + 3168 = N 4 256 + 3456 = N 2 0 + 3552 = N 2 0 + 3648 = N 2 0 + 3744 = N 2 0 + 3840 = N 3 0 + 3936 = N 4 0 + 3936 = N 5 0 + 4032 = N 3 0 + 4032 = N 5 0 + 4128 = N 2 0 + 4128 = N 5 0 + 4224 = N 1 0 + 4320 = N 2 0 + 4320 = N 5 0 + 4416 = N 1 160 + 4608 = N 0 0 + 4608 = N 2 0 + 4608 = N 6 0 + 4800 = N 2 0 + 4800 = N 6 0 + 4848 = N 3 0 + 4848 = N 6 0 + 4896 = N 1 0 + 4896 = N 6 0 + 5088 = N 1 0 + 5088 = N 2 0 + 5088 = N 6 0 + 5280 = N 0 0 + 5280 = N 6 0 + 5328 = N 2 0 + 5328 = N 6 0 + 5376 = N 4 0 + 5376 = N 6 0 + 5376 = S 2 1344 + 5424 = N 3 0 + 5424 = N 6 0 + 5472 = N 1 0 + 5472 = N 6 0 + 5520 = N 2 0 + 5520 = N 6 0 + 5568 = N 1 256 + 5568 = N 3 256 + 5568 = N 4 256 + 5568 = N 6 0 + 5856 = N 1 0 + 5856 = N 2 0 + 5856 = N 3 0 + 5856 = N 6 0 + 6000 = N 0 0 + 6000 = N 1 0 + 6000 = N 3 0 + 6000 = N 6 0 + 6144 = N 1 0 + 6144 = N 2 0 + 6144 = N 4 0 + 6144 = N 6 0 + 6288 = N 0 0 + 6288 = N 2 0 + 6288 = N 3 0 + 6288 = N 6 0 + 6432 = N 0 0 + 6432 = N 2 0 + 6432 = N 3 0 + 6432 = N 6 0 + 7680 = N 0 160 + 7680 = N 2 160 + 7680 = N 6 0 + 7872 = N 2 0 + 7872 = N 6 0 + 7920 = N 3 0 + 7920 = N 6 0 + 7968 = N 1 160 + 7968 = N 6 0 + 8160 = N 2 0 + 8160 = N 6 0 + 8208 = N 3 0 + 8208 = N 6 0 + 8352 = N 0 0 + 8352 = N 6 0 + 8400 = N 1 0 + 8400 = N 6 0 + 8448 = N 2 0 + 8448 = N 6 0 + 8544 = N 0 0 + 8544 = N 6 0 + 8640 = N 1 0 + 8640 = N 6 0 + 8664 = N 2 0 + 8664 = N 6 0 + 8736 = N 3 0 + 8736 = N 6 0 + 8832 = N 4 0 + 8832 = N 6 0 + 8856 = N 3 0 + 8856 = N 6 0 + 8880 = N 2 0 + 8880 = N 6 0 + 8928 = N 1 0 + 8928 = N 6 0 + 8976 = N 0 0 + 8976 = N 6 0 + 9024 = N 1 0 + 9024 = N 6 0 + 9072 = N 2 0 + 9072 = N 6 0 + 9120 = N 1 0 + 9120 = N 6 0 + 9144 = N 2 0 + 9144 = N 6 0 + 9216 = N 1 160 + 9216 = N 2 160 + 9216 = N 6 0 + 9408 = N 3 0 + 9408 = N 6 0 + 9456 = N 4 0 + 9456 = N 6 0 + 9504 = N 0 192 + 9504 = N 2 192 + 9504 = N 3 192 + 9504 = N 6 0 + 9792 = N 3 0 + 9792 = N 6 0 + 9840 = N 4 0 + 9840 = N 6 0 + 9888 = N 0 352 + 9888 = N 1 352 + 9888 = N 6 0 + 10272 = N 0 448 + 10272 = N 2 448 + 10272 = N 6 0 + 10752 = N 1 160 + 10752 = N 2 160 + 10752 = N 6 0 + 10944 = N 3 0 + 10944 = N 6 0 + 10992 = N 4 0 + 10992 = N 6 0 + 11040 = N 0 192 + 11040 = N 1 192 + 11040 = N 3 192 + 11040 = N 6 0 + 11328 = N 3 0 + 11328 = N 6 0 + 11376 = N 4 0 + 11376 = N 6 0 + 11424 = N 0 0 + 11424 = N 2 0 + 11424 = N 6 0 + 11616 = N 0 0 + 11616 = N 1 0 + 11616 = N 6 0 + 11808 = N 2 448 + 11808 = N 4 448 + 11808 = N 6 0 + 12288 = N 1 160 + 12288 = N 2 160 + 12288 = N 6 0 + 12480 = N 3 0 + 12480 = N 6 0 + 12528 = N 4 0 + 12528 = N 6 0 + 12576 = N 0 192 + 12576 = N 2 192 + 12576 = N 3 192 + 12576 = N 6 0 + 12864 = N 3 0 + 12864 = N 6 0 + 12912 = N 4 0 + 12912 = N 6 0 + 12960 = N 0 352 + 12960 = N 1 352 + 12960 = N 6 0 + 13344 = N 0 448 + 13344 = N 2 448 + 13344 = N 6 0 + 13824 = N 1 160 + 13824 = N 2 160 + 13824 = N 6 0 + 14016 = N 3 0 + 14016 = N 6 0 + 14064 = N 4 0 + 14064 = N 6 0 + 14112 = N 0 0 + 14112 = N 1 0 + 14112 = N 3 0 + 14112 = N 6 0 + 14496 = N 3 0 + 14496 = S 2 768 + 14520 = N 2 136 + 14688 = N 1 0 + 14688 = N 5 0 + 14784 = N 0 0 + 14880 = N 2 0 + 14928 = N 3 0 + 14976 = N 2 0 + 15072 = N 3 0 + 15072 = N 5 0 + 15120 = N 2 0 + 15168 = N 1 0 + 15360 = N 1 0 + 15392 = N 0 224 + 15648 = N 1 160 + 15648 = N 5 0 + 15840 = N 2 160 + 15840 = N 5 0 + 16032 = N 3 0 + 16064 = N 4 176 + 16272 = N 3 0 + 16272 = N 5 0 + 16320 = N 4 160 + 16512 = N 7 0 + 16512 = N 5 0 + 16800 = N 3 0 + 16848 = N 2 0 + 16896 = N 1 0 + 16992 = N 4 0 + 17088 = N 3 0 + 17184 = N 2 0 + 17232 = N 3 0 + 17280 = N 2 0 + 17376 = N 1 0 + 17472 = N 0 0 + 17568 = N 3 0 + 17600 = N 4 128 + 17760 = N 3 0 + 17760 = N 5 0 + 17952 = N 2 0 + 18000 = N 3 0 + 18048 = N 4 0 + 18096 = N 3 0 + 18144 = N 2 0 + 18192 = N 1 0 + 18240 = N 0 0 + 18288 = N 4 0 + 18336 = N 1 0 + 18384 = N 2 0 + 18432 = N 3 256 + 18720 = N 1 0 + 18752 = N 2 128 + 18912 = N 1 0 + 18912 = N 5 0 + 19008 = N 0 0 + 19104 = N 2 0 + 19152 = N 3 0 + 19200 = N 2 160 + 19392 = N 3 0 + 19392 = N 5 0 + 19488 = N 2 0 + 19488 = N 5 0 + 19520 = N 3 0 + 19552 = N 2 0 + 19584 = N 0 0 + 19584 = N 1 0 + 19872 = N 3 0 + 19920 = N 2 0 + 19968 = N 1 0 + 20064 = N 4 0 + 20160 = N 3 0 + 20256 = N 2 0 + 20304 = N 3 0 + 20352 = N 2 0 + 20448 = N 1 0 + 20544 = N 0 0 + 20640 = N 1 0 + 20688 = N 2 0 + 20736 = N 1 672 + 21600 = N 2 0 + 21632 = N 3 128 + 21792 = N 2 0 + 21888 = N 1 0 + 22080 = N 2 0 + 22176 = N 3 0 + 22176 = N 5 0 + 22272 = N 3 0 + 22368 = N 4 0 + 22368 = N 5 0 + 22464 = N 2 160 + 22656 = N 2 0 + 22752 = N 1 0 + 22848 = N 0 0 + 22848 = N 5 0 + 22848 = S 2 1344 + 22944 = N 1 0 + 23040 = N 0 0 + 23040 = N 5 0 + 23136 = N 1 0 + 23136 = N 5 0 + 23232 = N 2 0 + 23328 = N 1 0 + 23328 = N 5 0 + 23424 = N 0 0 + 23520 = N 1 0 + 23520 = N 5 0 + 23616 = N 0 0 + 23712 = N 1 0 + 23712 = N 5 0 + 23808 = N 2 0 + 23904 = N 1 0 + 24000 = N 0 0 + 24096 = N 1 0 + 24096 = N 5 0 + 24192 = N 2 0 + 24288 = N 4 160 + 24480 = N 0 0 + 24576 = N 3 160 + 24768 = N 2 0 + 24864 = N 1 0 + 24864 = N 5 0 + 24960 = N 2 0 + 25056 = N 3 0 + 25056 = N 5 0 + 25152 = N 0 160 + 25344 = N 3 0 + 25376 = N 4 0 + 25440 = N 3 0 + 25632 = N 2 0 + 25728 = N 1 0 + 25824 = N 2 0 + 25824 = N 5 0 + 25920 = N 3 0 + 26016 = N 2 0 + 26112 = N 1 0 + 26208 = N 2 0 + 26304 = N 1 0 + 26400 = N 2 0 + 26400 = N 5 0 + 26496 = N 3 0 + 26592 = N 2 0 + 26592 = N 5 0 + 26688 = N 3 0 + 26688 = N 5 0 + 26784 = N 4 0 + 26976 = N 2 0 + 27008 = N 3 128 + 27168 = N 2 0 + 27264 = N 1 0 + 27456 = N 2 0 + 27552 = N 3 0 + 27552 = N 5 0 + 27648 = N 3 0 + 27744 = N 4 0 + 27744 = N 5 0 + 27840 = N 2 160 + 28032 = N 2 0 + 28128 = N 1 0 + 28224 = N 0 0 + 28320 = N 1 0 + 28416 = N 0 0 + 28512 = N 1 0 + 28512 = N 5 0 + 28608 = N 2 0 + 28704 = N 1 0 + 28800 = N 0 0 + 28896 = N 1 0 + 28992 = N 0 0 + 29088 = N 1 0 + 29088 = N 5 0 + 29184 = N 2 0 + 29280 = N 1 0 + 29280 = N 5 0 + 29376 = N 0 0 + 29472 = N 1 0 + 29472 = N 5 0 + 29568 = N 2 0 + 29664 = N 4 160 + 29856 = N 0 0 + 29952 = N 3 160 + 30144 = N 2 0 + 30240 = N 1 0 + 30240 = N 5 0 + 30336 = N 2 0 + 30432 = N 3 0 + 30432 = N 5 0 + 30528 = N 0 160 + 30720 = N 3 0 + 30752 = N 4 0 + 30816 = N 3 0 + 31008 = N 2 0 + 31104 = N 1 0 + 31104 = N 5 0 + 31200 = N 2 0 + 31200 = N 5 0 + 31296 = N 3 0 + 31392 = N 2 0 + 31392 = N 5 0 + 31488 = N 1 0 + 31584 = N 2 0 + 31584 = N 5 0 + 31680 = N 1 0 + 31776 = N 2 0 + 31776 = N 5 0 + 31872 = N 3 0 + 31968 = N 2 0 + 31968 = N 5 0 + 32064 = N 3 0 + 32064 = N 5 0 + 32160 = N 4 0 + 32256 = S 2 1632 + 32352 = E solo + 32448 = N 2 0 + 32496 = N 3 0 + 32544 = N 1 0 + 32928 = N 0 0 + 32976 = N 1 0 + 33024 = N 4 0 + 33072 = N 3 0 + 33120 = N 1 0 + 33168 = N 2 0 + 33216 = N 1 0 + 33264 = N 0 0 + 33312 = N 4 0 + 33360 = N 3 0 + 33408 = N 2 0 + 33456 = N 1 0 + 33504 = N 3 0 + 33552 = N 2 0 + 33600 = N 1 0 + 33648 = N 0 0 + 33696 = N 2 0 + 33744 = N 1 0 + 33792 = N 0 120 + 33936 = N 1 120 + 33936 = N 5 0 + 34080 = N 2 0 + 34176 = N 3 0 + 34272 = N 2 0 + 34368 = N 3 0 + 34416 = N 4 0 + 34464 = N 3 160 + 34656 = N 2 0 + 34848 = N 0 160 + 35040 = N 1 160 + 35232 = N 2 160 + 35232 = N 5 0 + 35424 = N 3 0 + 35616 = N 2 0 + 35664 = N 3 0 + 35760 = N 2 0 + 35760 = N 5 0 + 35808 = N 0 0 + 36000 = N 2 0 + 36048 = N 1 0 + 36096 = N 4 0 + 36144 = N 3 0 + 36192 = N 2 0 + 36240 = N 4 0 + 36288 = N 1 0 + 36336 = N 2 0 + 36384 = N 0 0 + 36432 = N 1 0 + 36480 = N 2 0 + 36528 = N 3 0 + 36576 = N 4 0 + 36624 = N 3 0 + 36672 = N 1 0 + 36720 = N 2 0 + 36768 = N 1 0 + 36816 = N 0 0 + 36864 = N 1 0 + 36912 = N 3 0 + 36960 = N 2 0 + 37008 = N 1 0 + 37056 = N 3 0 + 37104 = N 2 0 + 37152 = N 1 0 + 37200 = N 0 0 + 37248 = N 3 0 + 37296 = N 4 0 + 37392 = N 3 0 + 37392 = N 5 0 + 37440 = N 1 112 + 37584 = N 3 0 + 37584 = N 5 0 + 37632 = N 0 0 + 37824 = N 3 0 + 37872 = N 4 0 + 37968 = N 3 0 + 37968 = N 5 0 + 38016 = N 2 112 + 38160 = N 3 0 + 38160 = N 5 0 + 38208 = N 0 0 + 38400 = N 3 0 + 38448 = N 4 0 + 38544 = N 3 0 + 38544 = N 5 0 + 38592 = N 0 112 + 38736 = N 1 0 + 38784 = N 2 0 + 38816 = N 3 128 + 38976 = N 2 0 + 38976 = N 5 0 + 39072 = N 0 0 + 39168 = N 2 0 + 39264 = N 3 0 + 39264 = N 5 0 + 39360 = N 4 0 + 39456 = N 2 0 + 39488 = N 3 512 + 40032 = N 2 0 + 40128 = N 1 0 + 40224 = N 2 0 + 40272 = N 3 0 + 40320 = N 0 736 + 41088 = N 0 0 + 41136 = N 0 0 + 41184 = N 1 0 + 41184 = N 5 0 + 41232 = N 2 0 + 41328 = N 3 0 + 41376 = N 2 0 + 41424 = N 2 0 + 41472 = N 1 0 + 41520 = N 0 0 + 41568 = N 4 0 + 41616 = N 3 0 + 41664 = N 2 0 + 41712 = N 1 0 + 41760 = N 2 0 + 41808 = N 3 0 + 41856 = N 2 0 + 41880 = N 3 0 + 41952 = N 1 112 + 42096 = N 2 112 + 42096 = N 5 0 + 42240 = N 4 112 + 42384 = N 2 112 + 42528 = N 2 0 + 42560 = N 3 704 + 43296 = N 2 0 + 43296 = S 2 960 + 43392 = N 3 0 + 43392 = N 5 0 + 43424 = N 2 0 + 43456 = N 1 0 + 43488 = N 2 0 + 43632 = N 1 0 + 43776 = N 0 960 + 44832 = N 2 0 + 44928 = N 0 0 + 45024 = N 3 0 + 45056 = N 4 0 + 45168 = N 3 0 + 45168 = N 5 0 + 45312 = N 3 144 + 45504 = N 0 0 + 45600 = N 2 0 + 45648 = N 3 0 + 45696 = N 2 256 + 45984 = N 3 0 + 46080 = N 2 0 + 46176 = N 3 0 + 46272 = N 0 0 + 46368 = N 1 0 + 46464 = N 2 0 + 46560 = N 2 0 + 46608 = N 3 0 + 46656 = N 4 0 + 46752 = N 1 0 + 46944 = N 0 192 + 47232 = N 2 0 + 47280 = N 2 0 + 47328 = N 1 0 + 47376 = N 2 112 + 47520 = N 3 0 + 47520 = N 5 0 + 47552 = N 2 0 + 47584 = N 1 0 + 47616 = N 2 160 + 47808 = N 1 0 + 47936 = N 2 0 + 47936 = N 5 0 + 47968 = N 1 0 + 48000 = N 0 160 + 48192 = N 2 0 + 48224 = N 3 128 + 48384 = N 2 192 + 48768 = N 1 0 + 48864 = N 3 0 + 48888 = N 4 0 + 49008 = N 3 0 + 49008 = N 5 0 + 49120 = N 2 0 + 49120 = N 5 0 + 49184 = N 3 0 + 49248 = N 2 0 + 49280 = N 3 128 + 49440 = N 2 0 + 49440 = N 5 0 + 49536 = N 1 0 + 49536 = N 5 0 + 49584 = N 2 0 + 49632 = N 1 0 + 49664 = N 2 0 + 49760 = N 1 0 + 49760 = N 5 0 + 49824 = N 3 0 + 49888 = N 2 0 + 49952 = N 0 0 + 50016 = N 1 0 + 50064 = N 2 0 + 50112 = N 4 0 + 50208 = N 3 0 + 50272 = N 2 0 + 50336 = N 0 0 + 50400 = N 2 0 + 50464 = N 1 0 + 50528 = N 0 0 + 50592 = N 2 0 + 50640 = N 1 0 + 50688 = N 0 0 + 50736 = N 1 0 + 50784 = N 2 0 + 50832 = N 3 0 + 50880 = N 2 0 + 50928 = N 1 0 + 50976 = N 0 0 + 51024 = N 4 0 + 51072 = N 3 0 + 51120 = N 4 0 + 51168 = N 2 0 + 51216 = N 3 0 + 51264 = N 2 0 + 51312 = N 1 0 + 51360 = N 0 256 + 51504 = N 1 112 + 51504 = N 3 112 + 51648 = N 1 0 + 51648 = N 2 0 + 51792 = N 2 0 + 51792 = N 4 0 + 51936 = N 0 0 + 51936 = N 2 0 + 51936 = N 3 0 + 52080 = N 2 0 + 52080 = N 4 0 + 52128 = N 0 0 + 52166 = N 1 0 + 52205 = N 2 0 + 52243 = N 1 0 + 52282 = N 1 0 + 52320 = N 3 256 + 52608 = N 4 160 + 52608 = N 5 0 + 52800 = N 3 0 + 52800 = S 2 672 + 52848 = N 2 0 + 52896 = N 1 0 + 52944 = N 0 0 + 52992 = N 1 0 + 53040 = N 0 0 + 53088 = N 2 112 + 53088 = N 3 112 + 53232 = N 2 0 + 53280 = N 1 0 + 53328 = N 0 0 + 53376 = N 2 112 + 53376 = N 3 112 + 53520 = N 2 0 + 53568 = N 2 0 + 53568 = N 3 0 + 53616 = N 4 0 + 53664 = N 3 0 + 53712 = N 2 0 + 53760 = N 1 0 + 53808 = N 0 0 + 53856 = N 2 0 + 53904 = N 3 0 + 53952 = N 2 0 + 54000 = N 3 0 + 54048 = N 4 0 + 54096 = N 2 0 + 54144 = N 1 0 + 54192 = N 3 0 + 54240 = N 2 0 + 54288 = N 3 0 + 54336 = N 4 0 + 54384 = N 2 0 + 54432 = N 3 0 + 54480 = N 4 0 + 54528 = N 3 0 + 54576 = N 2 0 + 54624 = N 1 0 + 54672 = N 0 0 + 54720 = N 1 0 + 54768 = N 0 0 + 54816 = N 2 0 + 54864 = N 1 0 + 54912 = N 2 0 + 54960 = N 1 0 + 55008 = N 2 0 + 55056 = N 3 0 + 55104 = N 4 0 + 55152 = N 3 0 + 55200 = N 2 0 + 55248 = N 1 0 + 55296 = N 2 0 + 55344 = N 3 0 + 55392 = N 4 0 + 55440 = N 2 0 + 55488 = N 1 0 + 55536 = N 3 0 + 55584 = N 1 0 + 55632 = N 0 0 + 55680 = N 2 0 + 55728 = N 0 0 + 55776 = N 1 0 + 55824 = N 2 0 + 55872 = N 4 0 + 55920 = N 1 0 + 55968 = N 2 0 + 56016 = N 4 0 + 56064 = N 1 0 + 56112 = N 2 0 + 56160 = N 4 0 + 56208 = N 1 0 + 56256 = N 2 0 + 56304 = N 4 0 + 56352 = N 1 0 + 56400 = N 2 0 + 56448 = N 1 0 + 56496 = N 2 0 + 56544 = N 2 0 + 56592 = N 3 0 + 56640 = N 4 0 + 56688 = N 3 0 + 56736 = N 2 0 + 56784 = N 1 0 + 56832 = N 3 0 + 56880 = N 2 0 + 56928 = N 3 0 + 56976 = N 2 0 + 57024 = N 1 0 + 57072 = N 3 0 + 57120 = N 2 0 + 57168 = N 0 0 + 57216 = N 1 0 + 57264 = N 2 0 + 57312 = N 3 0 + 57408 = N 0 0 + 57504 = N 1 0 + 57536 = N 2 0 + 57648 = N 3 0 + 57696 = N 1 0 + 57744 = N 1 0 + 57792 = N 1 0 + 57840 = N 2 0 + 57936 = N 0 0 + 58032 = N 2 0 + 58080 = N 2 0 + 58112 = N 3 0 + 58224 = N 4 0 + 58320 = N 2 0 + 58368 = N 3 0 + 58416 = N 2 112 + 58560 = N 1 0 + 58608 = N 0 0 + 58656 = N 1 0 + 58704 = N 2 0 + 58752 = N 1 0 + 58776 = N 2 376 + 59184 = N 4 0 + 59184 = N 5 0 + 59328 = E soloend + 59616 = N 2 784 + 59616 = N 4 784 + 60432 = N 1 304 + 60432 = N 3 304 + 60768 = N 1 256 + 60768 = N 2 256 + 60768 = N 4 256 + 61056 = N 0 448 + 61056 = N 2 448 + 61536 = N 0 256 + 61536 = N 1 256 + 61824 = N 2 256 + 61824 = N 4 256 + 62112 = N 1 976 + 62112 = N 3 976 + 63120 = N 3 0 + 63120 = N 6 0 + 63168 = N 2 0 + 63168 = N 6 0 + 63216 = N 1 0 + 63216 = N 6 0 + 63264 = N 2 0 + 63264 = N 6 0 + 63312 = N 1 0 + 63312 = N 6 0 + 63360 = N 4 0 + 63360 = N 6 0 + 63408 = N 2 0 + 63408 = N 6 0 + 63456 = N 0 544 + 63456 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64080 = N 3 0 + 64080 = N 6 0 + 64176 = N 4 0 + 64176 = N 6 0 + 64224 = N 1 0 + 64224 = N 6 0 + 64368 = N 0 0 + 64368 = N 6 0 + 64464 = N 2 0 + 64464 = N 6 0 + 64512 = N 1 0 + 64512 = N 6 0 + 64656 = N 0 0 + 64656 = N 6 0 + 64752 = N 2 0 + 64752 = N 6 0 + 64800 = N 1 0 + 64800 = N 6 0 + 64944 = N 0 0 + 64944 = N 6 0 + 67056 = N 0 0 + 67056 = S 2 1728 + 67152 = N 1 0 + 67248 = N 2 0 + 67344 = N 1 0 + 67440 = N 2 0 + 67536 = N 3 0 + 67536 = N 5 0 + 67584 = N 2 0 + 67632 = N 1 208 + 67872 = N 3 0 + 67920 = N 4 208 + 68160 = N 1 256 + 68448 = N 2 0 + 68496 = N 3 736 + 69264 = N 2 192 + 69552 = N 1 0 + 69600 = N 2 0 + 69648 = N 3 144 + 69824 = N 2 0 + 69856 = N 1 0 + 69888 = N 0 304 + 70224 = N 4 112 + 70368 = N 1 256 + 70656 = N 2 0 + 70704 = N 3 0 + 70800 = N 4 0 + 70848 = N 2 400 + 71280 = N 3 0 + 71280 = N 5 0 + 71472 = N 0 0 + 71504 = N 1 0 + 71568 = N 2 0 + 71568 = N 5 0 + 71664 = N 3 0 + 71760 = N 1 0 + 71856 = N 2 0 + 71952 = N 3 0 + 72000 = N 2 0 + 72048 = N 1 0 + 72096 = N 2 0 + 72144 = N 1 0 + 72192 = N 4 0 + 72240 = N 2 0 + 72288 = N 0 112 + 72432 = N 3 0 + 72432 = N 5 0 + 72464 = N 4 0 + 72576 = N 1 256 + 72864 = N 2 0 + 72912 = N 3 0 + 73008 = N 4 0 + 73056 = N 1 112 + 73200 = N 0 0 + 73200 = N 5 0 + 73296 = N 2 0 + 73344 = N 1 112 + 73488 = N 0 0 + 73488 = N 5 0 + 73584 = N 2 0 + 73632 = N 1 112 + 73776 = N 0 192 + 73776 = N 5 0 + 75888 = N 0 0 + 75888 = E solo + 75920 = N 1 0 + 75984 = N 2 0 + 76080 = N 3 0 + 76176 = N 2 0 + 76272 = N 3 0 + 76368 = N 4 0 + 76368 = N 5 0 + 76416 = N 3 0 + 76464 = N 2 0 + 76512 = N 3 0 + 76560 = N 2 0 + 76608 = N 1 0 + 76656 = N 0 0 + 76704 = N 4 0 + 76752 = N 2 0 + 76800 = N 3 0 + 76848 = N 1 0 + 76896 = N 2 0 + 76944 = N 0 0 + 76992 = N 4 0 + 77040 = N 2 0 + 77088 = N 3 0 + 77136 = N 1 0 + 77184 = N 2 0 + 77232 = N 0 0 + 77280 = N 4 0 + 77328 = N 2 0 + 77376 = N 3 0 + 77424 = N 1 0 + 77472 = N 2 0 + 77520 = N 0 0 + 77568 = N 1 0 + 77616 = N 2 0 + 77664 = N 3 0 + 77712 = N 4 0 + 77760 = N 0 0 + 77808 = N 1 0 + 77856 = N 2 0 + 77904 = N 3 0 + 77952 = N 1 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78096 = N 1 0 + 78144 = N 2 0 + 78192 = N 0 0 + 78240 = N 4 0 + 78288 = N 3 0 + 78336 = N 2 0 + 78384 = N 0 0 + 78432 = N 1 0 + 78480 = N 2 0 + 78528 = N 3 0 + 78576 = N 1 0 + 78624 = N 2 0 + 78720 = N 0 0 + 78768 = N 2 0 + 78816 = N 4 0 + 78864 = N 1 0 + 78912 = N 3 0 + 79008 = N 2 0 + 79056 = N 3 0 + 79104 = N 4 0 + 79152 = N 1 0 + 79200 = N 3 0 + 79248 = N 2 0 + 79296 = N 3 0 + 79344 = N 4 0 + 79392 = N 0 0 + 79440 = N 1 0 + 79488 = N 0 0 + 79536 = N 1 0 + 79584 = N 2 0 + 79632 = N 0 0 + 79680 = N 1 0 + 79728 = N 0 0 + 79776 = N 2 0 + 79824 = N 3 0 + 79872 = N 1 0 + 79920 = N 2 0 + 79968 = N 3 0 + 80016 = N 4 0 + 80064 = N 2 0 + 80112 = N 1 0 + 80160 = N 0 0 + 80256 = N 3 0 + 80256 = S 2 864 + 80304 = N 2 0 + 80352 = N 1 0 + 80400 = N 2 0 + 80448 = N 1 0 + 80496 = N 0 0 + 80544 = N 3 0 + 80592 = N 1 0 + 80640 = N 0 0 + 80688 = N 4 0 + 80736 = N 3 0 + 80784 = N 2 0 + 80832 = N 1 0 + 80880 = N 0 0 + 80928 = N 2 0 + 80976 = N 3 0 + 81024 = N 1 0 + 81072 = N 0 0 + 81120 = N 2 0 + 81168 = N 0 0 + 81216 = N 1 0 + 81264 = N 2 0 + 81312 = N 3 0 + 81360 = N 4 0 + 81408 = N 1 0 + 81456 = N 2 0 + 81504 = N 3 0 + 81552 = N 0 0 + 81600 = N 1 0 + 81648 = N 3 0 + 81696 = N 4 0 + 81744 = N 2 0 + 81792 = N 1 0 + 81840 = N 0 0 + 81888 = N 1 0 + 81936 = N 2 0 + 81984 = N 3 0 + 82032 = N 2 0 + 82080 = N 3 0 + 82128 = N 4 0 + 82176 = N 2 0 + 82224 = N 1 0 + 82272 = N 0 0 + 82368 = N 2 0 + 82464 = N 1 0 + 82560 = N 0 0 + 82608 = N 1 0 + 82640 = N 2 272 + 82944 = N 0 256 + 83232 = N 2 0 + 83256 = N 3 232 + 83520 = N 4 0 + 83520 = N 5 0 + 83712 = N 2 0 + 83760 = N 2 0 + 83808 = N 0 0 + 83856 = N 1 160 + 84048 = N 2 0 + 84048 = N 5 0 + 84096 = N 1 0 + 84144 = N 0 0 + 84192 = N 1 208 + 84432 = N 2 0 + 84432 = N 5 0 + 84480 = N 1 0 + 84528 = N 0 0 + 84576 = N 1 208 + 84816 = N 2 0 + 84816 = N 5 0 + 84864 = N 1 0 + 84912 = N 0 0 + 84960 = N 3 160 + 85152 = N 0 160 + 85344 = N 2 0 + 85440 = N 3 0 + 85440 = N 5 0 + 85536 = N 4 0 + 85656 = N 3 0 + 85656 = N 5 0 + 85696 = N 4 96 + 85824 = N 3 0 + 85824 = N 5 0 + 85856 = N 4 128 + 86016 = N 1 112 + 86160 = N 3 0 + 86256 = N 2 0 + 86256 = N 5 0 + 86288 = N 3 0 + 86400 = N 2 0 + 86400 = N 5 0 + 86432 = N 3 0 + 86496 = N 2 112 + 86640 = N 2 112 + 86784 = N 0 112 + 86928 = N 1 112 + 87072 = N 0 0 + 87216 = N 1 0 + 87248 = N 2 272 + 87552 = N 0 256 + 87840 = N 3 256 + 88128 = N 4 0 + 88128 = N 5 0 + 88320 = N 2 0 + 88368 = N 2 0 + 88416 = N 0 0 + 88464 = N 1 160 + 88656 = N 2 0 + 88656 = N 5 0 + 88704 = N 1 0 + 88752 = N 0 0 + 88800 = N 1 208 + 89040 = N 2 0 + 89040 = N 5 0 + 89088 = N 1 0 + 89136 = N 0 0 + 89184 = N 1 208 + 89424 = N 2 0 + 89424 = N 5 0 + 89472 = N 1 0 + 89520 = N 0 0 + 89568 = N 4 160 + 89760 = N 2 160 + 89952 = N 3 0 + 90048 = N 4 0 + 90048 = N 5 0 + 90144 = N 1 0 + 90264 = N 0 0 + 90264 = N 5 0 + 90304 = N 1 0 + 90432 = N 0 0 + 90432 = N 5 0 + 90464 = N 1 0 + 90672 = N 0 0 + 90720 = N 1 0 + 90768 = N 2 0 + 90816 = N 3 0 + 90864 = N 4 0 + 90912 = N 3 0 + 90960 = N 2 0 + 91008 = N 1 0 + 91056 = N 0 0 + 91056 = S 2 1344 + 91104 = N 1 0 + 91248 = N 4 0 + 91392 = N 3 0 + 91416 = N 2 0 + 91536 = N 3 0 + 91680 = N 2 0 + 91704 = N 1 0 + 91824 = N 0 0 + 91872 = N 1 0 + 91968 = E soloend + 92160 = N 0 0 + 92256 = N 3 0 + 92352 = N 2 0 + 92448 = N 3 0 + 92544 = N 2 0 + 92640 = N 3 0 + 92736 = N 2 0 + 92832 = N 3 0 + 92928 = N 0 0 + 93024 = N 3 0 + 93120 = N 2 0 + 93216 = N 3 0 + 93312 = N 2 0 + 93408 = N 0 0 + 93504 = N 1 0 + 93600 = N 2 0 + 93696 = N 3 192 + 93984 = N 2 0 + 94080 = N 1 0 + 94176 = N 2 0 + 94272 = N 4 0 + 94368 = N 2 0 + 94464 = N 1 0 + 94560 = N 2 0 + 94656 = N 1 0 + 94752 = N 4 0 + 94944 = N 0 160 + 95136 = N 1 0 + 95232 = N 0 0 + 95328 = N 2 160 + 95520 = N 1 0 + 95616 = N 0 256 + 95904 = N 1 0 + 96000 = N 0 0 + 96096 = N 2 160 + 96288 = N 1 160 + 96480 = N 0 160 + 96672 = N 1 0 + 96768 = N 0 0 + 96864 = N 2 160 + 97056 = N 1 0 + 97152 = N 0 256 + 97440 = N 1 0 + 97536 = N 0 0 + 97632 = N 2 160 + 97824 = N 1 0 + 98016 = N 3 0 + 98112 = N 2 0 + 98208 = N 3 0 + 98304 = N 4 0 + 98400 = N 3 0 + 98496 = N 2 0 + 98592 = N 3 0 + 98688 = N 2 0 + 98784 = N 3 0 + 98880 = N 2 0 + 98976 = N 3 0 + 99072 = N 4 256 + 99360 = N 3 0 + 99456 = N 2 0 + 99552 = N 0 0 + 99648 = N 1 0 + 99744 = N 2 0 + 99840 = N 3 144 + 100128 = N 2 0 + 100224 = N 1 0 + 100320 = N 2 0 + 100416 = N 4 0 + 100512 = N 2 0 + 100608 = N 1 0 + 100704 = N 2 0 + 100800 = N 1 0 + 100896 = N 4 0 + 101088 = N 0 160 + 101280 = N 1 0 + 101376 = N 0 0 + 101472 = N 2 160 + 101664 = N 1 0 + 101760 = N 0 256 + 102048 = N 1 0 + 102144 = N 0 0 + 102240 = N 2 160 + 102432 = N 1 160 + 102624 = N 0 160 + 102816 = N 1 0 + 102912 = N 0 0 + 103008 = N 2 160 + 103200 = N 1 0 + 103296 = N 0 256 + 103584 = N 1 0 + 103776 = S 2 768 + 103824 = N 0 0 + 103824 = N 6 0 + 103872 = N 1 0 + 103872 = N 6 0 + 103920 = N 2 0 + 103920 = N 6 0 + 103968 = N 0 0 + 103968 = N 6 0 + 104016 = N 1 0 + 104016 = N 6 0 + 104064 = N 2 0 + 104064 = N 6 0 + 104112 = N 3 0 + 104112 = N 6 0 + 104160 = N 4 0 + 104160 = N 6 0 + 104208 = N 3 0 + 104208 = N 6 0 + 104256 = N 2 0 + 104256 = N 6 0 + 104304 = N 1 0 + 104304 = N 6 0 + 104352 = N 3 0 + 104352 = N 6 0 + 104400 = N 4 0 + 104400 = N 6 0 + 104448 = N 2 0 + 104448 = N 6 0 + 104640 = N 0 0 + 104640 = N 6 0 + 104688 = N 4 0 + 104688 = N 6 0 + 104832 = N 4 0 + 104832 = N 6 0 + 104880 = N 3 0 + 104880 = N 6 0 + 104928 = N 3 0 + 104928 = N 6 0 + 104976 = N 2 0 + 104976 = N 6 0 + 105024 = N 0 0 + 105024 = N 6 0 + 105072 = N 1 0 + 105072 = N 6 0 + 105120 = N 0 0 + 105120 = N 6 0 + 105168 = N 1 0 + 105168 = N 6 0 + 105216 = N 2 0 + 105216 = N 6 0 + 105312 = N 3 0 + 105312 = N 6 0 + 105360 = N 4 0 + 105360 = N 6 0 + 105408 = N 2 0 + 105408 = N 6 0 + 105456 = N 1 0 + 105456 = N 6 0 + 105504 = N 3 0 + 105504 = N 6 0 + 105552 = N 2 0 + 105552 = N 6 0 + 105600 = N 1 0 + 105600 = N 6 0 + 105648 = N 0 0 + 105648 = N 6 0 + 105696 = N 1 0 + 105696 = N 6 0 + 105744 = N 2 0 + 105744 = N 6 0 + 105792 = N 0 0 + 105792 = N 6 0 + 106080 = N 3 0 + 106112 = N 4 0 + 106224 = N 4 0 + 106272 = N 3 112 + 106416 = N 3 0 + 106464 = N 2 112 + 106608 = N 1 0 + 106608 = N 5 0 + 106656 = N 2 112 + 106800 = N 3 0 + 106848 = N 2 0 + 106896 = N 1 0 + 106944 = N 0 0 + 107040 = N 1 0 + 107088 = N 2 0 + 107184 = N 1 0 + 107184 = N 5 0 + 107232 = N 2 160 + 107424 = N 3 0 + 107472 = N 4 0 + 107520 = N 0 160 + 107712 = N 3 0 + 107760 = N 4 0 + 107808 = N 0 0 + 107904 = N 1 0 + 107952 = N 2 0 + 108000 = N 3 0 + 108096 = N 0 0 + 108192 = N 1 0 + 108224 = N 2 0 + 108288 = N 3 0 + 108288 = N 5 0 + 108384 = N 4 0 + 108408 = N 3 0 + 108432 = N 2 0 + 108480 = N 1 0 + 108528 = N 0 0 + 108576 = N 1 0 + 108624 = N 2 0 + 108672 = N 1 0 + 108704 = N 2 0 + 108864 = N 1 0 + 108912 = N 1 0 + 108960 = N 3 0 + 109008 = N 4 0 + 109056 = N 2 160 + 109248 = N 1 0 + 109296 = N 1 0 + 109344 = N 2 0 + 109392 = N 3 0 + 109440 = N 0 208 + 109680 = N 2 0 + 109728 = N 2 0 + 109776 = N 2 0 + 109824 = N 2 0 + 109920 = N 0 0 + 110016 = N 1 0 + 110112 = N 2 0 + 110208 = N 3 0 + 110304 = N 4 0 + 110400 = N 1 0 + 110448 = N 1 0 + 110496 = N 2 0 + 110544 = N 3 0 + 110592 = N 0 160 + 110784 = N 0 0 + 110832 = N 0 0 + 110880 = N 2 0 + 110928 = N 3 0 + 110976 = N 2 160 + 111168 = N 1 0 + 111168 = N 5 0 + 111264 = N 0 0 + 111360 = N 2 0 + 111408 = N 3 0 + 111456 = N 2 0 + 111552 = N 3 0 + 111552 = N 5 0 + 111600 = N 2 0 + 111648 = N 1 0 + 111840 = N 0 0 + 111936 = N 0 0 + 111984 = N 0 0 + 112032 = N 3 0 + 112080 = N 4 0 + 112128 = N 2 160 + 112128 = N 3 160 + 112320 = N 0 0 + 112368 = N 0 0 + 112416 = N 2 0 + 112464 = N 3 0 + 112512 = N 0 208 + 112512 = N 1 208 + 112752 = N 3 0 + 112848 = N 3 0 + 112896 = N 2 0 + 112944 = N 3 0 + 112992 = N 4 0 + 113088 = N 3 0 + 113112 = N 2 0 + 113184 = N 1 0 + 113280 = N 0 0 + 113376 = N 1 0 + 113376 = N 5 0 + 113424 = N 0 0 + 113568 = N 2 0 + 113616 = N 3 0 + 113664 = N 0 160 + 113856 = N 0 0 + 113904 = N 0 0 + 113952 = N 2 0 + 114000 = N 3 0 + 114048 = N 2 160 + 114240 = N 1 0 + 114240 = N 5 0 + 114336 = N 0 0 + 114432 = N 2 0 + 114480 = N 3 0 + 114528 = N 2 0 + 114624 = N 3 0 + 114624 = N 5 0 + 114672 = N 2 0 + 114720 = N 1 160 + 114912 = N 1 0 + 114912 = S 2 1344 + 114944 = N 0 224 + 115200 = N 1 160 + 115200 = N 5 0 + 115392 = N 2 160 + 115584 = N 3 0 + 115616 = N 4 416 + 116064 = N 7 0 + 116064 = N 5 0 + 116352 = N 3 0 + 116400 = N 2 0 + 116448 = N 1 0 + 116544 = N 4 0 + 116640 = N 3 0 + 116736 = N 2 0 + 116784 = N 3 0 + 116832 = N 2 0 + 116928 = N 1 0 + 117024 = N 0 0 + 117120 = N 3 0 + 117152 = N 4 128 + 117312 = N 3 0 + 117312 = N 5 0 + 117504 = N 2 0 + 117552 = N 3 0 + 117600 = N 4 0 + 117648 = N 3 0 + 117696 = N 2 0 + 117744 = N 1 0 + 117792 = N 0 0 + 117840 = N 4 0 + 117888 = N 1 0 + 117936 = N 2 0 + 117984 = N 3 256 + 118272 = N 1 0 + 118304 = N 2 128 + 118464 = N 1 0 + 118464 = N 5 0 + 118560 = N 0 0 + 118656 = N 2 0 + 118704 = N 3 0 + 118752 = N 2 160 + 118944 = N 3 0 + 118944 = N 5 0 + 119040 = N 2 0 + 119040 = N 5 0 + 119072 = N 3 0 + 119104 = N 2 0 + 119136 = N 0 0 + 119136 = N 1 0 + 119424 = N 3 0 + 119472 = N 2 0 + 119520 = N 1 0 + 119616 = N 4 0 + 119712 = N 3 0 + 119808 = N 2 0 + 119856 = N 3 0 + 119904 = N 2 0 + 120000 = N 1 0 + 120096 = N 0 0 + 120192 = N 1 0 + 120224 = N 2 128 + 120384 = N 1 0 + 120384 = N 5 0 + 120576 = N 4 0 + 120608 = N 3 128 + 120768 = N 2 0 + 120864 = N 1 0 + 120960 = N 2 0 + 120960 = N 5 0 + 121056 = N 0 960 + 122208 = N 0 0 + 122208 = N 6 0 + 122304 = N 2 0 + 122304 = N 6 0 + 122400 = N 3 0 + 122400 = N 6 0 + 122496 = N 2 0 + 122496 = N 6 0 + 122592 = N 3 0 + 122592 = N 6 0 + 122688 = N 2 0 + 122688 = N 6 0 + 122784 = N 0 0 + 122784 = N 6 0 + 122880 = N 2 0 + 122880 = N 6 0 + 122976 = N 3 0 + 122976 = N 6 0 + 123072 = N 2 0 + 123072 = N 6 0 + 123168 = N 3 0 + 123168 = N 6 0 + 123264 = N 2 0 + 123264 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123456 = N 2 0 + 123456 = N 6 0 + 123552 = N 3 0 + 123552 = N 6 0 + 123648 = N 2 0 + 123648 = N 6 0 + 123744 = N 3 0 + 123744 = N 6 0 + 123840 = N 2 0 + 123840 = N 6 0 + 123936 = N 0 0 + 123936 = N 6 0 + 124032 = N 2 0 + 124032 = N 6 0 + 124128 = N 1 0 + 124128 = N 6 0 + 124224 = N 3 0 + 124224 = N 6 0 + 124320 = N 4 0 + 124320 = N 6 0 + 124416 = N 3 0 + 124416 = N 6 0 + 124512 = N 4 0 + 124512 = N 6 0 + 124608 = N 3 0 + 124608 = N 6 0 + 124704 = N 1 0 + 124704 = N 6 0 + 124800 = N 3 0 + 124800 = N 6 0 + 124896 = N 4 0 + 124896 = N 6 0 + 124992 = N 3 0 + 124992 = N 6 0 + 125088 = N 4 0 + 125088 = N 6 0 + 125184 = N 3 0 + 125184 = N 6 0 + 125280 = N 0 0 + 125280 = N 6 0 + 125376 = N 3 0 + 125376 = N 6 0 + 125472 = N 4 0 + 125472 = N 6 0 + 125568 = N 3 0 + 125568 = N 6 0 + 125664 = N 4 0 + 125664 = N 6 0 + 125760 = N 3 0 + 125760 = N 6 0 + 125856 = N 0 0 + 125856 = N 6 0 + 125952 = N 3 0 + 125952 = N 6 0 + 126048 = N 4 0 + 126048 = N 6 0 + 126144 = N 3 0 + 126144 = N 6 0 + 126240 = N 4 0 + 126240 = N 6 0 + 126336 = N 3 0 + 126336 = N 6 0 + 126432 = N 1 0 + 126432 = N 6 0 + 126528 = N 3 0 + 126528 = N 6 0 + 126624 = N 4 0 + 126624 = N 6 0 + 126720 = N 3 0 + 126720 = N 6 0 + 126816 = N 4 0 + 126816 = N 6 0 + 126912 = N 3 0 + 126912 = N 6 0 + 127008 = N 1 0 + 127008 = N 6 0 + 127104 = N 7 0 + 127104 = S 2 1536 + 127200 = N 0 352 + 127200 = N 5 0 + 127296 = N 1 256 + 127584 = N 0 352 + 127680 = N 1 256 + 127968 = N 0 256 + 128064 = N 1 160 + 128256 = N 0 0 + 128352 = N 1 352 + 128352 = N 5 0 + 128448 = N 2 256 + 128736 = N 1 352 + 128832 = N 2 256 + 129120 = N 1 352 + 129216 = N 2 256 + 129504 = N 1 352 + 129600 = N 2 288 + 129888 = N 1 256 + 129984 = N 2 160 + 130176 = N 7 0 + 130272 = N 0 352 + 130272 = N 5 0 + 130368 = N 1 256 + 130656 = N 0 352 + 130752 = N 1 256 + 131040 = N 0 256 + 131136 = N 1 160 + 131328 = N 0 0 + 131424 = N 1 352 + 131424 = N 5 0 + 131520 = N 2 256 + 131808 = N 1 352 + 131904 = N 2 256 + 132192 = N 1 352 + 132288 = N 2 256 + 132576 = N 1 352 + 132672 = N 2 256 + 132960 = N 1 192 + 133056 = N 2 96 + 133248 = N 1 0 + 133344 = N 2 352 + 133344 = N 5 0 + 133440 = N 4 256 + 133728 = N 2 288 + 133824 = N 4 192 + 134112 = N 2 288 + 134208 = N 3 192 + 134496 = N 0 0 + 134592 = N 0 256 + 134880 = N 0 0 + 134976 = N 1 256 + 135264 = N 1 0 + 135360 = N 0 0 + 135456 = N 1 160 + 135648 = N 1 0 + 135680 = N 2 128 + 135840 = N 1 0 + 136032 = N 3 0 + 136128 = N 1 0 + 136224 = N 3 160 + 136416 = N 1 352 + 136512 = N 3 256 + 136800 = N 1 352 + 136896 = N 3 256 + 137184 = N 1 256 + 137280 = N 3 160 + 137472 = N 1 0 + 137568 = N 2 352 + 137568 = N 5 0 + 137664 = N 3 256 + 137952 = N 2 288 + 138048 = N 3 192 + 138336 = N 2 352 + 138432 = N 3 256 + 138720 = N 2 288 + 138816 = N 4 192 + 139104 = N 3 352 + 139200 = N 4 256 + 139488 = N 2 0 + 139488 = S 2 960 + 139488 = E solo + 139520 = N 3 224 + 139776 = N 4 160 + 139776 = N 5 0 + 139968 = N 2 0 + 140016 = N 3 0 + 140064 = N 2 256 + 140352 = N 1 0 + 140352 = N 5 0 + 140544 = N 0 0 + 140640 = N 3 0 + 140688 = N 4 160 + 140880 = N 3 0 + 140928 = N 2 0 + 140976 = N 1 0 + 141024 = N 2 0 + 141072 = N 3 0 + 141120 = N 4 0 + 141168 = N 3 0 + 141216 = N 2 0 + 141264 = N 1 0 + 141312 = N 0 0 + 141360 = N 3 0 + 141408 = N 2 0 + 141456 = N 0 0 + 141504 = N 1 0 + 141552 = N 4 0 + 141600 = N 3 0 + 141648 = N 2 0 + 141696 = N 1 0 + 141744 = N 0 0 + 141792 = N 3 0 + 141840 = N 2 0 + 141888 = N 0 0 + 141936 = N 2 0 + 141984 = N 1 0 + 142032 = N 2 0 + 142080 = N 3 0 + 142128 = N 2 0 + 142176 = N 3 160 + 142368 = N 4 0 + 142368 = N 5 0 + 142464 = N 3 0 + 142464 = N 5 0 + 142560 = N 2 160 + 142752 = N 1 0 + 142752 = N 5 0 + 142848 = N 0 160 + 143040 = N 3 0 + 143072 = N 4 96 + 143200 = N 3 192 + 143424 = N 1 160 + 143616 = N 2 160 + 143616 = N 5 0 + 143808 = N 1 0 + 143904 = N 0 0 + 143936 = N 1 128 + 144096 = N 0 0 + 144096 = N 5 0 + 144128 = N 1 256 + 144576 = N 0 0 + 144672 = N 1 0 + 144768 = N 2 0 + 144768 = N 5 0 + 144864 = N 3 0 + 144896 = N 4 128 + 145056 = N 3 112 + 145056 = N 5 0 + 145200 = N 2 0 + 145200 = N 5 0 + 145248 = N 3 0 + 145296 = N 2 112 + 145440 = N 1 0 + 145632 = N 0 0 + 145664 = N 1 224 + 145920 = N 3 0 + 145968 = N 4 0 + 146016 = N 3 256 + 146304 = N 2 0 + 146400 = N 1 0 + 146496 = N 2 0 + 146496 = N 5 0 + 146544 = N 1 112 + 146688 = N 0 0 + 146688 = N 5 0 + 146784 = N 2 0 + 146880 = N 4 0 + 146880 = N 5 0 + 146976 = N 7 0 + 147072 = N 2 0 + 147104 = N 1 128 + 147264 = N 0 192 + 147264 = N 5 0 + 147552 = N 4 0 + 147600 = N 3 0 + 147696 = N 1 0 + 147744 = N 2 0 + 147792 = N 1 0 + 147840 = N 0 0 + 147888 = N 1 0 + 147936 = N 2 0 + 147984 = N 0 0 + 148032 = N 1 0 + 148080 = N 3 0 + 148128 = N 1 0 + 148176 = N 2 0 + 148224 = N 3 0 + 148272 = N 1 0 + 148320 = N 3 0 + 148352 = N 4 0 + 148384 = N 3 0 + 148416 = N 2 0 + 148464 = N 1 0 + 148512 = N 3 0 + 148560 = N 2 0 + 148608 = N 3 0 + 148656 = N 4 0 + 148704 = N 1 0 + 148752 = N 2 208 + 148992 = N 3 0 + 149040 = N 4 0 + 149088 = N 3 256 + 149376 = N 2 0 + 149472 = N 2 0 + 149496 = N 1 232 + 149760 = N 0 0 + 149856 = N 1 0 + 149952 = N 2 0 + 149952 = N 5 0 + 150048 = N 4 0 + 150144 = N 4 0 + 150176 = N 3 128 + 150336 = N 2 288 + 150336 = N 5 0 + 150720 = N 1 0 + 150816 = N 0 0 + 150912 = N 3 0 + 150960 = N 4 0 + 151008 = N 3 160 + 151200 = N 2 0 + 151296 = N 1 0 + 151328 = N 0 128 + 151488 = N 2 0 + 151584 = N 0 0 + 151680 = N 1 0 + 151776 = N 3 256 + 152064 = N 2 0 + 152064 = N 5 0 + 152112 = N 1 0 + 152160 = N 0 0 + 152352 = E soloend +} +[HardSingle] +{ + 1536 = N 2 0 + 1536 = N 4 0 + 1632 = N 2 256 + 1632 = N 4 256 + 2208 = N 0 0 + 2304 = N 1 0 + 2304 = N 5 0 + 2400 = N 2 0 + 2496 = N 3 0 + 2688 = N 3 0 + 2784 = N 4 0 + 2784 = N 5 0 + 2880 = N 3 0 + 2880 = N 5 0 + 2976 = N 2 0 + 2976 = N 5 0 + 3072 = N 2 0 + 3072 = N 4 0 + 3168 = N 2 256 + 3168 = N 4 256 + 3840 = N 3 0 + 3936 = N 4 0 + 3936 = N 5 0 + 4032 = N 3 0 + 4032 = N 5 0 + 4128 = N 2 0 + 4128 = N 5 0 + 4224 = N 1 0 + 4320 = N 2 0 + 4320 = N 5 0 + 4416 = N 1 160 + 4608 = N 0 0 + 4608 = N 2 0 + 4608 = N 6 0 + 4800 = N 2 0 + 4800 = N 6 0 + 4848 = N 3 0 + 4848 = N 6 0 + 4896 = N 1 0 + 4896 = N 6 0 + 5088 = N 1 0 + 5088 = N 2 0 + 5088 = N 6 0 + 5280 = N 1 0 + 5280 = N 6 0 + 5328 = N 2 0 + 5328 = N 6 0 + 5376 = N 4 0 + 5376 = N 6 0 + 5376 = S 2 1344 + 5424 = N 3 0 + 5424 = N 6 0 + 5472 = N 2 0 + 5472 = N 6 0 + 5568 = N 3 256 + 5568 = N 4 256 + 5568 = N 6 0 + 5856 = N 2 0 + 5856 = N 3 0 + 5856 = N 6 0 + 6000 = N 1 0 + 6000 = N 3 0 + 6000 = N 6 0 + 6144 = N 2 0 + 6144 = N 4 0 + 6144 = N 6 0 + 6288 = N 1 0 + 6288 = N 2 0 + 6288 = N 6 0 + 6432 = N 1 0 + 6432 = N 2 0 + 6432 = N 6 0 + 7680 = N 0 160 + 7680 = N 2 160 + 7680 = N 6 0 + 7872 = N 2 0 + 7872 = N 6 0 + 7920 = N 3 0 + 7920 = N 6 0 + 7968 = N 1 160 + 7968 = N 6 0 + 8160 = N 2 0 + 8160 = N 6 0 + 8208 = N 3 0 + 8208 = N 6 0 + 8352 = N 0 0 + 8352 = N 6 0 + 8400 = N 1 0 + 8400 = N 6 0 + 8448 = N 2 0 + 8448 = N 6 0 + 8544 = N 1 0 + 8544 = N 6 0 + 8640 = N 2 0 + 8640 = N 6 0 + 8736 = N 3 0 + 8736 = N 6 0 + 8832 = N 4 0 + 8832 = N 6 0 + 8880 = N 3 0 + 8880 = N 6 0 + 8928 = N 2 0 + 8928 = N 6 0 + 8976 = N 1 0 + 8976 = N 6 0 + 9024 = N 2 0 + 9024 = N 6 0 + 9072 = N 3 0 + 9072 = N 6 0 + 9120 = N 3 0 + 9120 = N 6 0 + 9216 = N 1 160 + 9216 = N 2 160 + 9216 = N 6 0 + 9504 = N 2 192 + 9504 = N 3 192 + 9504 = N 6 0 + 9888 = N 0 352 + 9888 = N 1 352 + 9888 = N 6 0 + 10272 = N 0 448 + 10272 = N 2 448 + 10272 = N 6 0 + 10752 = N 1 160 + 10752 = N 2 160 + 10752 = N 6 0 + 11040 = N 0 192 + 11040 = N 1 192 + 11040 = N 6 0 + 11424 = N 0 0 + 11424 = N 2 0 + 11424 = N 6 0 + 11616 = N 0 0 + 11616 = N 1 0 + 11616 = N 6 0 + 11808 = N 2 448 + 11808 = N 4 448 + 11808 = N 6 0 + 12288 = N 1 160 + 12288 = N 2 160 + 12288 = N 6 0 + 12576 = N 2 192 + 12576 = N 3 192 + 12576 = N 6 0 + 12960 = N 0 352 + 12960 = N 1 352 + 12960 = N 6 0 + 13344 = N 0 448 + 13344 = N 2 448 + 13344 = N 6 0 + 13824 = N 1 160 + 13824 = N 2 160 + 13824 = N 6 0 + 14112 = N 0 0 + 14112 = N 1 0 + 14112 = N 6 0 + 14496 = N 2 160 + 14496 = S 2 768 + 14688 = N 1 0 + 14688 = N 5 0 + 14784 = N 0 0 + 14880 = N 2 0 + 14928 = N 3 0 + 14976 = N 2 160 + 15168 = N 1 0 + 15168 = N 5 0 + 15360 = N 0 256 + 15648 = N 1 160 + 15648 = N 5 0 + 15840 = N 2 160 + 15840 = N 5 0 + 16032 = N 4 448 + 16800 = N 3 0 + 16848 = N 2 0 + 16896 = N 1 0 + 16992 = N 4 0 + 17088 = N 3 0 + 17184 = N 2 160 + 17376 = N 1 0 + 17472 = N 0 0 + 17568 = N 4 160 + 17760 = N 3 0 + 17760 = N 5 0 + 17952 = N 2 0 + 18000 = N 3 0 + 18048 = N 4 0 + 18096 = N 3 0 + 18144 = N 2 0 + 18192 = N 1 0 + 18288 = N 3 0 + 18336 = N 1 0 + 18384 = N 2 0 + 18432 = N 3 256 + 18720 = N 2 160 + 18912 = N 1 0 + 18912 = N 5 0 + 19008 = N 0 0 + 19104 = N 2 0 + 19152 = N 3 0 + 19200 = N 2 352 + 19584 = N 0 0 + 19584 = N 1 0 + 19872 = N 3 0 + 19920 = N 2 0 + 19968 = N 1 0 + 20064 = N 4 0 + 20160 = N 3 0 + 20256 = N 2 160 + 20448 = N 1 0 + 20544 = N 0 0 + 20640 = N 1 768 + 21600 = N 3 160 + 21792 = N 2 0 + 21888 = N 1 0 + 22080 = N 2 0 + 22176 = N 3 0 + 22176 = N 5 0 + 22272 = N 3 0 + 22368 = N 4 0 + 22368 = N 5 0 + 22464 = N 2 160 + 22656 = N 2 0 + 22752 = N 1 0 + 22848 = N 0 0 + 22848 = N 5 0 + 22848 = S 2 1344 + 22944 = N 1 0 + 23040 = N 0 0 + 23040 = N 5 0 + 23136 = N 1 0 + 23136 = N 5 0 + 23232 = N 2 0 + 23328 = N 1 0 + 23328 = N 5 0 + 23424 = N 0 0 + 23520 = N 1 0 + 23520 = N 5 0 + 23616 = N 0 0 + 23712 = N 1 0 + 23712 = N 5 0 + 23808 = N 2 0 + 23904 = N 1 0 + 24000 = N 0 0 + 24096 = N 1 0 + 24096 = N 5 0 + 24192 = N 2 0 + 24288 = N 4 160 + 24480 = N 0 0 + 24576 = N 3 160 + 24768 = N 2 0 + 24864 = N 1 0 + 24864 = N 5 0 + 24960 = N 2 0 + 25056 = N 3 0 + 25056 = N 5 0 + 25152 = N 0 160 + 25344 = N 4 0 + 25440 = N 3 0 + 25440 = N 5 0 + 25632 = N 2 0 + 25728 = N 1 0 + 25824 = N 2 0 + 25824 = N 5 0 + 25920 = N 3 0 + 26016 = N 2 0 + 26112 = N 1 0 + 26208 = N 2 0 + 26304 = N 1 0 + 26400 = N 2 0 + 26400 = N 5 0 + 26496 = N 3 0 + 26592 = N 2 0 + 26592 = N 5 0 + 26688 = N 3 0 + 26688 = N 5 0 + 26784 = N 4 0 + 26976 = N 3 160 + 27168 = N 2 0 + 27264 = N 1 0 + 27456 = N 2 0 + 27552 = N 3 0 + 27552 = N 5 0 + 27648 = N 3 0 + 27744 = N 4 0 + 27744 = N 5 0 + 27840 = N 2 160 + 28032 = N 2 0 + 28128 = N 1 0 + 28224 = N 0 0 + 28320 = N 1 0 + 28416 = N 0 0 + 28512 = N 1 0 + 28512 = N 5 0 + 28608 = N 2 0 + 28704 = N 1 0 + 28800 = N 0 0 + 28896 = N 1 0 + 28992 = N 0 0 + 29088 = N 1 0 + 29088 = N 5 0 + 29184 = N 2 0 + 29280 = N 1 0 + 29280 = N 5 0 + 29376 = N 0 0 + 29472 = N 1 0 + 29472 = N 5 0 + 29568 = N 2 0 + 29664 = N 4 160 + 29856 = N 0 0 + 29952 = N 3 160 + 30144 = N 2 0 + 30240 = N 1 0 + 30240 = N 5 0 + 30336 = N 2 0 + 30432 = N 3 0 + 30432 = N 5 0 + 30528 = N 0 160 + 30720 = N 4 0 + 30816 = N 3 0 + 30816 = N 5 0 + 31008 = N 2 0 + 31104 = N 1 0 + 31104 = N 5 0 + 31200 = N 2 0 + 31200 = N 5 0 + 31296 = N 3 0 + 31392 = N 2 0 + 31392 = N 5 0 + 31488 = N 1 0 + 31584 = N 2 0 + 31584 = N 5 0 + 31680 = N 1 0 + 31776 = N 2 0 + 31776 = N 5 0 + 31872 = N 3 0 + 31968 = N 2 0 + 31968 = N 5 0 + 32064 = N 3 0 + 32064 = N 5 0 + 32160 = N 4 0 + 32256 = S 2 1632 + 32352 = E solo + 32448 = N 2 0 + 32496 = N 3 0 + 32544 = N 1 0 + 32928 = N 2 0 + 33024 = N 4 0 + 33072 = N 3 0 + 33120 = N 2 0 + 33168 = N 3 0 + 33216 = N 2 0 + 33264 = N 1 0 + 33312 = N 4 0 + 33360 = N 3 0 + 33408 = N 2 0 + 33456 = N 1 0 + 33504 = N 4 0 + 33552 = N 3 0 + 33600 = N 2 0 + 33648 = N 1 0 + 33696 = N 2 0 + 33744 = N 1 0 + 33792 = N 0 120 + 33936 = N 1 120 + 33936 = N 5 0 + 34080 = N 2 0 + 34176 = N 3 0 + 34272 = N 2 0 + 34368 = N 4 256 + 34656 = N 2 0 + 34848 = N 0 160 + 35040 = N 1 160 + 35232 = N 2 160 + 35232 = N 5 0 + 35424 = N 3 0 + 35616 = N 2 0 + 35664 = N 3 112 + 35808 = N 0 0 + 36000 = N 3 0 + 36048 = N 2 0 + 36096 = N 4 0 + 36144 = N 3 0 + 36192 = N 2 0 + 36240 = N 4 0 + 36288 = N 2 0 + 36336 = N 3 0 + 36384 = N 1 0 + 36432 = N 2 0 + 36480 = N 3 0 + 36576 = N 4 0 + 36624 = N 4 0 + 36672 = N 2 0 + 36720 = N 3 0 + 36768 = N 2 0 + 36816 = N 1 0 + 36864 = N 2 0 + 36912 = N 3 0 + 36960 = N 2 0 + 37008 = N 1 0 + 37056 = N 3 0 + 37104 = N 2 0 + 37152 = N 1 0 + 37248 = N 3 0 + 37296 = N 4 112 + 37440 = N 1 160 + 37632 = N 0 0 + 37824 = N 3 0 + 37872 = N 4 112 + 38016 = N 2 160 + 38208 = N 0 0 + 38400 = N 3 0 + 38448 = N 4 0 + 38544 = N 3 0 + 38544 = N 5 0 + 38592 = N 0 160 + 38784 = N 3 160 + 38976 = N 2 0 + 38976 = N 5 0 + 39072 = N 0 0 + 39168 = N 2 0 + 39264 = N 3 0 + 39264 = N 5 0 + 39360 = N 4 0 + 39456 = N 3 544 + 40032 = N 2 0 + 40128 = N 1 0 + 40224 = N 2 0 + 40320 = N 0 736 + 41184 = N 1 0 + 41232 = N 2 0 + 41376 = N 2 0 + 41424 = N 2 0 + 41472 = N 1 0 + 41520 = N 0 0 + 41568 = N 3 0 + 41616 = N 2 0 + 41664 = N 1 0 + 41712 = N 0 0 + 41760 = N 1 0 + 41808 = N 2 112 + 41952 = N 1 112 + 42096 = N 2 112 + 42096 = N 5 0 + 42240 = N 4 112 + 42384 = N 2 112 + 42528 = N 3 736 + 43296 = N 2 0 + 43296 = S 2 960 + 43392 = N 3 0 + 43392 = N 5 0 + 43440 = N 1 0 + 43488 = N 2 0 + 43632 = N 1 0 + 43776 = N 0 960 + 44832 = N 2 0 + 45024 = N 4 112 + 45168 = N 3 112 + 45168 = N 5 0 + 45312 = N 3 144 + 45504 = N 0 0 + 45600 = N 2 352 + 45984 = N 3 0 + 46080 = N 2 0 + 46176 = N 3 0 + 46272 = N 0 0 + 46368 = N 1 0 + 46464 = N 2 0 + 46560 = N 3 0 + 46608 = N 4 0 + 46752 = N 1 0 + 46944 = N 0 192 + 47328 = N 1 0 + 47376 = N 2 112 + 47520 = N 3 0 + 47520 = N 5 0 + 47568 = N 1 0 + 47616 = N 2 160 + 47808 = N 1 112 + 47952 = N 2 0 + 47952 = N 5 0 + 48000 = N 0 160 + 48192 = N 3 160 + 48384 = N 2 192 + 48768 = N 1 0 + 48864 = N 4 112 + 49008 = N 3 80 + 49008 = N 5 0 + 49120 = N 2 0 + 49120 = N 5 0 + 49184 = N 3 0 + 49248 = N 3 160 + 49440 = N 2 0 + 49440 = N 5 0 + 49536 = N 1 0 + 49536 = N 5 0 + 49584 = N 2 208 + 49824 = N 3 0 + 49888 = N 2 0 + 49952 = N 1 0 + 50016 = N 2 0 + 50112 = N 4 0 + 50208 = N 3 0 + 50272 = N 2 0 + 50336 = N 1 0 + 50400 = N 2 0 + 50464 = N 1 0 + 50528 = N 0 0 + 50592 = N 2 0 + 50640 = N 1 0 + 50688 = N 0 0 + 50784 = N 1 0 + 50832 = N 2 0 + 50880 = N 1 0 + 51024 = N 4 0 + 51072 = N 3 0 + 51120 = N 4 0 + 51168 = N 2 0 + 51264 = N 1 0 + 51360 = N 0 112 + 51504 = N 1 112 + 51504 = N 3 112 + 51648 = N 1 0 + 51648 = N 2 0 + 51792 = N 2 0 + 51792 = N 4 0 + 51936 = N 2 0 + 51936 = N 3 0 + 52080 = N 2 0 + 52080 = N 4 0 + 52176 = N 1 0 + 52224 = N 2 0 + 52320 = N 3 256 + 52608 = N 4 160 + 52608 = N 5 0 + 52800 = N 3 0 + 52800 = S 2 672 + 52848 = N 2 0 + 52896 = N 1 0 + 52992 = N 2 0 + 53040 = N 1 0 + 53088 = N 2 112 + 53088 = N 3 112 + 53280 = N 2 0 + 53328 = N 1 0 + 53376 = N 2 112 + 53376 = N 3 112 + 53568 = N 3 0 + 53616 = N 4 0 + 53664 = N 3 0 + 53712 = N 2 0 + 53760 = N 1 0 + 53856 = N 0 0 + 53904 = N 1 0 + 53952 = N 2 0 + 54000 = N 3 0 + 54048 = N 4 0 + 54096 = N 3 0 + 54144 = N 2 0 + 54192 = N 3 0 + 54240 = N 2 0 + 54336 = N 3 0 + 54384 = N 2 0 + 54480 = N 3 0 + 54528 = N 2 0 + 54624 = N 1 0 + 54720 = N 1 0 + 54816 = N 0 0 + 54912 = N 0 0 + 55008 = N 2 0 + 55056 = N 3 0 + 55104 = N 4 0 + 55152 = N 3 0 + 55200 = N 2 0 + 55248 = N 1 0 + 55296 = N 2 0 + 55392 = N 4 0 + 55488 = N 2 0 + 55536 = N 3 0 + 55632 = N 1 0 + 55680 = N 2 0 + 55776 = N 1 0 + 55872 = N 3 0 + 55920 = N 1 0 + 56016 = N 3 0 + 56064 = N 1 0 + 56160 = N 3 0 + 56208 = N 1 0 + 56304 = N 3 0 + 56352 = N 1 0 + 56400 = N 2 0 + 56448 = N 1 0 + 56544 = N 2 0 + 56592 = N 3 0 + 56640 = N 4 0 + 56688 = N 3 0 + 56736 = N 2 0 + 56784 = N 1 0 + 56832 = N 2 0 + 56880 = N 1 0 + 56928 = N 2 0 + 57024 = N 0 0 + 57072 = N 2 0 + 57168 = N 0 0 + 57216 = N 1 0 + 57312 = N 2 0 + 57408 = N 3 0 + 57504 = N 4 0 + 57648 = N 0 0 + 57792 = N 1 0 + 57936 = N 0 0 + 58080 = N 3 0 + 58224 = N 4 0 + 58368 = N 3 0 + 58416 = N 2 112 + 58560 = N 1 0 + 58608 = N 0 0 + 58656 = N 1 0 + 58704 = N 2 448 + 59184 = N 4 0 + 59184 = N 5 0 + 59328 = E soloend + 59616 = N 2 784 + 59616 = N 4 784 + 60432 = N 1 304 + 60432 = N 3 304 + 60768 = N 1 256 + 60768 = N 4 256 + 61056 = N 0 448 + 61056 = N 2 448 + 61536 = N 0 256 + 61536 = N 1 256 + 61824 = N 2 256 + 61824 = N 4 256 + 62112 = N 1 976 + 62112 = N 3 976 + 63120 = N 2 0 + 63120 = N 6 0 + 63168 = N 1 0 + 63168 = N 6 0 + 63216 = N 0 0 + 63216 = N 6 0 + 63264 = N 1 0 + 63264 = N 6 0 + 63360 = N 3 0 + 63360 = N 6 0 + 63408 = N 2 0 + 63408 = N 6 0 + 63456 = N 0 544 + 63456 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64176 = N 3 0 + 64176 = N 6 0 + 64224 = N 1 0 + 64224 = N 6 0 + 64368 = N 0 0 + 64368 = N 6 0 + 64464 = N 2 0 + 64464 = N 6 0 + 64512 = N 1 0 + 64512 = N 6 0 + 64656 = N 0 0 + 64656 = N 6 0 + 64752 = N 2 0 + 64752 = N 6 0 + 64800 = N 1 0 + 64800 = N 6 0 + 64944 = N 0 0 + 64944 = N 6 0 + 67056 = N 0 0 + 67056 = S 2 1728 + 67152 = N 1 0 + 67248 = N 2 0 + 67344 = N 1 0 + 67440 = N 2 0 + 67536 = N 3 0 + 67536 = N 5 0 + 67584 = N 2 0 + 67632 = N 1 208 + 67872 = N 4 256 + 68160 = N 1 256 + 68448 = N 3 784 + 69264 = N 2 192 + 69600 = N 2 0 + 69648 = N 3 144 + 69824 = N 1 0 + 69888 = N 0 304 + 70224 = N 4 112 + 70368 = N 1 256 + 70656 = N 3 0 + 70800 = N 4 0 + 70848 = N 2 400 + 71280 = N 3 0 + 71280 = N 5 0 + 71472 = N 0 0 + 71568 = N 1 0 + 71664 = N 2 0 + 71760 = N 1 0 + 71856 = N 2 0 + 71952 = N 2 0 + 72000 = N 1 0 + 72048 = N 0 0 + 72192 = N 3 0 + 72240 = N 2 0 + 72288 = N 0 112 + 72432 = N 4 0 + 72432 = N 5 0 + 72576 = N 1 256 + 72864 = N 3 0 + 72864 = N 5 0 + 73008 = N 4 0 + 73056 = N 1 112 + 73200 = N 0 0 + 73200 = N 5 0 + 73296 = N 2 0 + 73344 = N 1 112 + 73488 = N 0 0 + 73488 = N 5 0 + 73584 = N 2 0 + 73632 = N 1 112 + 73776 = N 0 192 + 73776 = N 5 0 + 75888 = N 0 0 + 75888 = E solo + 75984 = N 1 0 + 76080 = N 2 0 + 76176 = N 1 0 + 76272 = N 2 0 + 76368 = N 4 0 + 76368 = N 5 0 + 76416 = N 3 0 + 76464 = N 2 0 + 76512 = N 3 0 + 76560 = N 2 0 + 76608 = N 1 0 + 76656 = N 0 0 + 76704 = N 4 0 + 76800 = N 3 0 + 76896 = N 2 0 + 76992 = N 3 0 + 77088 = N 2 0 + 77184 = N 1 0 + 77280 = N 2 0 + 77376 = N 1 0 + 77472 = N 0 0 + 77568 = N 0 0 + 77616 = N 1 0 + 77664 = N 2 0 + 77760 = N 0 0 + 77808 = N 1 0 + 77856 = N 2 0 + 77952 = N 1 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78144 = N 2 0 + 78240 = N 3 0 + 78288 = N 2 0 + 78336 = N 1 0 + 78432 = N 0 0 + 78480 = N 1 0 + 78528 = N 2 0 + 78576 = N 0 0 + 78624 = N 1 0 + 78720 = N 1 0 + 78768 = N 2 0 + 78816 = N 3 0 + 78864 = N 1 0 + 78912 = N 2 0 + 79008 = N 2 0 + 79056 = N 3 0 + 79104 = N 4 0 + 79152 = N 2 0 + 79200 = N 3 0 + 79296 = N 1 0 + 79392 = N 0 0 + 79440 = N 1 0 + 79488 = N 0 0 + 79536 = N 1 0 + 79584 = N 2 0 + 79680 = N 1 0 + 79776 = N 2 0 + 79872 = N 1 0 + 79920 = N 2 0 + 79968 = N 3 0 + 80016 = N 4 0 + 80064 = N 2 0 + 80160 = N 1 0 + 80256 = N 3 0 + 80256 = S 2 864 + 80352 = N 1 0 + 80448 = N 0 0 + 80544 = N 4 0 + 80688 = N 3 0 + 80736 = N 2 0 + 80784 = N 1 0 + 80832 = N 0 0 + 80928 = N 2 0 + 81024 = N 1 0 + 81120 = N 0 0 + 81216 = N 1 0 + 81312 = N 2 0 + 81408 = N 1 0 + 81504 = N 2 0 + 81600 = N 3 0 + 81696 = N 4 0 + 81744 = N 3 0 + 81792 = N 2 0 + 81840 = N 1 0 + 81888 = N 0 0 + 81936 = N 1 0 + 81984 = N 2 0 + 82032 = N 3 0 + 82080 = N 4 0 + 82272 = N 3 0 + 82368 = N 2 0 + 82464 = N 1 0 + 82608 = N 2 304 + 82944 = N 0 256 + 83232 = N 3 256 + 83520 = N 4 0 + 83520 = N 5 0 + 83808 = N 1 208 + 84048 = N 2 0 + 84048 = N 5 0 + 84096 = N 1 0 + 84144 = N 0 0 + 84192 = N 1 208 + 84432 = N 2 0 + 84432 = N 5 0 + 84480 = N 1 0 + 84528 = N 0 0 + 84576 = N 1 208 + 84816 = N 2 0 + 84816 = N 5 0 + 84864 = N 1 0 + 84912 = N 0 0 + 84960 = N 3 160 + 85152 = N 0 160 + 85344 = N 2 0 + 85440 = N 3 0 + 85440 = N 5 0 + 85536 = N 4 448 + 86016 = N 1 112 + 86160 = N 3 304 + 86496 = N 2 112 + 86496 = N 5 0 + 86640 = N 2 112 + 86784 = N 0 112 + 86928 = N 1 112 + 87072 = N 0 0 + 87216 = N 2 304 + 87552 = N 0 256 + 87840 = N 3 256 + 88128 = N 4 0 + 88128 = N 5 0 + 88416 = N 1 208 + 88656 = N 2 0 + 88656 = N 5 0 + 88704 = N 1 0 + 88752 = N 0 0 + 88800 = N 1 208 + 89040 = N 2 0 + 89040 = N 5 0 + 89088 = N 1 0 + 89136 = N 0 0 + 89184 = N 1 208 + 89424 = N 2 0 + 89424 = N 5 0 + 89472 = N 1 0 + 89520 = N 0 0 + 89568 = N 4 160 + 89760 = N 2 160 + 89952 = N 3 0 + 90048 = N 4 0 + 90048 = N 5 0 + 90144 = N 1 384 + 90720 = N 1 0 + 90768 = N 2 0 + 90816 = N 3 0 + 90864 = N 4 0 + 90912 = N 3 0 + 90960 = N 2 0 + 91008 = N 1 0 + 91056 = S 2 1344 + 91104 = N 2 0 + 91248 = N 4 0 + 91392 = N 2 0 + 91536 = N 3 0 + 91680 = N 1 0 + 91824 = N 0 0 + 91872 = N 1 0 + 91968 = E soloend + 92160 = N 0 0 + 92256 = N 3 0 + 92448 = N 3 0 + 92640 = N 3 0 + 92832 = N 3 0 + 92928 = N 0 0 + 93024 = N 3 0 + 93216 = N 3 0 + 93408 = N 0 0 + 93504 = N 1 0 + 93600 = N 2 0 + 93696 = N 3 192 + 93984 = N 2 0 + 94176 = N 2 0 + 94272 = N 4 0 + 94368 = N 2 0 + 94560 = N 2 0 + 94752 = N 4 0 + 94944 = N 0 160 + 95136 = N 1 0 + 95232 = N 0 0 + 95328 = N 2 160 + 95520 = N 1 0 + 95616 = N 0 256 + 95904 = N 1 0 + 96000 = N 0 0 + 96096 = N 2 160 + 96288 = N 1 160 + 96480 = N 0 160 + 96672 = N 1 0 + 96768 = N 0 0 + 96864 = N 2 160 + 97056 = N 1 0 + 97152 = N 0 256 + 97440 = N 1 0 + 97536 = N 0 0 + 97632 = N 2 160 + 97824 = N 1 0 + 98016 = N 3 0 + 98208 = N 3 0 + 98304 = N 4 0 + 98400 = N 3 0 + 98592 = N 3 0 + 98784 = N 3 0 + 98976 = N 3 0 + 99072 = N 4 256 + 99360 = N 3 0 + 99552 = N 0 0 + 99648 = N 1 0 + 99744 = N 2 0 + 99840 = N 3 144 + 100128 = N 2 0 + 100320 = N 2 0 + 100416 = N 4 0 + 100512 = N 2 0 + 100704 = N 2 0 + 100896 = N 4 0 + 101088 = N 0 160 + 101280 = N 1 0 + 101376 = N 0 0 + 101472 = N 2 160 + 101664 = N 1 0 + 101760 = N 0 256 + 102048 = N 1 0 + 102144 = N 0 0 + 102240 = N 2 160 + 102432 = N 1 160 + 102624 = N 0 160 + 102816 = N 1 0 + 102912 = N 0 0 + 103008 = N 2 160 + 103200 = N 1 0 + 103296 = N 0 256 + 103584 = N 1 0 + 103776 = S 2 768 + 103872 = N 1 0 + 103872 = N 6 0 + 103920 = N 2 0 + 103920 = N 6 0 + 103968 = N 3 0 + 103968 = N 6 0 + 104016 = N 1 0 + 104016 = N 6 0 + 104064 = N 2 0 + 104064 = N 6 0 + 104112 = N 3 0 + 104112 = N 6 0 + 104160 = N 4 0 + 104160 = N 6 0 + 104208 = N 3 0 + 104208 = N 6 0 + 104256 = N 2 0 + 104256 = N 6 0 + 104304 = N 1 0 + 104304 = N 6 0 + 104352 = N 3 0 + 104352 = N 6 0 + 104448 = N 2 0 + 104448 = N 6 0 + 104688 = N 4 0 + 104688 = N 6 0 + 104832 = N 3 0 + 104832 = N 6 0 + 104928 = N 2 0 + 104928 = N 6 0 + 105024 = N 0 0 + 105024 = N 6 0 + 105072 = N 1 0 + 105072 = N 6 0 + 105120 = N 2 0 + 105120 = N 6 0 + 105216 = N 3 0 + 105216 = N 6 0 + 105312 = N 4 0 + 105312 = N 6 0 + 105408 = N 2 0 + 105408 = N 6 0 + 105504 = N 3 0 + 105504 = N 6 0 + 105552 = N 2 0 + 105552 = N 6 0 + 105600 = N 1 0 + 105600 = N 6 0 + 105648 = N 0 0 + 105648 = N 6 0 + 105696 = N 1 0 + 105696 = N 6 0 + 105792 = N 0 0 + 105792 = N 6 0 + 106080 = N 4 0 + 106224 = N 4 0 + 106272 = N 3 112 + 106416 = N 3 0 + 106464 = N 2 160 + 106656 = N 2 112 + 106800 = N 3 0 + 106848 = N 2 0 + 106896 = N 1 0 + 106944 = N 0 0 + 107040 = N 2 160 + 107232 = N 2 160 + 107424 = N 3 0 + 107520 = N 0 160 + 107712 = N 3 0 + 107808 = N 0 0 + 107904 = N 1 0 + 107952 = N 2 0 + 108000 = N 3 0 + 108096 = N 2 0 + 108192 = N 3 0 + 108288 = N 4 0 + 108384 = N 3 0 + 108432 = N 2 0 + 108480 = N 1 0 + 108528 = N 0 0 + 108576 = N 1 0 + 108624 = N 2 0 + 108672 = N 2 0 + 108960 = N 3 0 + 109008 = N 4 0 + 109056 = N 2 160 + 109344 = N 2 0 + 109392 = N 3 0 + 109440 = N 0 208 + 109920 = N 0 0 + 110016 = N 1 0 + 110112 = N 2 0 + 110208 = N 3 0 + 110304 = N 4 0 + 110496 = N 2 0 + 110544 = N 3 0 + 110592 = N 0 160 + 110880 = N 2 0 + 110928 = N 3 0 + 110976 = N 2 160 + 111168 = N 1 0 + 111168 = N 5 0 + 111264 = N 0 0 + 111360 = N 2 0 + 111408 = N 3 0 + 111456 = N 2 0 + 111552 = N 3 0 + 111552 = N 5 0 + 111600 = N 2 0 + 111648 = N 1 0 + 111840 = N 0 0 + 112032 = N 3 0 + 112080 = N 4 0 + 112128 = N 2 160 + 112416 = N 2 0 + 112464 = N 3 0 + 112512 = N 1 208 + 112896 = N 2 0 + 112944 = N 3 0 + 112992 = N 4 0 + 113088 = N 2 0 + 113184 = N 1 0 + 113280 = N 0 0 + 113376 = N 1 0 + 113376 = N 5 0 + 113568 = N 2 0 + 113616 = N 3 0 + 113664 = N 0 160 + 113952 = N 2 0 + 114000 = N 3 0 + 114048 = N 2 160 + 114240 = N 1 0 + 114240 = N 5 0 + 114336 = N 0 0 + 114432 = N 2 0 + 114480 = N 3 0 + 114528 = N 2 0 + 114624 = N 3 0 + 114624 = N 5 0 + 114672 = N 2 0 + 114720 = N 1 160 + 114912 = N 0 256 + 114912 = S 2 1344 + 115200 = N 1 160 + 115200 = N 5 0 + 115392 = N 2 160 + 115584 = N 4 448 + 116352 = N 3 0 + 116400 = N 2 0 + 116448 = N 1 0 + 116544 = N 4 0 + 116640 = N 3 0 + 116736 = N 2 160 + 116928 = N 1 0 + 117024 = N 0 0 + 117120 = N 4 160 + 117312 = N 3 0 + 117312 = N 5 0 + 117504 = N 2 0 + 117552 = N 3 0 + 117600 = N 4 0 + 117648 = N 3 0 + 117696 = N 2 0 + 117744 = N 1 0 + 117840 = N 3 0 + 117888 = N 1 0 + 117936 = N 2 0 + 117984 = N 3 256 + 118272 = N 2 160 + 118464 = N 1 0 + 118464 = N 5 0 + 118560 = N 0 0 + 118656 = N 2 0 + 118704 = N 3 0 + 118752 = N 2 352 + 119136 = N 0 0 + 119136 = N 1 0 + 119424 = N 3 0 + 119472 = N 2 0 + 119520 = N 1 0 + 119616 = N 4 0 + 119712 = N 3 0 + 119808 = N 2 160 + 120000 = N 1 0 + 120096 = N 0 0 + 120192 = N 2 160 + 120384 = N 1 0 + 120384 = N 5 0 + 120576 = N 3 144 + 120768 = N 2 0 + 120864 = N 1 0 + 120960 = N 2 0 + 120960 = N 5 0 + 121056 = N 0 960 + 122208 = N 0 0 + 122208 = N 6 0 + 122400 = N 3 0 + 122400 = N 6 0 + 122592 = N 3 0 + 122592 = N 6 0 + 122784 = N 0 0 + 122784 = N 6 0 + 122976 = N 3 0 + 122976 = N 6 0 + 123168 = N 3 0 + 123168 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123552 = N 3 0 + 123552 = N 6 0 + 123744 = N 3 0 + 123744 = N 6 0 + 123936 = N 0 0 + 123936 = N 6 0 + 124128 = N 1 0 + 124128 = N 6 0 + 124320 = N 4 0 + 124320 = N 6 0 + 124512 = N 4 0 + 124512 = N 6 0 + 124704 = N 1 0 + 124704 = N 6 0 + 124896 = N 4 0 + 124896 = N 6 0 + 125088 = N 4 0 + 125088 = N 6 0 + 125280 = N 0 0 + 125280 = N 6 0 + 125472 = N 4 0 + 125472 = N 6 0 + 125664 = N 4 0 + 125664 = N 6 0 + 125856 = N 0 0 + 125856 = N 6 0 + 126048 = N 4 0 + 126048 = N 6 0 + 126240 = N 4 0 + 126240 = N 6 0 + 126432 = N 1 0 + 126432 = N 6 0 + 126624 = N 4 0 + 126624 = N 6 0 + 126816 = N 4 0 + 126816 = N 6 0 + 127008 = N 1 0 + 127008 = N 6 0 + 127104 = S 2 1536 + 127200 = N 0 352 + 127296 = N 1 256 + 127584 = N 0 352 + 127680 = N 1 256 + 127968 = N 0 256 + 128064 = N 1 160 + 128352 = N 1 352 + 128448 = N 2 256 + 128736 = N 1 352 + 128832 = N 2 256 + 129120 = N 1 352 + 129216 = N 2 256 + 129504 = N 1 352 + 129600 = N 2 288 + 129888 = N 1 256 + 129984 = N 2 160 + 130272 = N 0 352 + 130368 = N 1 256 + 130656 = N 0 352 + 130752 = N 1 256 + 131040 = N 0 256 + 131136 = N 1 160 + 131424 = N 1 352 + 131520 = N 2 256 + 131808 = N 1 352 + 131904 = N 2 256 + 132192 = N 1 352 + 132288 = N 2 256 + 132576 = N 1 352 + 132672 = N 2 256 + 132960 = N 1 192 + 133056 = N 2 96 + 133344 = N 2 352 + 133440 = N 4 256 + 133728 = N 2 288 + 133824 = N 4 192 + 134112 = N 2 288 + 134208 = N 3 192 + 134496 = N 0 0 + 134592 = N 0 256 + 134880 = N 0 0 + 134976 = N 1 256 + 135264 = N 1 0 + 135360 = N 0 0 + 135456 = N 1 160 + 135648 = N 2 160 + 135840 = N 1 0 + 136032 = N 3 0 + 136128 = N 1 0 + 136224 = N 3 160 + 136416 = N 1 352 + 136512 = N 3 256 + 136800 = N 1 352 + 136896 = N 3 256 + 137184 = N 1 256 + 137280 = N 3 160 + 137568 = N 2 352 + 137664 = N 3 256 + 137952 = N 2 288 + 138048 = N 3 192 + 138336 = N 2 352 + 138432 = N 3 256 + 138720 = N 2 288 + 138816 = N 4 192 + 139104 = N 3 352 + 139200 = N 4 256 + 139488 = N 3 256 + 139488 = S 2 960 + 139488 = E solo + 139776 = N 4 160 + 139776 = N 5 0 + 139968 = N 2 0 + 140016 = N 3 0 + 140064 = N 2 256 + 140352 = N 1 0 + 140352 = N 5 0 + 140544 = N 0 0 + 140640 = N 4 192 + 140880 = N 3 0 + 140928 = N 2 0 + 140976 = N 1 0 + 141024 = N 2 0 + 141072 = N 3 0 + 141120 = N 4 0 + 141168 = N 3 0 + 141216 = N 2 0 + 141360 = N 3 0 + 141408 = N 2 0 + 141456 = N 1 0 + 141504 = N 2 0 + 141552 = N 4 0 + 141600 = N 3 0 + 141648 = N 2 0 + 141696 = N 1 0 + 141792 = N 2 0 + 141840 = N 1 0 + 141888 = N 0 0 + 141936 = N 1 0 + 141984 = N 0 0 + 142080 = N 3 0 + 142128 = N 2 0 + 142176 = N 3 160 + 142368 = N 4 0 + 142368 = N 5 0 + 142464 = N 3 0 + 142464 = N 5 0 + 142560 = N 2 160 + 142752 = N 1 0 + 142752 = N 5 0 + 142848 = N 0 160 + 143040 = N 4 128 + 143200 = N 3 192 + 143424 = N 1 160 + 143616 = N 2 160 + 143616 = N 5 0 + 143808 = N 1 0 + 143904 = N 0 480 + 144576 = N 0 0 + 144672 = N 1 0 + 144768 = N 2 0 + 144768 = N 5 0 + 144864 = N 4 160 + 145056 = N 3 112 + 145056 = N 5 0 + 145200 = N 2 0 + 145200 = N 5 0 + 145248 = N 3 0 + 145296 = N 2 112 + 145440 = N 1 0 + 145632 = N 0 256 + 145920 = N 4 352 + 146304 = N 2 0 + 146400 = N 1 256 + 146688 = N 0 0 + 146688 = N 5 0 + 146784 = N 2 0 + 146880 = N 4 0 + 146880 = N 5 0 + 147072 = N 2 160 + 147264 = N 1 192 + 147264 = N 5 0 + 147552 = N 3 0 + 147600 = N 2 0 + 147696 = N 1 0 + 147744 = N 2 0 + 147792 = N 1 0 + 147840 = N 0 0 + 147888 = N 1 0 + 147936 = N 2 0 + 148032 = N 1 0 + 148080 = N 3 0 + 148176 = N 2 0 + 148224 = N 3 0 + 148320 = N 3 0 + 148368 = N 4 0 + 148416 = N 3 0 + 148464 = N 2 0 + 148512 = N 3 0 + 148560 = N 2 0 + 148608 = N 3 0 + 148656 = N 4 0 + 148704 = N 2 256 + 148992 = N 3 352 + 149376 = N 2 0 + 149472 = N 1 256 + 149760 = N 0 0 + 149856 = N 1 0 + 149952 = N 2 0 + 149952 = N 5 0 + 150048 = N 4 0 + 150144 = N 3 160 + 150336 = N 2 288 + 150336 = N 5 0 + 150720 = N 1 0 + 150816 = N 0 0 + 150912 = N 3 256 + 151200 = N 2 0 + 151296 = N 0 160 + 151488 = N 2 0 + 151584 = N 0 0 + 151680 = N 1 0 + 151776 = N 3 256 + 152064 = N 2 0 + 152064 = N 5 0 + 152160 = N 1 0 + 152160 = N 5 0 + 152352 = E soloend +} +[MediumSingle] +{ + 1536 = N 2 0 + 1536 = N 3 0 + 1632 = N 2 256 + 1632 = N 3 256 + 2208 = N 0 0 + 2304 = N 1 0 + 2304 = N 5 0 + 2496 = N 2 0 + 2688 = N 2 0 + 2784 = N 3 0 + 2784 = N 5 0 + 2880 = N 2 0 + 2880 = N 5 0 + 3072 = N 2 0 + 3072 = N 3 0 + 3168 = N 2 256 + 3168 = N 3 256 + 3840 = N 2 0 + 3936 = N 3 0 + 3936 = N 5 0 + 4032 = N 2 0 + 4032 = N 5 0 + 4224 = N 1 0 + 4320 = N 2 0 + 4320 = N 5 0 + 4416 = N 1 160 + 4608 = N 0 0 + 4608 = N 2 0 + 4608 = N 6 0 + 4800 = N 2 0 + 4800 = N 6 0 + 4896 = N 1 0 + 4896 = N 6 0 + 5088 = N 1 0 + 5088 = N 2 0 + 5088 = N 6 0 + 5280 = N 1 0 + 5280 = N 6 0 + 5376 = N 3 0 + 5376 = N 6 0 + 5376 = S 2 1344 + 5472 = N 2 0 + 5472 = N 6 0 + 5568 = N 2 256 + 5568 = N 3 256 + 5568 = N 6 0 + 5856 = N 2 0 + 5856 = N 6 0 + 6000 = N 1 0 + 6000 = N 6 0 + 6144 = N 3 0 + 6144 = N 6 0 + 6288 = N 2 0 + 6288 = N 6 0 + 6432 = N 2 0 + 6432 = N 6 0 + 7680 = N 0 160 + 7680 = N 2 160 + 7680 = N 6 0 + 7872 = N 2 0 + 7872 = N 6 0 + 7968 = N 1 160 + 7968 = N 6 0 + 8160 = N 2 0 + 8160 = N 6 0 + 8352 = N 0 0 + 8352 = N 6 0 + 8448 = N 1 0 + 8448 = N 6 0 + 8544 = N 2 0 + 8544 = N 6 0 + 8640 = N 3 0 + 8640 = N 6 0 + 8832 = N 2 0 + 8832 = N 6 0 + 8928 = N 1 0 + 8928 = N 6 0 + 9024 = N 2 0 + 9024 = N 6 0 + 9120 = N 3 0 + 9120 = N 6 0 + 9216 = N 1 160 + 9216 = N 2 160 + 9216 = N 6 0 + 9504 = N 1 192 + 9504 = N 3 192 + 9504 = N 6 0 + 9888 = N 0 352 + 9888 = N 1 352 + 9888 = N 6 0 + 10272 = N 0 448 + 10272 = N 2 448 + 10272 = N 6 0 + 10752 = N 1 160 + 10752 = N 2 160 + 10752 = N 6 0 + 11040 = N 0 192 + 11040 = N 1 192 + 11040 = N 6 0 + 11424 = N 0 0 + 11424 = N 2 0 + 11424 = N 6 0 + 11616 = N 0 0 + 11616 = N 1 0 + 11616 = N 6 0 + 11808 = N 2 448 + 11808 = N 3 448 + 11808 = N 6 0 + 12288 = N 1 160 + 12288 = N 2 160 + 12288 = N 6 0 + 12576 = N 1 192 + 12576 = N 3 192 + 12576 = N 6 0 + 12960 = N 0 352 + 12960 = N 1 352 + 12960 = N 6 0 + 13344 = N 0 448 + 13344 = N 2 448 + 13344 = N 6 0 + 13824 = N 1 160 + 13824 = N 2 160 + 13824 = N 6 0 + 14112 = N 0 0 + 14112 = N 1 0 + 14112 = N 6 0 + 14496 = N 2 160 + 14496 = S 2 768 + 14688 = N 1 0 + 14688 = N 5 0 + 14880 = N 2 256 + 15168 = N 1 0 + 15168 = N 5 0 + 15360 = N 0 256 + 15648 = N 1 160 + 15648 = N 5 0 + 15840 = N 2 160 + 15840 = N 5 0 + 16032 = N 3 448 + 16896 = N 1 0 + 16992 = N 3 0 + 17088 = N 2 0 + 17184 = N 1 160 + 17472 = N 0 0 + 17568 = N 3 160 + 17760 = N 2 0 + 17760 = N 5 0 + 17952 = N 1 0 + 18048 = N 2 0 + 18144 = N 1 0 + 18240 = N 0 0 + 18336 = N 1 0 + 18432 = N 2 256 + 18720 = N 1 160 + 18912 = N 0 0 + 18912 = N 5 0 + 19104 = N 3 448 + 19584 = N 0 0 + 19584 = N 1 0 + 19872 = N 2 0 + 19968 = N 1 0 + 20064 = N 3 0 + 20160 = N 2 0 + 20256 = N 1 160 + 20544 = N 0 0 + 20640 = N 1 768 + 21600 = N 2 160 + 21792 = N 1 0 + 21888 = N 0 0 + 22080 = N 1 0 + 22272 = N 2 0 + 22464 = N 1 160 + 22656 = N 1 0 + 22848 = N 0 0 + 22848 = S 2 1344 + 23040 = N 0 0 + 23232 = N 1 0 + 23424 = N 0 0 + 23616 = N 0 0 + 23808 = N 1 0 + 24000 = N 0 0 + 24192 = N 1 0 + 24288 = N 3 160 + 24480 = N 0 0 + 24576 = N 2 160 + 24768 = N 1 0 + 24960 = N 1 0 + 25152 = N 0 160 + 25344 = N 3 0 + 25632 = N 2 0 + 25728 = N 1 0 + 25920 = N 2 0 + 26112 = N 1 0 + 26304 = N 1 0 + 26496 = N 2 0 + 26688 = N 2 0 + 26784 = N 3 0 + 26976 = N 2 160 + 27168 = N 1 0 + 27264 = N 0 0 + 27456 = N 1 0 + 27648 = N 2 0 + 27840 = N 1 160 + 28032 = N 1 0 + 28224 = N 0 0 + 28416 = N 0 0 + 28608 = N 1 0 + 28800 = N 0 0 + 28992 = N 0 0 + 29184 = N 1 0 + 29376 = N 0 0 + 29568 = N 1 0 + 29664 = N 3 160 + 29856 = N 0 0 + 29952 = N 2 160 + 30144 = N 1 0 + 30336 = N 1 0 + 30528 = N 0 160 + 30720 = N 3 0 + 31008 = N 2 0 + 31104 = N 1 0 + 31104 = N 5 0 + 31296 = N 2 0 + 31488 = N 1 0 + 31680 = N 1 0 + 31872 = N 2 0 + 32064 = N 2 0 + 32160 = N 3 0 + 32256 = S 2 1632 + 32352 = E solo + 32448 = N 2 0 + 32544 = N 1 0 + 32928 = N 2 0 + 33024 = N 3 0 + 33120 = N 2 0 + 33216 = N 1 0 + 33312 = N 2 0 + 33408 = N 1 0 + 33504 = N 1 0 + 33600 = N 0 0 + 33696 = N 1 0 + 33792 = N 0 120 + 33936 = N 1 120 + 33936 = N 5 0 + 34176 = N 2 0 + 34368 = N 3 256 + 34656 = N 2 0 + 34848 = N 0 160 + 35040 = N 1 160 + 35232 = N 2 160 + 35232 = N 5 0 + 35424 = N 3 0 + 35616 = N 1 160 + 35808 = N 0 0 + 36000 = N 2 0 + 36096 = N 3 0 + 36192 = N 2 0 + 36288 = N 1 0 + 36384 = N 0 0 + 36480 = N 1 0 + 36576 = N 3 0 + 36672 = N 2 0 + 36768 = N 1 0 + 36864 = N 2 0 + 36960 = N 1 0 + 37056 = N 1 0 + 37152 = N 0 0 + 37248 = N 3 160 + 37440 = N 1 160 + 37632 = N 0 0 + 37824 = N 3 160 + 38016 = N 2 160 + 38208 = N 0 0 + 38400 = N 3 0 + 38592 = N 1 160 + 38784 = N 3 160 + 39168 = N 1 0 + 39264 = N 2 0 + 39264 = N 5 0 + 39360 = N 3 0 + 39456 = N 2 544 + 40032 = N 2 0 + 40128 = N 1 0 + 40224 = N 2 0 + 40320 = N 0 736 + 41184 = N 1 0 + 41376 = N 3 0 + 41472 = N 1 0 + 41568 = N 2 0 + 41664 = N 1 0 + 41760 = N 2 160 + 41952 = N 0 112 + 42096 = N 1 112 + 42096 = N 5 0 + 42240 = N 3 112 + 42384 = N 1 112 + 42528 = N 2 736 + 43296 = N 2 0 + 43296 = S 2 960 + 43488 = N 2 0 + 43632 = N 1 0 + 43776 = N 0 960 + 44832 = N 1 0 + 45024 = N 3 112 + 45168 = N 2 112 + 45168 = N 5 0 + 45312 = N 2 144 + 45600 = N 1 352 + 45984 = N 2 0 + 46080 = N 1 0 + 46176 = N 2 0 + 46368 = N 1 0 + 46464 = N 2 0 + 46560 = N 3 0 + 46752 = N 1 0 + 46944 = N 0 192 + 47328 = N 2 160 + 47520 = N 3 0 + 47520 = N 5 0 + 47616 = N 2 160 + 47808 = N 1 160 + 48000 = N 0 160 + 48192 = N 2 160 + 48384 = N 1 192 + 48864 = N 3 112 + 49008 = N 2 0 + 49008 = N 5 0 + 49248 = N 2 160 + 49440 = N 1 0 + 49440 = N 5 0 + 49632 = N 1 160 + 49824 = N 2 0 + 50016 = N 1 0 + 50112 = N 3 0 + 50208 = N 2 0 + 50400 = N 1 0 + 50592 = N 0 0 + 50784 = N 1 0 + 50880 = N 1 0 + 51072 = N 3 0 + 51168 = N 2 0 + 51264 = N 1 0 + 51360 = N 0 112 + 51504 = N 0 0 + 51504 = N 2 0 + 51648 = N 0 0 + 51648 = N 1 0 + 51792 = N 1 0 + 51792 = N 3 0 + 51936 = N 1 0 + 51936 = N 2 0 + 52080 = N 1 0 + 52080 = N 3 0 + 52320 = N 2 256 + 52608 = N 3 160 + 52608 = N 5 0 + 52800 = N 2 0 + 52800 = S 2 672 + 52896 = N 1 0 + 52992 = N 0 0 + 53088 = N 1 112 + 53088 = N 2 112 + 53280 = N 0 0 + 53376 = N 1 112 + 53376 = N 2 112 + 53568 = N 2 0 + 53664 = N 2 0 + 53760 = N 1 0 + 53856 = N 0 0 + 53952 = N 1 0 + 54048 = N 3 0 + 54144 = N 2 0 + 54240 = N 2 0 + 54384 = N 2 0 + 54528 = N 2 0 + 54624 = N 1 0 + 54720 = N 1 0 + 54816 = N 0 0 + 54912 = N 0 0 + 55008 = N 1 0 + 55104 = N 2 0 + 55200 = N 1 0 + 55296 = N 1 0 + 55392 = N 3 0 + 55536 = N 2 0 + 55680 = N 1 0 + 55776 = N 0 0 + 55920 = N 0 0 + 56064 = N 0 0 + 56208 = N 0 0 + 56352 = N 0 0 + 56448 = N 0 0 + 56544 = N 2 0 + 56640 = N 3 0 + 56736 = N 2 0 + 56832 = N 1 0 + 56928 = N 2 0 + 57072 = N 1 0 + 57216 = N 0 0 + 57312 = N 1 0 + 57408 = N 2 0 + 57504 = N 3 0 + 57648 = N 0 0 + 57792 = N 1 0 + 57936 = N 0 0 + 58080 = N 2 0 + 58224 = N 3 0 + 58368 = N 1 160 + 58560 = N 0 0 + 58656 = N 0 496 + 59184 = N 3 0 + 59184 = N 5 0 + 59328 = E soloend + 59616 = N 2 784 + 59616 = N 3 784 + 60432 = N 1 304 + 60432 = N 2 304 + 60768 = N 1 256 + 60768 = N 3 256 + 61056 = N 0 448 + 61056 = N 2 448 + 61536 = N 0 256 + 61536 = N 1 256 + 61824 = N 2 256 + 61824 = N 3 256 + 62112 = N 1 976 + 62112 = N 2 976 + 63120 = N 2 0 + 63120 = N 6 0 + 63264 = N 1 0 + 63264 = N 6 0 + 63360 = N 3 0 + 63360 = N 6 0 + 63456 = N 0 544 + 63456 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64224 = N 1 0 + 64224 = N 6 0 + 64368 = N 0 0 + 64368 = N 6 0 + 64512 = N 1 0 + 64512 = N 6 0 + 64656 = N 0 0 + 64656 = N 6 0 + 64800 = N 1 0 + 64800 = N 6 0 + 64944 = N 0 0 + 64944 = N 6 0 + 67056 = N 0 0 + 67056 = S 2 1728 + 67152 = N 1 0 + 67248 = N 2 0 + 67344 = N 1 0 + 67440 = N 2 0 + 67536 = N 3 0 + 67536 = N 5 0 + 67632 = N 1 208 + 67872 = N 3 256 + 68160 = N 1 256 + 68448 = N 2 784 + 69264 = N 1 192 + 69600 = N 2 192 + 69888 = N 0 304 + 70224 = N 3 112 + 70368 = N 1 256 + 70656 = N 2 0 + 70848 = N 1 400 + 71280 = N 2 0 + 71280 = N 5 0 + 71472 = N 0 0 + 71568 = N 1 0 + 71664 = N 2 0 + 71760 = N 0 0 + 71856 = N 1 0 + 71952 = N 2 0 + 72096 = N 1 0 + 72192 = N 2 0 + 72288 = N 0 112 + 72432 = N 3 0 + 72432 = N 5 0 + 72576 = N 1 256 + 72864 = N 2 0 + 72864 = N 5 0 + 73056 = N 1 112 + 73200 = N 0 0 + 73200 = N 5 0 + 73344 = N 1 112 + 73488 = N 0 0 + 73488 = N 5 0 + 73632 = N 1 112 + 73776 = N 0 192 + 73776 = N 5 0 + 75888 = N 0 0 + 75888 = E solo + 75984 = N 1 0 + 76080 = N 2 0 + 76176 = N 1 0 + 76272 = N 2 0 + 76368 = N 3 0 + 76512 = N 2 0 + 76608 = N 1 0 + 76704 = N 3 0 + 76800 = N 2 0 + 76896 = N 1 0 + 76992 = N 2 0 + 77088 = N 1 0 + 77184 = N 0 0 + 77280 = N 3 0 + 77376 = N 2 0 + 77472 = N 1 0 + 77568 = N 0 0 + 77664 = N 1 0 + 77760 = N 0 0 + 77856 = N 2 0 + 77952 = N 1 0 + 78048 = N 2 0 + 78144 = N 1 0 + 78240 = N 3 0 + 78336 = N 2 0 + 78432 = N 0 0 + 78528 = N 2 0 + 78624 = N 1 0 + 78720 = N 0 0 + 78816 = N 3 0 + 78912 = N 1 0 + 79008 = N 1 0 + 79104 = N 3 0 + 79200 = N 2 0 + 79296 = N 2 0 + 79392 = N 0 0 + 79488 = N 1 0 + 79584 = N 2 0 + 79680 = N 1 0 + 79776 = N 1 0 + 79872 = N 2 0 + 79968 = N 3 0 + 80064 = N 2 0 + 80160 = N 1 0 + 80256 = N 2 0 + 80256 = S 2 864 + 80352 = N 1 0 + 80448 = N 0 0 + 80544 = N 2 0 + 80736 = N 3 0 + 80832 = N 1 0 + 80928 = N 2 0 + 81024 = N 1 0 + 81120 = N 0 0 + 81216 = N 1 0 + 81312 = N 2 0 + 81408 = N 0 0 + 81504 = N 1 0 + 81600 = N 2 0 + 81696 = N 3 0 + 81792 = N 2 0 + 81888 = N 1 0 + 81984 = N 2 0 + 82080 = N 3 0 + 82272 = N 2 0 + 82368 = N 1 0 + 82464 = N 0 0 + 82608 = N 1 304 + 82944 = N 0 256 + 83232 = N 2 256 + 83520 = N 3 0 + 83520 = N 5 0 + 83808 = N 1 208 + 84192 = N 1 208 + 84576 = N 1 208 + 84960 = N 2 160 + 85152 = N 0 160 + 85344 = N 1 0 + 85440 = N 2 0 + 85440 = N 5 0 + 85536 = N 3 448 + 86016 = N 0 112 + 86160 = N 2 304 + 86496 = N 1 112 + 86496 = N 5 0 + 86640 = N 1 112 + 86784 = N 0 112 + 86928 = N 1 112 + 87216 = N 1 304 + 87552 = N 0 256 + 87840 = N 2 256 + 88128 = N 3 0 + 88128 = N 5 0 + 88416 = N 1 208 + 88800 = N 1 208 + 89184 = N 1 208 + 89568 = N 3 160 + 89760 = N 1 160 + 89952 = N 2 0 + 90048 = N 3 0 + 90048 = N 5 0 + 90144 = N 0 384 + 90720 = N 1 0 + 90864 = N 3 0 + 91008 = N 1 0 + 91056 = S 2 1344 + 91104 = N 2 0 + 91248 = N 3 0 + 91392 = N 1 0 + 91536 = N 2 0 + 91680 = N 1 0 + 91872 = N 1 0 + 91968 = E soloend + 92160 = N 0 0 + 92256 = N 2 0 + 92448 = N 2 0 + 92640 = N 2 0 + 92832 = N 2 0 + 92928 = N 0 0 + 93024 = N 2 0 + 93216 = N 2 0 + 93408 = N 0 0 + 93600 = N 2 0 + 93696 = N 3 192 + 93984 = N 2 0 + 94176 = N 2 0 + 94272 = N 3 0 + 94368 = N 2 0 + 94560 = N 2 0 + 94752 = N 3 0 + 94944 = N 0 160 + 95136 = N 1 0 + 95232 = N 0 0 + 95328 = N 2 160 + 95520 = N 1 0 + 95616 = N 0 256 + 95904 = N 1 0 + 96000 = N 0 0 + 96096 = N 2 160 + 96288 = N 1 160 + 96480 = N 0 160 + 96672 = N 1 0 + 96768 = N 0 0 + 96864 = N 2 160 + 97056 = N 1 0 + 97152 = N 0 256 + 97440 = N 1 0 + 97536 = N 0 0 + 97632 = N 2 160 + 97824 = N 1 0 + 98016 = N 2 0 + 98208 = N 2 0 + 98400 = N 2 0 + 98592 = N 2 0 + 98784 = N 2 0 + 98976 = N 2 0 + 99072 = N 3 256 + 99360 = N 2 0 + 99552 = N 0 0 + 99744 = N 2 0 + 99840 = N 3 144 + 100128 = N 2 0 + 100320 = N 2 0 + 100512 = N 2 0 + 100704 = N 2 0 + 100896 = N 3 0 + 101088 = N 0 160 + 101280 = N 1 0 + 101376 = N 0 0 + 101472 = N 2 160 + 101664 = N 1 0 + 101760 = N 0 256 + 102048 = N 1 0 + 102144 = N 0 0 + 102240 = N 2 160 + 102432 = N 1 160 + 102624 = N 0 160 + 102816 = N 1 0 + 102912 = N 0 0 + 103008 = N 2 160 + 103200 = N 1 0 + 103296 = N 0 256 + 103584 = N 1 0 + 103776 = S 2 768 + 103872 = N 0 0 + 103872 = N 6 0 + 103968 = N 1 0 + 103968 = N 6 0 + 104064 = N 2 0 + 104064 = N 6 0 + 104160 = N 3 0 + 104160 = N 6 0 + 104256 = N 2 0 + 104256 = N 6 0 + 104352 = N 2 0 + 104352 = N 6 0 + 104448 = N 1 0 + 104448 = N 6 0 + 104688 = N 3 0 + 104688 = N 6 0 + 104832 = N 2 0 + 104832 = N 6 0 + 104928 = N 1 0 + 104928 = N 6 0 + 105024 = N 0 0 + 105024 = N 6 0 + 105120 = N 1 0 + 105120 = N 6 0 + 105216 = N 2 0 + 105216 = N 6 0 + 105312 = N 3 0 + 105312 = N 6 0 + 105408 = N 1 0 + 105408 = N 6 0 + 105504 = N 2 0 + 105504 = N 6 0 + 105600 = N 1 0 + 105600 = N 6 0 + 105696 = N 1 0 + 105696 = N 6 0 + 105792 = N 0 0 + 105792 = N 6 0 + 106080 = N 3 0 + 106272 = N 2 112 + 106464 = N 1 160 + 106656 = N 1 112 + 106848 = N 1 0 + 106944 = N 0 0 + 107040 = N 1 160 + 107232 = N 1 160 + 107424 = N 2 0 + 107520 = N 0 160 + 107712 = N 2 0 + 107808 = N 0 0 + 107904 = N 1 0 + 108000 = N 2 0 + 108096 = N 1 0 + 108192 = N 2 0 + 108288 = N 3 0 + 108384 = N 2 0 + 108480 = N 1 0 + 108576 = N 1 0 + 108672 = N 2 0 + 108960 = N 3 0 + 109056 = N 2 160 + 109344 = N 2 0 + 109440 = N 0 208 + 109920 = N 0 0 + 110016 = N 1 0 + 110112 = N 2 0 + 110304 = N 3 0 + 110496 = N 2 0 + 110592 = N 0 160 + 110880 = N 2 0 + 110976 = N 2 160 + 111168 = N 1 0 + 111168 = N 5 0 + 111360 = N 2 256 + 111648 = N 1 0 + 111648 = N 5 0 + 111840 = N 0 0 + 112032 = N 3 0 + 112128 = N 2 160 + 112416 = N 2 0 + 112512 = N 1 208 + 112896 = N 2 0 + 112992 = N 3 0 + 113088 = N 2 0 + 113184 = N 1 0 + 113280 = N 0 0 + 113568 = N 2 0 + 113664 = N 0 160 + 113952 = N 2 0 + 114048 = N 2 160 + 114240 = N 1 0 + 114240 = N 5 0 + 114432 = N 2 256 + 114720 = N 1 160 + 114720 = N 5 0 + 114912 = N 0 256 + 114912 = S 2 1344 + 115200 = N 1 160 + 115200 = N 5 0 + 115392 = N 2 160 + 115392 = N 5 0 + 115584 = N 3 448 + 116448 = N 1 0 + 116544 = N 3 0 + 116640 = N 2 0 + 116736 = N 1 160 + 117024 = N 0 0 + 117120 = N 3 160 + 117312 = N 2 0 + 117312 = N 5 0 + 117504 = N 1 0 + 117600 = N 2 0 + 117696 = N 1 0 + 117792 = N 0 0 + 117888 = N 1 0 + 117984 = N 2 256 + 118272 = N 1 160 + 118464 = N 0 0 + 118464 = N 5 0 + 118656 = N 3 448 + 119136 = N 0 0 + 119136 = N 1 0 + 119424 = N 2 0 + 119520 = N 1 0 + 119616 = N 3 0 + 119712 = N 2 0 + 119808 = N 1 160 + 120096 = N 0 0 + 120192 = N 2 160 + 120384 = N 1 0 + 120384 = N 5 0 + 120576 = N 2 144 + 120864 = N 1 0 + 120960 = N 2 0 + 120960 = N 5 0 + 121056 = N 0 960 + 122208 = N 0 0 + 122208 = N 6 0 + 122400 = N 2 0 + 122400 = N 6 0 + 122592 = N 2 0 + 122592 = N 6 0 + 122784 = N 0 0 + 122784 = N 6 0 + 122976 = N 2 0 + 122976 = N 6 0 + 123168 = N 2 0 + 123168 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123552 = N 2 0 + 123552 = N 6 0 + 123744 = N 2 0 + 123744 = N 6 0 + 123936 = N 0 0 + 123936 = N 6 0 + 124128 = N 1 0 + 124128 = N 6 0 + 124320 = N 3 0 + 124320 = N 6 0 + 124512 = N 3 0 + 124512 = N 6 0 + 124704 = N 1 0 + 124704 = N 6 0 + 124896 = N 3 0 + 124896 = N 6 0 + 125088 = N 3 0 + 125088 = N 6 0 + 125280 = N 0 0 + 125280 = N 6 0 + 125472 = N 3 0 + 125472 = N 6 0 + 125664 = N 3 0 + 125664 = N 6 0 + 125856 = N 0 0 + 125856 = N 6 0 + 126048 = N 3 0 + 126048 = N 6 0 + 126240 = N 3 0 + 126240 = N 6 0 + 126432 = N 1 0 + 126432 = N 6 0 + 126624 = N 3 0 + 126624 = N 6 0 + 126816 = N 3 0 + 126816 = N 6 0 + 127008 = N 1 0 + 127008 = N 6 0 + 127104 = S 2 1536 + 127200 = N 0 0 + 127296 = N 1 256 + 127584 = N 0 0 + 127680 = N 1 256 + 127968 = N 0 0 + 128064 = N 1 160 + 128352 = N 1 0 + 128448 = N 2 256 + 128736 = N 1 0 + 128832 = N 2 256 + 129120 = N 1 0 + 129216 = N 2 256 + 129504 = N 1 0 + 129600 = N 2 256 + 129888 = N 1 0 + 129984 = N 2 160 + 130272 = N 0 0 + 130368 = N 1 256 + 130656 = N 0 0 + 130752 = N 1 256 + 131040 = N 0 0 + 131136 = N 1 160 + 131424 = N 1 0 + 131520 = N 2 256 + 131808 = N 1 0 + 131904 = N 2 256 + 132192 = N 1 0 + 132288 = N 2 256 + 132576 = N 1 0 + 132672 = N 2 256 + 132960 = N 1 0 + 133056 = N 2 0 + 133344 = N 1 0 + 133440 = N 3 256 + 133728 = N 1 0 + 133824 = N 3 192 + 134112 = N 1 0 + 134208 = N 2 192 + 134496 = N 0 0 + 134592 = N 0 256 + 134880 = N 0 0 + 134976 = N 1 256 + 135264 = N 1 0 + 135360 = N 0 0 + 135456 = N 1 160 + 135648 = N 2 160 + 135840 = N 1 0 + 136032 = N 3 0 + 136224 = N 3 160 + 136416 = N 0 0 + 136512 = N 2 256 + 136800 = N 0 0 + 136896 = N 2 256 + 137184 = N 0 0 + 137280 = N 2 160 + 137568 = N 1 0 + 137664 = N 2 256 + 137952 = N 1 0 + 138048 = N 2 192 + 138336 = N 1 0 + 138432 = N 2 256 + 138720 = N 1 0 + 138816 = N 3 192 + 139104 = N 2 0 + 139200 = N 3 256 + 139488 = N 2 256 + 139488 = S 2 960 + 139488 = E solo + 139776 = N 3 160 + 139776 = N 5 0 + 139968 = N 1 352 + 140352 = N 0 0 + 140352 = N 5 0 + 140640 = N 3 192 + 140928 = N 1 0 + 141024 = N 1 0 + 141120 = N 2 0 + 141216 = N 1 0 + 141408 = N 2 0 + 141504 = N 1 0 + 141600 = N 3 0 + 141696 = N 2 0 + 141792 = N 1 0 + 141888 = N 0 0 + 141984 = N 0 0 + 142080 = N 3 0 + 142176 = N 3 352 + 142560 = N 2 160 + 142752 = N 1 0 + 142752 = N 5 0 + 142848 = N 0 160 + 143040 = N 3 128 + 143200 = N 2 192 + 143424 = N 1 160 + 143616 = N 2 160 + 143616 = N 5 0 + 143808 = N 1 0 + 143904 = N 0 480 + 144672 = N 1 0 + 144768 = N 2 0 + 144768 = N 5 0 + 144864 = N 3 352 + 145248 = N 2 160 + 145248 = N 5 0 + 145440 = N 1 0 + 145632 = N 0 256 + 145920 = N 3 352 + 146304 = N 2 0 + 146400 = N 1 352 + 146784 = N 2 0 + 146880 = N 3 0 + 146880 = N 5 0 + 147072 = N 2 160 + 147264 = N 1 192 + 147264 = N 5 0 + 147552 = N 2 0 + 147744 = N 1 0 + 147840 = N 0 0 + 147936 = N 2 0 + 148032 = N 1 0 + 148128 = N 1 0 + 148224 = N 2 0 + 148320 = N 3 0 + 148416 = N 2 0 + 148512 = N 1 0 + 148704 = N 2 256 + 148992 = N 3 352 + 149376 = N 2 0 + 149472 = N 1 256 + 149760 = N 0 0 + 149856 = N 1 0 + 150048 = N 3 0 + 150144 = N 2 160 + 150336 = N 1 288 + 150336 = N 5 0 + 150720 = N 2 0 + 150816 = N 1 0 + 150912 = N 3 256 + 151200 = N 2 0 + 151296 = N 0 160 + 151488 = N 1 0 + 151584 = N 0 0 + 151776 = N 2 352 + 152160 = N 1 0 + 152160 = N 5 0 + 152352 = E soloend +} +[EasySingle] +{ + 1536 = N 2 0 + 1536 = N 4 0 + 1632 = N 2 256 + 2304 = N 0 0 + 2496 = N 1 0 + 2688 = N 1 0 + 2880 = N 1 0 + 3072 = N 2 0 + 3168 = N 2 256 + 3840 = N 2 0 + 4032 = N 2 0 + 4032 = N 5 0 + 4224 = N 1 0 + 4416 = N 1 160 + 4608 = N 0 0 + 4608 = N 6 0 + 4800 = N 1 0 + 4800 = N 6 0 + 5088 = N 2 0 + 5088 = N 6 0 + 5280 = N 1 0 + 5280 = N 6 0 + 5376 = S 2 1344 + 5568 = N 2 256 + 5568 = N 6 0 + 5856 = N 1 0 + 5856 = N 6 0 + 6144 = N 2 0 + 6144 = N 6 0 + 6432 = N 0 0 + 6432 = N 6 0 + 7680 = N 0 160 + 7680 = N 6 0 + 7968 = N 1 160 + 7968 = N 6 0 + 8448 = N 1 0 + 8448 = N 6 0 + 8640 = N 2 0 + 8640 = N 6 0 + 8832 = N 1 0 + 8832 = N 6 0 + 9024 = N 1 0 + 9024 = N 6 0 + 9216 = N 1 160 + 9216 = N 6 0 + 9504 = N 2 192 + 9504 = N 6 0 + 9888 = N 0 352 + 9888 = N 6 0 + 10272 = N 1 448 + 10272 = N 6 0 + 10752 = N 2 160 + 10752 = N 6 0 + 11040 = N 0 192 + 11040 = N 6 0 + 11424 = N 1 0 + 11424 = N 6 0 + 11616 = N 0 0 + 11616 = N 6 0 + 11808 = N 2 448 + 11808 = N 6 0 + 12288 = N 1 160 + 12288 = N 6 0 + 12576 = N 2 192 + 12576 = N 6 0 + 12960 = N 0 352 + 12960 = N 6 0 + 13344 = N 1 448 + 13344 = N 6 0 + 13824 = N 2 160 + 13824 = N 6 0 + 14112 = N 0 0 + 14112 = N 6 0 + 14496 = N 2 160 + 14496 = S 2 768 + 14688 = N 1 0 + 14688 = N 5 0 + 14880 = N 2 256 + 15168 = N 1 0 + 15168 = N 5 0 + 15360 = N 0 256 + 15648 = N 1 160 + 15648 = N 5 0 + 16032 = N 2 448 + 16896 = N 1 0 + 17088 = N 2 0 + 17184 = N 0 160 + 17568 = N 2 160 + 18048 = N 1 0 + 18240 = N 0 0 + 18432 = N 1 256 + 18720 = N 2 160 + 19104 = N 2 448 + 19584 = N 0 0 + 19968 = N 1 0 + 20160 = N 2 0 + 20256 = N 1 160 + 20640 = N 0 768 + 21600 = N 1 160 + 21888 = N 0 0 + 22080 = N 1 0 + 22272 = N 2 0 + 22464 = N 1 0 + 22656 = N 1 0 + 22848 = N 0 0 + 22848 = S 2 1344 + 23040 = N 0 0 + 23232 = N 1 0 + 23424 = N 0 0 + 23616 = N 0 0 + 23808 = N 1 0 + 24000 = N 0 0 + 24288 = N 2 160 + 24576 = N 1 160 + 24768 = N 1 0 + 24960 = N 1 0 + 25152 = N 0 160 + 25344 = N 2 0 + 25728 = N 1 0 + 25920 = N 2 0 + 26112 = N 1 0 + 26304 = N 1 0 + 26496 = N 2 0 + 26688 = N 2 0 + 26976 = N 1 160 + 27264 = N 0 0 + 27456 = N 1 0 + 27648 = N 2 0 + 27840 = N 1 0 + 28032 = N 1 0 + 28224 = N 0 0 + 28416 = N 0 0 + 28608 = N 1 0 + 28800 = N 0 0 + 28992 = N 0 0 + 29184 = N 1 0 + 29376 = N 0 0 + 29664 = N 2 160 + 29952 = N 1 160 + 30144 = N 1 0 + 30336 = N 1 0 + 30528 = N 0 0 + 30720 = N 2 0 + 31104 = N 1 0 + 31296 = N 2 0 + 31488 = N 1 0 + 31680 = N 1 0 + 31872 = N 2 0 + 32064 = N 2 0 + 32256 = S 2 1632 + 32352 = E solo + 32448 = N 0 0 + 33024 = N 2 0 + 33216 = N 1 0 + 33408 = N 1 0 + 33600 = N 0 0 + 33792 = N 0 120 + 33936 = N 1 120 + 33936 = N 5 0 + 34176 = N 1 0 + 34368 = N 2 256 + 34656 = N 1 0 + 34848 = N 0 160 + 35040 = N 1 160 + 35232 = N 2 160 + 35232 = N 5 0 + 35424 = N 2 0 + 35616 = N 1 160 + 35808 = N 0 0 + 36096 = N 2 0 + 36288 = N 1 0 + 36576 = N 2 0 + 36768 = N 1 0 + 36960 = N 0 0 + 37248 = N 2 160 + 37440 = N 1 160 + 37632 = N 0 0 + 37824 = N 2 160 + 38016 = N 1 160 + 38208 = N 0 0 + 38400 = N 2 0 + 38592 = N 1 160 + 38784 = N 2 160 + 39168 = N 1 0 + 39360 = N 2 0 + 39456 = N 1 544 + 40032 = N 1 0 + 40224 = N 1 0 + 40320 = N 0 736 + 41184 = N 1 0 + 41376 = N 2 0 + 41568 = N 1 0 + 41760 = N 1 160 + 41952 = N 0 0 + 42240 = N 2 0 + 42528 = N 1 736 + 43296 = N 1 0 + 43296 = S 2 960 + 43488 = N 1 0 + 43776 = N 0 960 + 44832 = N 1 0 + 45024 = N 2 112 + 45312 = N 1 144 + 45600 = N 0 352 + 45984 = N 1 0 + 46176 = N 1 0 + 46368 = N 1 0 + 46560 = N 2 0 + 46752 = N 1 0 + 46944 = N 0 192 + 47328 = N 2 160 + 47616 = N 2 160 + 47808 = N 1 160 + 48000 = N 0 160 + 48192 = N 2 160 + 48384 = N 1 192 + 48864 = N 2 112 + 49248 = N 1 192 + 49632 = N 1 160 + 49824 = N 0 0 + 50016 = N 1 0 + 50208 = N 2 0 + 50400 = N 1 0 + 50592 = N 0 0 + 50784 = N 1 0 + 50976 = N 0 0 + 51168 = N 1 0 + 51360 = N 0 0 + 51504 = N 1 0 + 51648 = N 0 0 + 51792 = N 2 0 + 51936 = N 1 0 + 52080 = N 2 0 + 52320 = N 1 448 + 52800 = S 2 672 + 52896 = N 0 0 + 53088 = N 1 0 + 53280 = N 0 0 + 53376 = N 1 0 + 53664 = N 1 0 + 53856 = N 0 0 + 54048 = N 2 0 + 54240 = N 1 0 + 54384 = N 1 0 + 54432 = N 1 0 + 54624 = N 1 0 + 54816 = N 0 0 + 55008 = N 1 0 + 55200 = N 1 0 + 55392 = N 2 0 + 55536 = N 1 0 + 55776 = N 0 0 + 55920 = N 0 0 + 56064 = N 0 0 + 56208 = N 0 0 + 56352 = N 0 0 + 56544 = N 2 0 + 56736 = N 2 0 + 56928 = N 1 0 + 57072 = N 0 0 + 57312 = N 1 0 + 57504 = N 2 0 + 57792 = N 1 0 + 58080 = N 2 0 + 58368 = N 1 160 + 58656 = N 0 576 + 59328 = E soloend + 59616 = N 2 784 + 60432 = N 1 304 + 60768 = N 2 256 + 61056 = N 1 448 + 61536 = N 0 256 + 61824 = N 2 256 + 62112 = N 1 976 + 63264 = N 1 0 + 63264 = N 6 0 + 63456 = N 0 544 + 63456 = N 6 0 + 64032 = N 2 0 + 64032 = N 6 0 + 64224 = N 1 0 + 64224 = N 6 0 + 64368 = N 0 0 + 64368 = N 6 0 + 64656 = N 0 0 + 64656 = N 6 0 + 64944 = N 0 0 + 64944 = N 6 0 + 67056 = N 0 0 + 67056 = S 2 1728 + 67248 = N 1 0 + 67440 = N 2 0 + 67632 = N 0 208 + 67872 = N 2 256 + 68160 = N 0 256 + 68448 = N 1 784 + 69264 = N 0 192 + 69600 = N 1 192 + 69888 = N 0 304 + 70224 = N 2 0 + 70368 = N 1 256 + 70656 = N 2 0 + 70848 = N 1 400 + 71472 = N 0 0 + 71664 = N 1 0 + 71856 = N 2 0 + 72096 = N 1 0 + 72288 = N 0 112 + 72576 = N 1 256 + 72864 = N 2 0 + 72864 = N 5 0 + 73200 = N 0 0 + 73488 = N 0 0 + 73776 = N 0 192 + 75888 = N 0 0 + 75888 = E solo + 76080 = N 1 0 + 76272 = N 2 0 + 76512 = N 1 0 + 76704 = N 0 0 + 76896 = N 2 0 + 77088 = N 1 0 + 77280 = N 0 0 + 77472 = N 0 0 + 77664 = N 1 0 + 77856 = N 1 0 + 78048 = N 2 0 + 78240 = N 2 0 + 78432 = N 0 0 + 78624 = N 1 0 + 78816 = N 2 0 + 79008 = N 0 0 + 79200 = N 1 0 + 79392 = N 0 0 + 79584 = N 2 0 + 79776 = N 1 0 + 79968 = N 2 0 + 80160 = N 1 0 + 80256 = S 2 864 + 80352 = N 0 0 + 80544 = N 1 0 + 80736 = N 2 0 + 80928 = N 1 0 + 81120 = N 0 0 + 81312 = N 1 0 + 81504 = N 1 0 + 81696 = N 2 0 + 81888 = N 1 0 + 82080 = N 2 0 + 82272 = N 1 0 + 82464 = N 0 0 + 82608 = N 1 304 + 82944 = N 0 256 + 83232 = N 1 256 + 83520 = N 2 0 + 83520 = N 5 0 + 83808 = N 1 208 + 84192 = N 1 208 + 84576 = N 1 208 + 84960 = N 2 160 + 85152 = N 0 160 + 85344 = N 1 0 + 85536 = N 2 448 + 86016 = N 0 0 + 86160 = N 2 304 + 86496 = N 1 0 + 86496 = N 5 0 + 86640 = N 1 0 + 86784 = N 0 0 + 86928 = N 1 0 + 87216 = N 1 304 + 87552 = N 0 256 + 87840 = N 1 256 + 88128 = N 2 0 + 88128 = N 5 0 + 88416 = N 1 208 + 88800 = N 1 208 + 89184 = N 1 208 + 89568 = N 2 160 + 89760 = N 1 160 + 89952 = N 2 0 + 90144 = N 0 384 + 90720 = N 1 0 + 90864 = N 2 0 + 91056 = S 2 1344 + 91104 = N 0 0 + 91248 = N 2 0 + 91392 = N 0 0 + 91536 = N 1 0 + 91680 = N 0 0 + 91872 = N 1 0 + 91968 = E soloend + 92256 = N 1 0 + 92448 = N 1 0 + 92640 = N 1 0 + 92832 = N 1 0 + 93024 = N 1 0 + 93216 = N 1 0 + 93408 = N 0 0 + 93696 = N 2 192 + 93984 = N 1 0 + 94176 = N 1 0 + 94368 = N 1 0 + 94560 = N 1 0 + 94752 = N 2 0 + 94944 = N 0 160 + 95136 = N 1 0 + 95328 = N 2 160 + 95616 = N 0 256 + 95904 = N 1 0 + 96096 = N 2 160 + 96288 = N 1 160 + 96480 = N 0 160 + 96672 = N 1 0 + 96864 = N 2 160 + 97152 = N 0 256 + 97440 = N 1 0 + 97632 = N 2 160 + 97824 = N 0 0 + 98016 = N 1 0 + 98208 = N 1 0 + 98400 = N 1 0 + 98592 = N 1 0 + 98784 = N 1 0 + 99072 = N 2 256 + 99360 = N 1 0 + 99552 = N 0 0 + 99840 = N 2 144 + 100128 = N 1 0 + 100320 = N 1 0 + 100512 = N 1 0 + 100704 = N 1 0 + 100896 = N 2 0 + 101088 = N 0 160 + 101280 = N 1 0 + 101472 = N 2 160 + 101760 = N 0 256 + 102048 = N 1 0 + 102240 = N 2 160 + 102432 = N 1 160 + 102624 = N 0 160 + 102816 = N 1 0 + 103008 = N 2 160 + 103296 = N 0 256 + 103584 = N 1 0 + 103776 = S 2 768 + 103968 = N 1 0 + 103968 = N 6 0 + 104160 = N 2 0 + 104160 = N 6 0 + 104352 = N 1 0 + 104352 = N 6 0 + 104448 = N 0 0 + 104448 = N 6 0 + 104688 = N 2 0 + 104688 = N 6 0 + 104928 = N 0 0 + 104928 = N 6 0 + 105120 = N 1 0 + 105120 = N 6 0 + 105312 = N 2 0 + 105312 = N 6 0 + 105504 = N 1 0 + 105504 = N 6 0 + 105696 = N 0 0 + 105696 = N 6 0 + 106080 = N 2 0 + 106272 = N 1 112 + 106464 = N 0 160 + 106656 = N 0 112 + 106848 = N 0 0 + 107040 = N 0 160 + 107232 = N 0 160 + 107520 = N 1 160 + 107808 = N 0 0 + 108000 = N 1 0 + 108192 = N 2 0 + 108384 = N 1 0 + 108576 = N 1 0 + 109056 = N 2 160 + 109440 = N 1 208 + 109920 = N 0 0 + 110112 = N 1 0 + 110304 = N 2 0 + 110592 = N 0 160 + 110976 = N 2 160 + 111168 = N 1 0 + 111168 = N 5 0 + 111360 = N 2 256 + 111648 = N 1 0 + 111648 = N 5 0 + 111840 = N 0 0 + 112128 = N 2 160 + 112512 = N 1 208 + 112992 = N 2 0 + 113184 = N 1 0 + 113664 = N 0 160 + 114048 = N 2 160 + 114240 = N 1 0 + 114240 = N 5 0 + 114432 = N 2 256 + 114720 = N 1 160 + 114720 = N 5 0 + 114912 = N 0 256 + 114912 = S 2 1344 + 115200 = N 1 160 + 115200 = N 5 0 + 115584 = N 2 448 + 116448 = N 1 0 + 116640 = N 2 0 + 116736 = N 0 160 + 117120 = N 2 160 + 117600 = N 1 0 + 117792 = N 0 0 + 117984 = N 1 256 + 118272 = N 2 160 + 118656 = N 2 448 + 119136 = N 0 0 + 119520 = N 1 0 + 119712 = N 2 0 + 119808 = N 1 160 + 120192 = N 1 160 + 120384 = N 0 0 + 120384 = N 5 0 + 120576 = N 2 144 + 120864 = N 1 0 + 121056 = N 0 960 + 122208 = N 0 0 + 122208 = N 6 0 + 122400 = N 2 0 + 122400 = N 6 0 + 122592 = N 2 0 + 122592 = N 6 0 + 122784 = N 0 0 + 122784 = N 6 0 + 122976 = N 2 0 + 122976 = N 6 0 + 123168 = N 2 0 + 123168 = N 6 0 + 123360 = N 0 0 + 123360 = N 6 0 + 123552 = N 2 0 + 123552 = N 6 0 + 123744 = N 2 0 + 123744 = N 6 0 + 123936 = N 0 0 + 123936 = N 6 0 + 124128 = N 1 0 + 124128 = N 6 0 + 124320 = N 2 0 + 124320 = N 6 0 + 124512 = N 2 0 + 124512 = N 6 0 + 124704 = N 1 0 + 124704 = N 6 0 + 124896 = N 2 0 + 124896 = N 6 0 + 125088 = N 2 0 + 125088 = N 6 0 + 125280 = N 0 0 + 125280 = N 6 0 + 125472 = N 2 0 + 125472 = N 6 0 + 125664 = N 2 0 + 125664 = N 6 0 + 125856 = N 0 0 + 125856 = N 6 0 + 126048 = N 2 0 + 126048 = N 6 0 + 126240 = N 2 0 + 126240 = N 6 0 + 126432 = N 1 0 + 126432 = N 6 0 + 126624 = N 2 0 + 126624 = N 6 0 + 126816 = N 2 0 + 126816 = N 6 0 + 127008 = N 1 0 + 127008 = N 6 0 + 127104 = S 2 1536 + 127200 = N 0 352 + 127584 = N 0 352 + 127968 = N 0 256 + 128352 = N 1 352 + 128736 = N 1 352 + 129120 = N 1 352 + 129504 = N 1 352 + 129888 = N 1 288 + 130272 = N 0 352 + 130656 = N 0 352 + 131040 = N 0 256 + 131424 = N 1 352 + 131808 = N 1 352 + 132192 = N 1 352 + 132576 = N 1 352 + 132960 = N 1 256 + 133344 = N 2 352 + 133728 = N 2 256 + 134112 = N 1 256 + 134496 = N 0 0 + 134592 = N 0 256 + 134880 = N 0 0 + 135264 = N 1 0 + 135456 = N 1 160 + 135648 = N 2 160 + 135840 = N 1 0 + 136032 = N 2 0 + 136224 = N 2 160 + 136416 = N 1 352 + 136800 = N 1 352 + 137184 = N 1 256 + 137568 = N 0 352 + 137952 = N 0 256 + 138336 = N 0 352 + 138720 = N 1 256 + 139104 = N 2 352 + 139488 = N 1 256 + 139488 = S 2 960 + 139488 = E solo + 139776 = N 2 160 + 139776 = N 5 0 + 139968 = N 1 352 + 140352 = N 0 0 + 140352 = N 5 0 + 140640 = N 2 192 + 141024 = N 0 0 + 141216 = N 0 0 + 141408 = N 1 0 + 141600 = N 2 0 + 141792 = N 1 0 + 141984 = N 0 0 + 142176 = N 2 352 + 142560 = N 1 160 + 142848 = N 0 160 + 143040 = N 2 128 + 143200 = N 1 192 + 143424 = N 0 160 + 143616 = N 1 160 + 143616 = N 5 0 + 143904 = N 0 480 + 144672 = N 1 0 + 144864 = N 2 352 + 145248 = N 1 160 + 145248 = N 5 0 + 145440 = N 0 0 + 145632 = N 1 256 + 145920 = N 2 352 + 146400 = N 0 352 + 146784 = N 2 0 + 147072 = N 1 160 + 147264 = N 0 192 + 147264 = N 5 0 + 147552 = N 1 0 + 147744 = N 0 0 + 147936 = N 1 0 + 148128 = N 1 0 + 148320 = N 2 0 + 148512 = N 1 0 + 148704 = N 1 256 + 148992 = N 2 352 + 149472 = N 1 256 + 149856 = N 1 0 + 150048 = N 3 0 + 150144 = N 2 160 + 150336 = N 1 288 + 150336 = N 5 0 + 150816 = N 0 0 + 150912 = N 2 256 + 151296 = N 0 160 + 151584 = N 1 0 + 151776 = N 2 352 + 152160 = N 1 0 + 152160 = N 5 0 + 152352 = E soloend +} +[ExpertDoubleBass] +{ + 4608 = N 3 0 + 4608 = S 2 1920 + 5088 = N 4 0 + 5280 = N 0 0 + 5568 = N 2 256 + 5856 = N 1 112 + 6000 = N 1 112 + 6144 = N 3 112 + 6288 = N 3 0 + 6432 = N 3 0 + 7680 = N 1 192 + 7968 = N 2 192 + 8256 = N 3 928 + 9216 = N 4 192 + 9504 = N 4 256 + 9792 = N 3 0 + 9840 = N 2 0 + 9888 = N 1 288 + 10272 = N 0 0 + 10368 = N 1 0 + 10464 = N 3 0 + 10560 = N 2 0 + 10656 = N 3 0 + 10752 = N 4 192 + 11040 = N 0 0 + 11136 = N 2 0 + 11232 = N 3 0 + 11328 = N 4 0 + 11424 = N 2 0 + 11616 = N 0 0 + 11808 = N 1 256 + 12096 = N 0 0 + 12144 = N 1 0 + 12192 = N 2 0 + 12240 = N 3 0 + 12288 = N 4 192 + 12576 = N 4 0 + 12672 = N 4 160 + 12864 = N 3 0 + 12912 = N 2 0 + 12960 = N 1 288 + 13344 = N 0 0 + 13440 = N 1 0 + 13536 = N 3 0 + 13632 = N 2 0 + 13728 = N 3 0 + 13824 = N 4 192 + 14112 = N 0 0 + 14304 = N 3 0 + 14400 = N 4 0 + 14496 = N 2 0 + 14688 = N 0 0 + 14880 = N 1 448 + 15360 = N 3 256 + 15648 = N 4 288 + 16032 = N 1 736 + 16800 = N 1 0 + 16848 = N 0 0 + 16896 = N 3 256 + 17184 = N 1 160 + 17376 = N 4 0 + 17472 = N 2 0 + 17568 = N 0 736 + 18336 = N 1 0 + 18336 = S 2 864 + 18384 = N 2 0 + 18432 = N 3 256 + 18720 = N 4 288 + 19104 = N 2 832 + 19968 = N 3 256 + 20256 = N 1 352 + 20640 = N 0 768 + 21984 = N 2 0 + 22080 = N 1 160 + 22272 = N 0 160 + 22464 = N 3 0 + 22560 = N 4 0 + 22656 = N 2 0 + 22752 = N 1 0 + 22848 = N 0 0 + 22944 = N 2 0 + 23040 = N 2 160 + 23232 = N 3 0 + 23328 = N 4 0 + 23424 = N 3 0 + 23520 = N 2 0 + 23616 = N 1 160 + 23808 = N 2 0 + 23904 = N 4 0 + 24000 = N 2 0 + 24096 = N 3 0 + 24192 = N 1 256 + 24480 = N 2 448 + 24960 = N 3 160 + 25152 = N 0 160 + 25344 = N 2 0 + 25440 = N 2 0 + 25632 = N 1 0 + 25728 = N 1 160 + 25920 = N 3 0 + 26016 = N 4 0 + 26112 = N 2 0 + 26208 = N 1 0 + 26304 = N 1 160 + 26496 = N 0 0 + 26688 = N 2 0 + 26880 = N 0 160 + 27072 = N 3 0 + 27168 = N 3 0 + 27264 = N 0 0 + 27360 = N 0 0 + 27456 = N 1 160 + 27648 = N 0 160 + 27840 = N 3 0 + 27936 = N 4 0 + 28032 = N 2 0 + 28128 = N 1 0 + 28224 = N 0 0 + 28320 = N 2 0 + 28416 = N 2 160 + 28608 = N 3 0 + 28704 = N 4 0 + 28800 = N 3 0 + 28896 = N 2 0 + 28992 = N 1 160 + 29184 = N 2 0 + 29280 = N 4 0 + 29376 = N 2 0 + 29472 = N 3 0 + 29568 = N 1 256 + 29856 = N 2 448 + 30336 = N 3 160 + 30528 = N 0 160 + 30720 = N 2 0 + 30816 = N 2 0 + 31008 = N 1 0 + 31104 = N 1 160 + 31104 = S 2 1344 + 31296 = N 3 0 + 31392 = N 4 0 + 31488 = N 2 0 + 31584 = N 1 0 + 31680 = N 0 160 + 31872 = N 1 0 + 32064 = N 2 0 + 32256 = N 3 0 + 32736 = N 4 0 + 32928 = N 0 0 + 33792 = N 2 256 + 34080 = N 3 544 + 34656 = N 4 352 + 35040 = N 0 160 + 35232 = N 1 160 + 35424 = N 2 160 + 35616 = N 3 256 + 35904 = N 4 0 + 35952 = N 4 0 + 36000 = N 3 0 + 36000 = N 5 0 + 36048 = N 3 0 + 36144 = N 1 256 + 36432 = N 0 496 + 36960 = N 2 256 + 37248 = N 3 256 + 37536 = N 4 0 + 37584 = N 4 0 + 37632 = N 3 0 + 37632 = N 5 0 + 37680 = N 3 0 + 37776 = N 1 256 + 38064 = N 1 304 + 38400 = N 0 160 + 38592 = N 2 0 + 38640 = N 2 112 + 38784 = N 3 256 + 39072 = N 4 0 + 39120 = N 4 0 + 39168 = N 3 0 + 39168 = N 5 0 + 39216 = N 3 0 + 39360 = N 1 576 + 40032 = N 0 288 + 40368 = N 2 1488 + 41952 = N 1 1504 + 43488 = N 2 1504 + 45024 = N 0 1504 + 45024 = S 2 480 + 46560 = N 1 160 + 46752 = N 3 0 + 46848 = N 3 0 + 46944 = N 0 0 + 47040 = N 0 0 + 47136 = N 2 160 + 47328 = N 1 160 + 47520 = N 4 0 + 47616 = N 4 0 + 47712 = N 3 160 + 47904 = N 2 160 + 48096 = N 1 160 + 48288 = N 3 0 + 48384 = N 3 0 + 48480 = N 0 0 + 48576 = N 0 0 + 48672 = N 2 160 + 48864 = N 1 0 + 48960 = N 1 0 + 49056 = N 4 0 + 49152 = N 4 0 + 49248 = N 3 160 + 49440 = N 2 160 + 49632 = N 0 160 + 49824 = N 3 0 + 49920 = N 3 0 + 50112 = N 0 0 + 50208 = N 3 160 + 50400 = N 0 160 + 50592 = N 3 0 + 50688 = N 0 0 + 50784 = N 1 160 + 50976 = N 4 0 + 51072 = N 1 0 + 51168 = N 0 160 + 51360 = N 4 112 + 51504 = N 3 112 + 51648 = N 2 112 + 51792 = N 3 112 + 51936 = N 2 0 + 52032 = N 2 0 + 52128 = N 0 0 + 52224 = N 4 0 + 52320 = N 3 160 + 52512 = N 4 0 + 52608 = N 0 0 + 52704 = N 1 160 + 52896 = N 3 0 + 52992 = N 3 0 + 53088 = N 0 0 + 53184 = N 0 0 + 53280 = N 2 160 + 53472 = N 1 160 + 53664 = N 4 0 + 53760 = N 4 0 + 53856 = N 3 160 + 54048 = N 2 160 + 54240 = N 1 160 + 54432 = N 3 0 + 54528 = N 3 0 + 54624 = N 0 0 + 54720 = N 0 0 + 54816 = N 2 160 + 55008 = N 1 160 + 55200 = N 4 0 + 55296 = N 4 0 + 55392 = N 3 160 + 55584 = N 2 160 + 55776 = N 0 160 + 55968 = N 3 0 + 56064 = N 3 0 + 56256 = N 0 0 + 56352 = N 3 160 + 56544 = N 0 160 + 56736 = N 3 0 + 56832 = N 3 0 + 56928 = N 1 160 + 57120 = N 4 0 + 57216 = N 1 0 + 57312 = N 0 160 + 57504 = N 3 0 + 57600 = N 3 0 + 57792 = N 0 0 + 57888 = N 3 160 + 58080 = N 0 160 + 58272 = N 3 0 + 58368 = N 0 0 + 58464 = N 1 160 + 58656 = N 4 0 + 58752 = N 1 0 + 58848 = N 2 144 + 58848 = S 2 1632 + 59040 = N 4 0 + 59088 = N 4 0 + 59184 = N 3 144 + 59424 = N 3 0 + 59472 = N 1 144 + 59760 = N 2 0 + 59808 = N 3 144 + 60096 = N 3 0 + 60144 = N 3 144 + 60384 = N 3 0 + 60432 = N 0 144 + 60720 = N 2 0 + 60768 = N 1 144 + 61008 = N 1 0 + 61056 = N 0 144 + 61392 = N 3 144 + 61680 = N 1 144 + 61968 = N 2 0 + 62016 = N 0 144 + 62352 = N 3 144 + 62640 = N 1 0 + 62736 = N 2 0 + 62832 = N 3 0 + 62928 = N 4 0 + 63024 = N 1 0 + 63216 = N 2 0 + 63264 = N 0 0 + 63456 = N 4 0 + 63504 = N 4 0 + 63600 = N 3 0 + 63696 = N 4 0 + 63744 = N 1 144 + 63984 = N 4 0 + 64080 = N 1 0 + 64176 = N 2 0 + 64224 = N 0 144 + 64512 = N 4 0 + 64560 = N 3 144 + 64800 = N 4 0 + 64848 = N 0 144 + 65136 = N 1 0 + 65184 = N 2 144 + 65424 = N 2 0 + 65472 = N 0 144 + 65712 = N 4 0 + 65760 = N 4 0 + 65808 = N 3 144 + 66048 = N 4 0 + 66096 = N 1 144 + 66384 = N 2 0 + 66432 = N 0 144 + 66672 = N 4 0 + 66768 = N 3 144 + 67056 = N 1 0 + 67152 = N 2 0 + 67248 = N 3 0 + 67344 = N 4 0 + 67440 = N 1 0 + 67632 = N 2 0 + 67680 = N 0 144 + 67872 = N 4 0 + 67920 = N 4 0 + 68016 = N 3 144 + 68256 = N 3 0 + 68304 = N 1 144 + 68592 = N 2 0 + 68640 = N 3 144 + 68928 = N 3 0 + 68976 = N 3 144 + 69216 = N 3 0 + 69264 = N 0 144 + 69552 = N 2 0 + 69600 = N 1 144 + 69840 = N 1 0 + 69888 = N 0 144 + 70224 = N 3 144 + 70512 = N 1 144 + 70800 = N 2 0 + 70848 = N 0 144 + 71184 = N 3 144 + 71472 = N 1 0 + 71568 = N 2 0 + 71664 = N 3 0 + 71760 = N 4 0 + 71856 = N 1 0 + 72048 = N 2 0 + 72096 = N 0 144 + 72096 = S 2 1440 + 72288 = N 4 0 + 72336 = N 4 0 + 72432 = N 3 0 + 72528 = N 4 0 + 72576 = N 1 144 + 72816 = N 4 0 + 72912 = N 1 0 + 73008 = N 2 0 + 73056 = N 0 144 + 73344 = N 4 0 + 73392 = N 3 144 + 73632 = N 4 0 + 73680 = N 0 144 + 73968 = N 1 0 + 74016 = N 2 144 + 74256 = N 2 0 + 74304 = N 0 144 + 74544 = N 4 0 + 74592 = N 4 0 + 74640 = N 3 144 + 74880 = N 4 0 + 74928 = N 1 144 + 75216 = N 2 0 + 75264 = N 0 144 + 75504 = N 4 0 + 75600 = N 3 144 + 75888 = N 1 0 + 75984 = N 2 0 + 76080 = N 3 0 + 76176 = N 4 0 + 76272 = N 1 0 + 76464 = N 2 0 + 76512 = N 0 144 + 76704 = N 3 0 + 76752 = N 1 0 + 76848 = N 2 0 + 76944 = N 3 0 + 76992 = N 0 0 + 77232 = N 3 0 + 77328 = N 0 0 + 77424 = N 2 0 + 77472 = N 0 0 + 77616 = N 0 0 + 77712 = N 2 0 + 77760 = N 0 0 + 77904 = N 0 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78096 = N 1 0 + 78144 = N 2 0 + 78192 = N 0 0 + 78240 = N 4 0 + 78288 = N 3 0 + 78336 = N 2 0 + 78384 = N 1 0 + 78432 = N 0 144 + 78672 = N 1 0 + 78768 = N 2 0 + 78864 = N 3 0 + 78912 = N 0 0 + 79008 = N 1 208 + 79248 = N 2 256 + 79536 = N 3 208 + 79776 = N 0 384 + 80544 = N 2 0 + 80592 = N 2 0 + 80688 = N 3 0 + 80832 = N 4 0 + 81120 = N 1 0 + 81168 = N 1 0 + 81264 = N 1 0 + 81456 = N 2 0 + 81744 = N 0 0 + 82032 = N 2 0 + 82224 = N 3 0 + 82368 = N 3 0 + 82416 = N 3 0 + 82464 = N 4 0 + 82560 = N 1 0 + 82608 = N 2 0 + 82704 = N 2 256 + 82992 = N 3 192 + 83280 = N 4 336 + 83808 = N 0 288 + 83808 = S 2 2112 + 84192 = N 0 288 + 84576 = N 0 288 + 84960 = N 3 0 + 85008 = N 4 112 + 85152 = N 1 160 + 85344 = N 2 0 + 85440 = N 3 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85824 = N 0 0 + 86112 = N 0 0 + 86256 = N 0 0 + 86400 = N 0 0 + 86496 = N 1 0 + 86640 = N 1 0 + 86784 = N 3 0 + 86928 = N 3 0 + 87072 = N 1 0 + 87120 = N 2 0 + 87168 = N 3 0 + 87216 = N 2 0 + 87312 = N 2 192 + 87600 = N 3 192 + 87888 = N 4 336 + 88416 = N 0 288 + 88800 = N 0 288 + 89184 = N 0 288 + 89568 = N 3 0 + 89616 = N 4 112 + 89760 = N 1 160 + 89952 = N 2 0 + 90048 = N 3 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90432 = N 0 144 + 90720 = N 0 0 + 90864 = N 0 0 + 91008 = N 0 0 + 91104 = N 1 0 + 91248 = N 1 0 + 91392 = N 3 0 + 91536 = N 3 0 + 91680 = N 2 0 + 91824 = N 1 0 + 91872 = N 0 1504 + 93408 = N 1 544 + 93984 = N 4 928 + 94944 = N 3 3040 + 98016 = N 0 1504 + 99552 = N 1 544 + 100128 = N 4 928 + 101088 = N 3 3040 + 104160 = N 3 0 + 104160 = S 2 2016 + 104640 = N 4 0 + 104832 = N 0 0 + 105120 = N 0 256 + 105408 = N 1 112 + 105552 = N 2 112 + 105696 = N 3 112 + 105840 = N 3 0 + 105984 = N 3 0 + 106080 = N 3 352 + 106464 = N 2 160 + 106656 = N 2 160 + 106848 = N 0 160 + 107040 = N 2 160 + 107232 = N 1 192 + 107520 = N 2 192 + 107808 = N 3 928 + 108768 = N 4 192 + 109056 = N 4 256 + 109344 = N 3 0 + 109392 = N 2 0 + 109440 = N 1 288 + 109824 = N 0 0 + 109920 = N 1 0 + 110016 = N 3 0 + 110112 = N 2 0 + 110208 = N 3 0 + 110304 = N 4 192 + 110592 = N 0 0 + 110688 = N 2 0 + 110784 = N 3 0 + 110880 = N 4 0 + 110976 = N 2 0 + 111168 = N 0 0 + 111360 = N 1 256 + 111648 = N 0 0 + 111696 = N 1 0 + 111744 = N 2 0 + 111792 = N 3 0 + 111840 = N 4 192 + 112128 = N 4 0 + 112224 = N 4 160 + 112416 = N 3 0 + 112464 = N 2 0 + 112512 = N 1 256 + 112896 = N 0 0 + 112992 = N 1 0 + 113088 = N 3 0 + 113184 = N 2 0 + 113280 = N 3 0 + 113376 = N 4 192 + 113664 = N 0 0 + 113856 = N 3 0 + 113952 = N 4 0 + 114048 = N 2 0 + 114240 = N 0 0 + 114432 = N 1 448 + 114912 = N 3 256 + 115200 = N 4 288 + 115584 = N 1 736 + 116352 = N 1 0 + 116400 = N 0 0 + 116448 = N 3 256 + 116448 = S 2 1152 + 116736 = N 1 160 + 116928 = N 4 0 + 117024 = N 2 0 + 117120 = N 0 736 + 117888 = N 1 0 + 117936 = N 2 0 + 117984 = N 3 256 + 118272 = N 4 288 + 118656 = N 2 832 + 119520 = N 3 256 + 119808 = N 1 352 + 120192 = N 0 768 + 121056 = N 3 928 + 122016 = N 4 160 + 122208 = N 1 1120 + 123360 = N 1 736 + 124128 = N 3 928 + 125088 = N 4 160 + 125280 = N 1 1120 + 126432 = N 1 736 + 127200 = N 3 928 + 127200 = S 2 2976 + 128160 = N 4 160 + 128352 = N 1 1120 + 129504 = N 1 736 + 130272 = N 3 928 + 131232 = N 4 160 + 131424 = N 1 1120 + 132576 = N 1 736 + 133344 = N 2 928 + 134304 = N 0 160 + 134496 = N 1 1888 + 136416 = N 2 928 + 137376 = N 0 160 + 137568 = N 1 1888 + 139488 = N 3 928 + 140448 = N 4 160 + 140640 = N 1 1120 + 141792 = N 1 736 + 142560 = N 3 928 + 143520 = N 4 160 + 143712 = N 1 1120 + 144864 = N 1 736 + 145632 = N 2 928 + 146592 = N 0 160 + 146784 = N 1 1888 + 148704 = N 2 928 + 149664 = N 0 160 + 149856 = N 1 1696 + 151584 = N 2 0 + 151680 = N 3 0 + 151776 = N 4 384 +} +[HardDoubleBass] +{ + 4608 = N 3 0 + 4608 = S 2 1920 + 5088 = N 4 0 + 5280 = N 0 0 + 5568 = N 2 256 + 5856 = N 1 112 + 6000 = N 1 112 + 6144 = N 3 112 + 6288 = N 3 0 + 6432 = N 3 0 + 7680 = N 1 192 + 7968 = N 2 192 + 8256 = N 3 928 + 9216 = N 4 192 + 9504 = N 4 256 + 9792 = N 3 0 + 9888 = N 1 288 + 10272 = N 0 0 + 10368 = N 1 0 + 10464 = N 3 0 + 10560 = N 2 0 + 10656 = N 3 0 + 10752 = N 4 192 + 11040 = N 0 0 + 11136 = N 2 0 + 11232 = N 3 0 + 11328 = N 4 0 + 11424 = N 2 0 + 11616 = N 0 0 + 11808 = N 1 256 + 12096 = N 2 0 + 12192 = N 3 0 + 12288 = N 4 192 + 12576 = N 4 0 + 12672 = N 4 160 + 12864 = N 3 0 + 12960 = N 1 288 + 13344 = N 0 0 + 13440 = N 1 0 + 13536 = N 3 0 + 13632 = N 2 0 + 13728 = N 3 0 + 13824 = N 4 192 + 14112 = N 0 0 + 14304 = N 3 0 + 14400 = N 4 0 + 14496 = N 2 0 + 14688 = N 0 0 + 14880 = N 1 448 + 15360 = N 3 256 + 15648 = N 4 288 + 16032 = N 1 736 + 16800 = N 1 0 + 16896 = N 3 256 + 17184 = N 1 160 + 17376 = N 4 0 + 17472 = N 2 0 + 17568 = N 0 736 + 18336 = N 1 0 + 18336 = S 2 864 + 18432 = N 3 256 + 18720 = N 4 288 + 19104 = N 2 832 + 19968 = N 3 256 + 20256 = N 1 352 + 20640 = N 0 768 + 21984 = N 2 0 + 22080 = N 1 160 + 22272 = N 0 160 + 22464 = N 3 0 + 22560 = N 4 0 + 22656 = N 2 0 + 22752 = N 1 0 + 22848 = N 0 0 + 23040 = N 2 160 + 23232 = N 3 0 + 23328 = N 4 0 + 23424 = N 3 0 + 23520 = N 2 0 + 23616 = N 1 160 + 23808 = N 2 0 + 23904 = N 4 0 + 24000 = N 2 0 + 24096 = N 3 0 + 24192 = N 1 256 + 24480 = N 2 448 + 24960 = N 3 160 + 25152 = N 0 160 + 25344 = N 2 0 + 25440 = N 2 0 + 25632 = N 1 0 + 25728 = N 1 160 + 25920 = N 3 0 + 26016 = N 4 0 + 26112 = N 2 0 + 26304 = N 1 160 + 26496 = N 0 0 + 26688 = N 2 0 + 26880 = N 0 160 + 27072 = N 3 0 + 27264 = N 0 0 + 27456 = N 1 160 + 27648 = N 0 160 + 27840 = N 3 0 + 27936 = N 4 0 + 28032 = N 2 0 + 28128 = N 1 0 + 28224 = N 0 0 + 28416 = N 2 160 + 28608 = N 3 0 + 28704 = N 4 0 + 28800 = N 3 0 + 28896 = N 2 0 + 28992 = N 1 160 + 29184 = N 2 0 + 29280 = N 4 0 + 29376 = N 2 0 + 29472 = N 3 0 + 29568 = N 1 256 + 29856 = N 2 448 + 30336 = N 3 160 + 30528 = N 0 160 + 30720 = N 2 0 + 30816 = N 2 0 + 31008 = N 1 0 + 31104 = N 1 160 + 31104 = S 2 1344 + 31296 = N 3 0 + 31392 = N 4 0 + 31488 = N 2 0 + 31584 = N 1 0 + 31680 = N 0 160 + 31872 = N 1 0 + 32064 = N 2 0 + 32256 = N 3 0 + 32736 = N 4 0 + 32928 = N 0 0 + 33792 = N 2 256 + 34080 = N 3 544 + 34656 = N 4 352 + 35040 = N 0 160 + 35232 = N 1 160 + 35424 = N 2 160 + 35616 = N 3 256 + 35904 = N 4 0 + 36000 = N 3 0 + 36144 = N 1 256 + 36432 = N 0 496 + 36960 = N 2 256 + 37248 = N 3 256 + 37536 = N 4 0 + 37632 = N 3 0 + 37776 = N 1 256 + 38064 = N 1 304 + 38400 = N 0 160 + 38592 = N 2 0 + 38784 = N 3 256 + 39072 = N 4 0 + 39168 = N 3 0 + 39360 = N 1 576 + 40032 = N 0 288 + 40368 = N 2 1488 + 41952 = N 1 1504 + 43488 = N 2 1504 + 45024 = N 0 1504 + 45024 = S 2 480 + 46560 = N 1 160 + 46752 = N 3 0 + 46944 = N 0 0 + 47136 = N 2 160 + 47328 = N 1 160 + 47520 = N 4 0 + 47712 = N 3 160 + 47904 = N 2 160 + 48096 = N 1 160 + 48288 = N 3 0 + 48480 = N 0 0 + 48672 = N 2 160 + 48864 = N 1 0 + 49056 = N 4 0 + 49248 = N 3 160 + 49440 = N 2 160 + 49632 = N 0 160 + 49824 = N 3 0 + 49920 = N 3 0 + 50112 = N 0 0 + 50208 = N 3 160 + 50400 = N 0 160 + 50592 = N 3 0 + 50784 = N 1 160 + 50976 = N 4 0 + 51168 = N 0 160 + 51360 = N 4 112 + 51504 = N 3 112 + 51648 = N 2 112 + 51792 = N 3 112 + 51936 = N 2 0 + 52128 = N 0 0 + 52224 = N 4 0 + 52320 = N 3 160 + 52512 = N 4 0 + 52704 = N 1 160 + 52896 = N 3 0 + 53088 = N 0 0 + 53280 = N 2 160 + 53472 = N 1 160 + 53664 = N 4 0 + 53856 = N 3 160 + 54048 = N 2 160 + 54240 = N 1 160 + 54432 = N 3 0 + 54624 = N 0 0 + 54816 = N 2 160 + 55008 = N 1 160 + 55200 = N 4 0 + 55392 = N 3 160 + 55584 = N 2 160 + 55776 = N 0 160 + 55968 = N 3 0 + 56064 = N 3 0 + 56256 = N 0 0 + 56352 = N 3 160 + 56544 = N 0 160 + 56736 = N 3 0 + 56928 = N 1 160 + 57120 = N 4 0 + 57312 = N 0 160 + 57504 = N 3 0 + 57600 = N 3 0 + 57792 = N 0 0 + 57888 = N 3 160 + 58080 = N 0 160 + 58272 = N 3 0 + 58464 = N 1 160 + 58656 = N 4 0 + 58752 = N 1 0 + 58848 = N 2 144 + 58848 = S 2 1632 + 59040 = N 4 0 + 59184 = N 3 144 + 59472 = N 1 144 + 59808 = N 3 144 + 60144 = N 3 144 + 60432 = N 1 144 + 60768 = N 2 144 + 61056 = N 0 144 + 61392 = N 3 144 + 61680 = N 1 144 + 62016 = N 0 144 + 62352 = N 2 144 + 62640 = N 1 0 + 62736 = N 2 0 + 62832 = N 3 0 + 62928 = N 4 0 + 63024 = N 1 0 + 63264 = N 0 0 + 63456 = N 4 0 + 63600 = N 3 0 + 63744 = N 1 144 + 63984 = N 4 0 + 64080 = N 1 0 + 64224 = N 0 144 + 64560 = N 3 144 + 64848 = N 1 144 + 65184 = N 2 144 + 65472 = N 0 144 + 65712 = N 4 0 + 65808 = N 3 144 + 66096 = N 1 144 + 66432 = N 0 144 + 66672 = N 4 0 + 66768 = N 3 144 + 67056 = N 1 0 + 67152 = N 2 0 + 67248 = N 3 0 + 67344 = N 4 0 + 67440 = N 1 0 + 67680 = N 0 144 + 67920 = N 4 0 + 68016 = N 3 144 + 68304 = N 1 144 + 68640 = N 3 144 + 68976 = N 3 144 + 69264 = N 1 144 + 69600 = N 2 144 + 69888 = N 0 144 + 70224 = N 3 144 + 70512 = N 1 144 + 70848 = N 0 144 + 71184 = N 3 144 + 71472 = N 1 0 + 71568 = N 2 0 + 71664 = N 3 0 + 71856 = N 1 0 + 72096 = N 0 144 + 72096 = S 2 1440 + 72336 = N 4 0 + 72432 = N 3 0 + 72576 = N 1 144 + 72816 = N 4 0 + 72912 = N 1 0 + 73056 = N 0 144 + 73392 = N 3 144 + 73680 = N 1 144 + 74016 = N 2 144 + 74304 = N 0 144 + 74544 = N 4 0 + 74640 = N 3 144 + 74928 = N 1 144 + 75264 = N 0 144 + 75504 = N 4 0 + 75600 = N 2 144 + 75888 = N 1 0 + 75984 = N 2 0 + 76080 = N 3 0 + 76176 = N 4 0 + 76272 = N 1 0 + 76512 = N 0 144 + 76752 = N 1 0 + 76848 = N 2 0 + 76992 = N 0 0 + 77232 = N 3 0 + 77328 = N 0 0 + 77424 = N 2 0 + 77616 = N 0 0 + 77712 = N 2 0 + 77904 = N 0 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78144 = N 2 0 + 78240 = N 4 0 + 78288 = N 3 0 + 78336 = N 2 0 + 78384 = N 1 0 + 78432 = N 0 144 + 78672 = N 1 0 + 78768 = N 2 0 + 78912 = N 0 0 + 79008 = N 1 208 + 79248 = N 2 256 + 79536 = N 3 208 + 79776 = N 0 384 + 80544 = N 2 0 + 80688 = N 3 0 + 80832 = N 4 0 + 81120 = N 1 0 + 81264 = N 1 0 + 81456 = N 2 0 + 81744 = N 0 0 + 82032 = N 2 0 + 82224 = N 3 0 + 82368 = N 3 0 + 82464 = N 4 0 + 82608 = N 2 0 + 82704 = N 2 256 + 82992 = N 3 192 + 83280 = N 4 336 + 83808 = N 0 288 + 83808 = S 2 2112 + 84192 = N 0 288 + 84576 = N 0 288 + 84960 = N 4 160 + 85152 = N 1 160 + 85344 = N 2 0 + 85440 = N 3 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85824 = N 0 0 + 86112 = N 0 0 + 86256 = N 0 0 + 86400 = N 0 0 + 86496 = N 1 0 + 86640 = N 1 0 + 86784 = N 3 0 + 86928 = N 3 0 + 87072 = N 1 0 + 87168 = N 3 0 + 87216 = N 2 0 + 87312 = N 2 192 + 87600 = N 3 192 + 87888 = N 4 336 + 88416 = N 0 288 + 88800 = N 0 288 + 89184 = N 0 288 + 89568 = N 4 160 + 89760 = N 1 160 + 89952 = N 2 0 + 90048 = N 3 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90432 = N 0 144 + 90720 = N 0 0 + 90864 = N 0 0 + 91008 = N 0 0 + 91104 = N 1 0 + 91248 = N 1 0 + 91392 = N 3 0 + 91536 = N 3 0 + 91680 = N 2 0 + 91872 = N 0 1504 + 93408 = N 1 544 + 93984 = N 4 928 + 94944 = N 3 3040 + 98016 = N 0 1504 + 99552 = N 1 544 + 100128 = N 4 928 + 101088 = N 3 3040 + 104160 = N 3 0 + 104160 = S 2 2016 + 104640 = N 4 0 + 104832 = N 0 0 + 105120 = N 0 256 + 105408 = N 1 112 + 105552 = N 2 112 + 105696 = N 3 112 + 105840 = N 3 0 + 105984 = N 3 0 + 106080 = N 3 352 + 106464 = N 2 160 + 106656 = N 2 160 + 106848 = N 0 160 + 107040 = N 2 160 + 107232 = N 1 192 + 107520 = N 2 192 + 107808 = N 3 928 + 108768 = N 4 192 + 109056 = N 4 256 + 109344 = N 3 0 + 109440 = N 1 288 + 109824 = N 0 0 + 109920 = N 1 0 + 110016 = N 3 0 + 110112 = N 2 0 + 110208 = N 3 0 + 110304 = N 4 192 + 110592 = N 0 0 + 110688 = N 2 0 + 110784 = N 3 0 + 110880 = N 4 0 + 110976 = N 2 0 + 111168 = N 0 0 + 111360 = N 1 256 + 111648 = N 2 0 + 111744 = N 3 0 + 111840 = N 4 192 + 112128 = N 4 0 + 112224 = N 4 160 + 112416 = N 3 0 + 112512 = N 1 256 + 112896 = N 0 0 + 112992 = N 1 0 + 113088 = N 3 0 + 113184 = N 2 0 + 113280 = N 3 0 + 113376 = N 4 192 + 113664 = N 0 0 + 113856 = N 3 0 + 113952 = N 4 0 + 114048 = N 2 0 + 114240 = N 0 0 + 114432 = N 1 448 + 114912 = N 3 256 + 115200 = N 4 288 + 115584 = N 1 736 + 116352 = N 1 0 + 116400 = N 0 0 + 116448 = N 3 256 + 116448 = S 2 1152 + 116736 = N 1 160 + 116928 = N 4 0 + 117024 = N 2 0 + 117120 = N 0 736 + 117888 = N 1 0 + 117984 = N 3 256 + 118272 = N 4 288 + 118656 = N 2 832 + 119520 = N 3 256 + 119808 = N 1 352 + 120192 = N 0 768 + 121056 = N 3 928 + 122016 = N 4 160 + 122208 = N 1 1120 + 123360 = N 1 736 + 124128 = N 3 928 + 125088 = N 4 160 + 125280 = N 1 1120 + 126432 = N 1 736 + 127200 = N 3 928 + 127200 = S 2 2976 + 128160 = N 4 160 + 128352 = N 1 1120 + 129504 = N 1 736 + 130272 = N 3 928 + 131232 = N 4 160 + 131424 = N 1 1120 + 132576 = N 1 736 + 133344 = N 2 928 + 134304 = N 0 160 + 134496 = N 1 1888 + 136416 = N 2 928 + 137376 = N 0 160 + 137568 = N 1 1888 + 139488 = N 3 928 + 140448 = N 4 160 + 140640 = N 1 1120 + 141792 = N 1 736 + 142560 = N 3 928 + 143520 = N 4 160 + 143712 = N 1 1120 + 144864 = N 1 736 + 145632 = N 2 928 + 146592 = N 0 160 + 146784 = N 1 1888 + 148704 = N 2 928 + 149664 = N 0 160 + 149856 = N 1 1696 + 151584 = N 2 0 + 151680 = N 3 0 + 151776 = N 4 384 +} +[MediumDoubleBass] +{ + 4608 = N 2 0 + 4608 = S 2 1920 + 5088 = N 3 0 + 5280 = N 0 0 + 5568 = N 2 256 + 5856 = N 1 112 + 6000 = N 1 112 + 6144 = N 2 112 + 6288 = N 2 0 + 6432 = N 2 0 + 7680 = N 0 192 + 7968 = N 1 192 + 8256 = N 2 928 + 9216 = N 3 192 + 9504 = N 3 256 + 9792 = N 2 0 + 9888 = N 1 288 + 10272 = N 0 0 + 10368 = N 1 0 + 10560 = N 2 0 + 10752 = N 3 192 + 11040 = N 0 0 + 11136 = N 2 0 + 11328 = N 3 0 + 11424 = N 2 0 + 11616 = N 0 0 + 11808 = N 1 256 + 12096 = N 2 0 + 12288 = N 3 192 + 12576 = N 3 0 + 12672 = N 3 160 + 12864 = N 2 0 + 12960 = N 1 288 + 13344 = N 0 0 + 13440 = N 1 0 + 13632 = N 2 0 + 13824 = N 3 192 + 14112 = N 0 0 + 14400 = N 3 0 + 14496 = N 2 0 + 14688 = N 0 0 + 14880 = N 1 448 + 15360 = N 2 256 + 15648 = N 3 288 + 16032 = N 1 736 + 16896 = N 3 256 + 17184 = N 1 160 + 17472 = N 2 0 + 17568 = N 0 736 + 18336 = S 2 864 + 18432 = N 2 256 + 18720 = N 3 288 + 19104 = N 1 832 + 19968 = N 2 256 + 20256 = N 1 352 + 20640 = N 0 768 + 21984 = N 2 0 + 22080 = N 1 160 + 22272 = N 0 160 + 22464 = N 3 0 + 22656 = N 2 0 + 22848 = N 0 0 + 23040 = N 2 160 + 23232 = N 3 0 + 23424 = N 3 0 + 23616 = N 1 160 + 23808 = N 2 0 + 24000 = N 2 0 + 24192 = N 1 256 + 24480 = N 2 448 + 24960 = N 3 160 + 25152 = N 0 160 + 25344 = N 2 0 + 25440 = N 2 0 + 25632 = N 1 0 + 25728 = N 1 160 + 25920 = N 3 0 + 26112 = N 2 0 + 26304 = N 1 160 + 26496 = N 0 0 + 26688 = N 2 0 + 26880 = N 0 160 + 27072 = N 3 0 + 27264 = N 0 0 + 27456 = N 1 160 + 27648 = N 0 160 + 27840 = N 3 0 + 28032 = N 2 0 + 28224 = N 0 0 + 28416 = N 2 160 + 28608 = N 3 0 + 28800 = N 3 0 + 28992 = N 1 160 + 29184 = N 2 0 + 29376 = N 2 0 + 29568 = N 1 256 + 29856 = N 2 448 + 30336 = N 3 160 + 30528 = N 0 160 + 30720 = N 2 0 + 30816 = N 2 0 + 31008 = N 1 0 + 31104 = N 1 160 + 31104 = S 2 1344 + 31296 = N 3 0 + 31488 = N 2 0 + 31680 = N 0 160 + 31872 = N 1 0 + 32064 = N 3 0 + 32256 = N 2 0 + 32736 = N 3 0 + 32928 = N 0 0 + 33792 = N 1 256 + 34080 = N 2 544 + 34656 = N 3 352 + 35040 = N 0 160 + 35232 = N 1 160 + 35424 = N 2 160 + 35616 = N 3 256 + 36000 = N 3 0 + 36144 = N 1 256 + 36432 = N 0 496 + 36960 = N 2 256 + 37248 = N 3 256 + 37632 = N 3 0 + 37776 = N 1 256 + 38064 = N 1 304 + 38400 = N 0 160 + 38592 = N 2 0 + 38784 = N 3 256 + 39168 = N 3 0 + 39360 = N 1 576 + 40032 = N 0 288 + 40368 = N 2 1488 + 41952 = N 1 1504 + 43488 = N 2 1504 + 45024 = N 0 1504 + 45024 = S 2 480 + 46560 = N 1 160 + 46752 = N 3 0 + 46944 = N 0 0 + 47136 = N 2 160 + 47328 = N 1 160 + 47712 = N 3 160 + 47904 = N 2 160 + 48096 = N 1 160 + 48288 = N 3 0 + 48480 = N 0 0 + 48672 = N 2 160 + 48864 = N 1 0 + 49248 = N 3 160 + 49440 = N 2 160 + 49632 = N 0 160 + 49824 = N 2 0 + 49920 = N 2 0 + 50208 = N 2 160 + 50400 = N 0 160 + 50592 = N 2 0 + 50784 = N 1 160 + 50976 = N 3 0 + 51168 = N 0 160 + 51360 = N 3 0 + 51504 = N 2 0 + 51648 = N 1 0 + 51792 = N 2 0 + 51936 = N 1 0 + 52128 = N 0 0 + 52320 = N 3 160 + 52704 = N 1 160 + 52896 = N 3 0 + 53088 = N 0 0 + 53280 = N 2 160 + 53472 = N 1 160 + 53856 = N 3 160 + 54048 = N 2 160 + 54240 = N 1 160 + 54432 = N 3 0 + 54624 = N 0 0 + 54816 = N 2 160 + 55008 = N 1 160 + 55392 = N 3 160 + 55584 = N 2 160 + 55776 = N 0 160 + 55968 = N 2 0 + 56064 = N 2 0 + 56352 = N 2 160 + 56544 = N 0 160 + 56736 = N 2 0 + 56928 = N 1 160 + 57120 = N 3 0 + 57312 = N 0 160 + 57504 = N 2 0 + 57600 = N 2 0 + 57792 = N 0 0 + 57888 = N 2 160 + 58080 = N 0 160 + 58272 = N 2 0 + 58464 = N 1 160 + 58656 = N 3 0 + 58848 = N 2 144 + 58848 = S 2 1632 + 59184 = N 3 144 + 59472 = N 1 144 + 59808 = N 3 144 + 60144 = N 3 144 + 60432 = N 1 144 + 60768 = N 2 144 + 61056 = N 0 144 + 61392 = N 3 144 + 61680 = N 1 144 + 62016 = N 0 144 + 62352 = N 2 144 + 62640 = N 1 0 + 62736 = N 2 0 + 62832 = N 3 0 + 63024 = N 1 0 + 63264 = N 0 0 + 63456 = N 3 0 + 63600 = N 2 0 + 63744 = N 1 144 + 64080 = N 1 0 + 64224 = N 0 144 + 64560 = N 3 144 + 64848 = N 1 144 + 65184 = N 2 144 + 65472 = N 0 144 + 65808 = N 3 144 + 66096 = N 1 144 + 66432 = N 0 144 + 66768 = N 2 144 + 67056 = N 1 0 + 67152 = N 2 0 + 67248 = N 3 0 + 67440 = N 1 0 + 67680 = N 0 144 + 68016 = N 3 144 + 68304 = N 1 144 + 68640 = N 3 144 + 68976 = N 3 144 + 69264 = N 1 144 + 69600 = N 2 144 + 69888 = N 0 144 + 70224 = N 3 144 + 70512 = N 1 144 + 70848 = N 0 144 + 71184 = N 2 144 + 71472 = N 1 0 + 71568 = N 2 0 + 71664 = N 3 0 + 71856 = N 1 0 + 72096 = N 0 144 + 72096 = S 2 1440 + 72432 = N 3 0 + 72576 = N 1 144 + 72912 = N 1 0 + 73056 = N 0 144 + 73392 = N 3 144 + 73680 = N 1 144 + 74016 = N 2 144 + 74304 = N 0 144 + 74640 = N 3 144 + 74928 = N 1 144 + 75264 = N 0 144 + 75600 = N 2 144 + 75888 = N 1 0 + 75984 = N 2 0 + 76080 = N 3 0 + 76272 = N 1 0 + 76512 = N 0 144 + 76752 = N 1 0 + 76848 = N 2 0 + 76992 = N 0 0 + 77232 = N 3 0 + 77328 = N 0 0 + 77616 = N 0 0 + 77904 = N 0 0 + 78048 = N 2 0 + 78144 = N 1 0 + 78240 = N 3 0 + 78336 = N 1 0 + 78432 = N 0 144 + 78672 = N 1 0 + 78768 = N 2 0 + 78912 = N 0 0 + 79008 = N 1 208 + 79248 = N 2 256 + 79536 = N 3 208 + 79776 = N 0 384 + 80544 = N 1 0 + 80688 = N 2 0 + 80832 = N 3 0 + 81120 = N 1 0 + 81264 = N 1 0 + 81456 = N 2 0 + 81744 = N 0 0 + 82032 = N 1 0 + 82224 = N 2 0 + 82464 = N 3 0 + 82704 = N 1 256 + 82992 = N 2 192 + 83280 = N 3 336 + 83808 = N 0 288 + 83808 = S 2 2112 + 84192 = N 0 288 + 84576 = N 0 288 + 84960 = N 3 160 + 85152 = N 1 160 + 85344 = N 2 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85824 = N 0 0 + 86112 = N 0 0 + 86256 = N 0 0 + 86400 = N 0 0 + 86496 = N 1 0 + 86640 = N 1 0 + 86784 = N 2 0 + 86928 = N 2 0 + 87072 = N 3 0 + 87216 = N 1 0 + 87312 = N 1 192 + 87600 = N 2 192 + 87888 = N 3 336 + 88416 = N 0 288 + 88800 = N 0 288 + 89184 = N 0 288 + 89568 = N 3 160 + 89760 = N 1 160 + 89952 = N 2 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90432 = N 0 144 + 90720 = N 0 0 + 90864 = N 0 0 + 91008 = N 0 0 + 91104 = N 1 0 + 91248 = N 1 0 + 91392 = N 3 0 + 91536 = N 3 0 + 91680 = N 2 0 + 91872 = N 0 1504 + 93408 = N 1 544 + 93984 = N 3 928 + 94944 = N 2 3040 + 98016 = N 0 1504 + 99552 = N 1 544 + 100128 = N 3 928 + 101088 = N 2 3040 + 104160 = N 2 0 + 104160 = S 2 2016 + 104640 = N 3 0 + 104832 = N 0 0 + 105120 = N 0 256 + 105408 = N 1 112 + 105552 = N 2 112 + 105696 = N 3 112 + 105840 = N 3 0 + 105984 = N 3 0 + 106080 = N 3 352 + 106464 = N 2 160 + 106656 = N 2 160 + 106848 = N 0 160 + 107040 = N 1 160 + 107232 = N 0 192 + 107520 = N 1 192 + 107808 = N 2 928 + 108768 = N 3 192 + 109056 = N 3 256 + 109344 = N 2 0 + 109440 = N 1 288 + 109824 = N 0 0 + 109920 = N 1 0 + 110112 = N 2 0 + 110304 = N 3 192 + 110592 = N 0 0 + 110688 = N 2 0 + 110880 = N 3 0 + 110976 = N 2 0 + 111168 = N 0 0 + 111360 = N 1 256 + 111648 = N 2 0 + 111840 = N 3 192 + 112128 = N 3 0 + 112224 = N 3 160 + 112416 = N 2 0 + 112512 = N 1 256 + 112896 = N 0 0 + 112992 = N 1 0 + 113184 = N 2 0 + 113376 = N 3 192 + 113664 = N 0 0 + 113952 = N 3 0 + 114048 = N 2 0 + 114240 = N 0 0 + 114432 = N 1 448 + 114912 = N 2 256 + 115200 = N 3 288 + 115584 = N 1 736 + 116352 = N 1 0 + 116448 = N 3 256 + 116448 = S 2 1152 + 116736 = N 1 160 + 117024 = N 2 0 + 117120 = N 0 736 + 117888 = N 1 0 + 117984 = N 2 256 + 118272 = N 3 288 + 118656 = N 1 832 + 119520 = N 2 256 + 119808 = N 1 352 + 120192 = N 0 768 + 121056 = N 2 928 + 122016 = N 3 160 + 122208 = N 1 1120 + 123360 = N 1 736 + 124128 = N 2 928 + 125088 = N 3 160 + 125280 = N 1 1120 + 126432 = N 1 736 + 127200 = N 2 928 + 127200 = S 2 2976 + 128160 = N 3 160 + 128352 = N 1 1120 + 129504 = N 1 736 + 130272 = N 2 928 + 131232 = N 3 160 + 131424 = N 1 1120 + 132576 = N 1 736 + 133344 = N 2 928 + 134304 = N 0 160 + 134496 = N 1 1888 + 136416 = N 2 928 + 137376 = N 0 160 + 137568 = N 1 1888 + 139488 = N 2 928 + 140448 = N 3 160 + 140640 = N 1 1120 + 141792 = N 1 736 + 142560 = N 2 928 + 143520 = N 3 160 + 143712 = N 1 1120 + 144864 = N 1 736 + 145632 = N 2 928 + 146592 = N 0 160 + 146784 = N 1 1888 + 148704 = N 2 928 + 149664 = N 0 160 + 149856 = N 1 1696 + 151584 = N 2 0 + 151776 = N 3 384 +} +[EasyDoubleBass] +{ + 4608 = N 1 0 + 4608 = S 2 1920 + 5088 = N 2 0 + 5280 = N 0 0 + 5568 = N 2 256 + 5856 = N 1 0 + 6144 = N 2 0 + 6432 = N 2 0 + 7680 = N 0 192 + 7968 = N 1 192 + 8256 = N 2 928 + 9216 = N 2 192 + 9504 = N 2 256 + 9888 = N 1 288 + 10368 = N 0 0 + 10560 = N 1 0 + 10752 = N 2 192 + 11136 = N 1 0 + 11424 = N 1 0 + 11616 = N 0 0 + 11808 = N 1 256 + 12288 = N 2 192 + 12672 = N 2 160 + 12960 = N 1 288 + 13440 = N 0 0 + 13632 = N 1 0 + 13824 = N 2 192 + 14112 = N 0 0 + 14496 = N 2 0 + 14688 = N 0 0 + 14880 = N 1 448 + 15360 = N 1 256 + 15648 = N 2 288 + 16032 = N 0 736 + 16896 = N 2 256 + 17184 = N 1 160 + 17568 = N 0 736 + 18336 = S 2 864 + 18432 = N 1 256 + 18720 = N 2 288 + 19104 = N 0 832 + 19968 = N 2 256 + 20256 = N 1 352 + 20640 = N 0 768 + 22080 = N 1 160 + 22272 = N 0 160 + 22464 = N 2 0 + 22656 = N 1 0 + 22848 = N 0 0 + 23040 = N 1 160 + 23232 = N 2 0 + 23424 = N 2 0 + 23616 = N 0 160 + 23808 = N 2 0 + 24000 = N 2 0 + 24192 = N 0 256 + 24480 = N 1 448 + 24960 = N 2 160 + 25152 = N 0 160 + 25344 = N 2 0 + 25728 = N 1 160 + 25920 = N 2 0 + 26112 = N 1 0 + 26304 = N 1 160 + 26496 = N 0 0 + 26688 = N 1 0 + 26880 = N 0 160 + 27072 = N 2 0 + 27456 = N 1 160 + 27648 = N 0 160 + 27840 = N 2 0 + 28032 = N 1 0 + 28224 = N 0 0 + 28416 = N 1 160 + 28608 = N 2 0 + 28800 = N 2 0 + 28992 = N 0 160 + 29184 = N 2 0 + 29376 = N 2 0 + 29568 = N 0 256 + 29856 = N 1 448 + 30336 = N 2 160 + 30528 = N 0 160 + 30720 = N 2 0 + 31104 = N 1 160 + 31104 = S 2 1344 + 31296 = N 2 0 + 31488 = N 1 0 + 31680 = N 0 160 + 31872 = N 1 0 + 32064 = N 2 0 + 32256 = N 1 0 + 32736 = N 2 0 + 32928 = N 0 0 + 33792 = N 0 256 + 34080 = N 1 544 + 34656 = N 2 352 + 35040 = N 0 160 + 35232 = N 1 160 + 35424 = N 2 160 + 35616 = N 2 256 + 36144 = N 1 256 + 36432 = N 0 496 + 36960 = N 1 256 + 37248 = N 2 256 + 37776 = N 1 256 + 38064 = N 1 304 + 38400 = N 0 160 + 38592 = N 1 0 + 38784 = N 2 256 + 39360 = N 1 576 + 40032 = N 0 288 + 40368 = N 2 1488 + 41952 = N 1 1504 + 43488 = N 2 1504 + 45024 = N 0 1504 + 45024 = S 2 480 + 46560 = N 1 160 + 46944 = N 0 0 + 47328 = N 1 160 + 47712 = N 2 160 + 48096 = N 1 160 + 48480 = N 0 0 + 48864 = N 1 0 + 49248 = N 2 160 + 49632 = N 0 160 + 49824 = N 2 0 + 50208 = N 2 160 + 50400 = N 0 160 + 50592 = N 2 0 + 50784 = N 1 160 + 50976 = N 2 0 + 51168 = N 0 160 + 51360 = N 2 0 + 51648 = N 1 0 + 51936 = N 0 0 + 52704 = N 1 160 + 53088 = N 0 0 + 53472 = N 1 160 + 53856 = N 2 160 + 54240 = N 1 160 + 54624 = N 0 0 + 55008 = N 1 160 + 55392 = N 2 160 + 55776 = N 0 160 + 55968 = N 2 0 + 56352 = N 2 160 + 56544 = N 0 160 + 56736 = N 2 0 + 56928 = N 1 160 + 57120 = N 2 0 + 57312 = N 0 160 + 57504 = N 2 0 + 57888 = N 2 160 + 58080 = N 0 160 + 58272 = N 2 0 + 58464 = N 1 160 + 58656 = N 2 0 + 58848 = N 1 144 + 58848 = S 2 1632 + 59184 = N 2 144 + 59472 = N 0 144 + 59808 = N 2 144 + 60144 = N 2 144 + 60432 = N 1 144 + 60768 = N 2 144 + 61056 = N 0 144 + 61392 = N 2 144 + 61680 = N 1 144 + 62016 = N 0 144 + 62352 = N 2 144 + 62640 = N 1 0 + 62832 = N 2 0 + 63024 = N 1 0 + 63264 = N 0 0 + 63456 = N 2 0 + 63744 = N 1 144 + 64224 = N 0 144 + 64560 = N 2 144 + 64848 = N 1 144 + 65184 = N 2 144 + 65472 = N 0 144 + 65808 = N 2 144 + 66096 = N 1 144 + 66432 = N 0 144 + 66768 = N 2 144 + 67056 = N 1 0 + 67248 = N 2 0 + 67440 = N 1 0 + 67680 = N 0 144 + 68016 = N 2 144 + 68304 = N 1 144 + 68640 = N 2 144 + 68976 = N 2 144 + 69264 = N 1 144 + 69600 = N 2 144 + 69888 = N 0 144 + 70224 = N 2 144 + 70512 = N 1 144 + 70848 = N 0 144 + 71184 = N 2 144 + 71472 = N 1 0 + 71664 = N 2 0 + 71856 = N 1 0 + 72096 = N 0 144 + 72096 = S 2 1440 + 72576 = N 1 144 + 73056 = N 0 144 + 73392 = N 2 144 + 73680 = N 1 144 + 74016 = N 2 144 + 74304 = N 0 144 + 74640 = N 2 144 + 74928 = N 1 144 + 75264 = N 0 144 + 75600 = N 2 144 + 75888 = N 1 0 + 76080 = N 2 0 + 76272 = N 1 0 + 76512 = N 0 144 + 76752 = N 1 0 + 76992 = N 0 0 + 77328 = N 0 0 + 77616 = N 0 0 + 77904 = N 0 0 + 78048 = N 1 0 + 78240 = N 2 0 + 78432 = N 0 144 + 78672 = N 1 0 + 79008 = N 0 208 + 79248 = N 1 256 + 79536 = N 2 208 + 79776 = N 0 384 + 80544 = N 1 0 + 80832 = N 2 0 + 81120 = N 0 0 + 81456 = N 2 0 + 81744 = N 0 0 + 82032 = N 1 0 + 82224 = N 2 0 + 82464 = N 2 0 + 82704 = N 0 256 + 82992 = N 1 192 + 83280 = N 2 336 + 83808 = N 0 288 + 83808 = S 2 2112 + 84192 = N 0 288 + 84576 = N 0 288 + 84960 = N 2 160 + 85152 = N 0 160 + 85344 = N 1 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85824 = N 0 0 + 86112 = N 0 0 + 86256 = N 0 0 + 86496 = N 1 0 + 86640 = N 1 0 + 86784 = N 2 0 + 87072 = N 1 0 + 87312 = N 0 192 + 87600 = N 1 192 + 87888 = N 2 336 + 88416 = N 0 288 + 88800 = N 0 288 + 89184 = N 0 288 + 89568 = N 2 160 + 89760 = N 0 160 + 89952 = N 1 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90720 = N 0 0 + 90864 = N 0 0 + 91104 = N 1 0 + 91248 = N 1 0 + 91392 = N 2 0 + 91680 = N 1 0 + 91872 = N 0 1504 + 93408 = N 1 544 + 93984 = N 2 928 + 94944 = N 1 3040 + 98016 = N 0 1504 + 99552 = N 1 544 + 100128 = N 2 928 + 101088 = N 1 3040 + 104160 = N 1 0 + 104160 = S 2 2016 + 104640 = N 2 0 + 104832 = N 0 0 + 105120 = N 0 256 + 105408 = N 1 112 + 105696 = N 2 112 + 105840 = N 2 0 + 106080 = N 2 352 + 106464 = N 1 160 + 106656 = N 1 160 + 106848 = N 0 160 + 107040 = N 1 160 + 107232 = N 0 192 + 107520 = N 1 192 + 107808 = N 2 928 + 108768 = N 2 192 + 109056 = N 2 256 + 109440 = N 1 288 + 109920 = N 0 0 + 110112 = N 1 0 + 110304 = N 2 192 + 110688 = N 1 0 + 110976 = N 1 0 + 111168 = N 0 0 + 111360 = N 1 256 + 111648 = N 1 0 + 111840 = N 2 192 + 112224 = N 2 160 + 112512 = N 1 256 + 112992 = N 0 0 + 113184 = N 1 0 + 113376 = N 2 192 + 113664 = N 0 0 + 114048 = N 2 0 + 114240 = N 0 0 + 114432 = N 1 448 + 114912 = N 1 256 + 115200 = N 2 288 + 115584 = N 0 736 + 116448 = N 2 256 + 116448 = S 2 1152 + 116736 = N 1 160 + 117120 = N 0 736 + 117984 = N 1 256 + 118272 = N 2 288 + 118656 = N 0 832 + 119520 = N 2 256 + 119808 = N 1 352 + 120192 = N 0 768 + 121056 = N 1 928 + 122016 = N 2 160 + 122208 = N 0 1120 + 123360 = N 0 736 + 124128 = N 1 928 + 125088 = N 2 160 + 125280 = N 0 1120 + 126432 = N 0 736 + 127200 = N 1 928 + 127200 = S 2 2976 + 128160 = N 2 160 + 128352 = N 0 1120 + 129504 = N 0 736 + 130272 = N 1 928 + 131232 = N 2 160 + 131424 = N 0 1120 + 132576 = N 0 736 + 133344 = N 2 928 + 134304 = N 0 160 + 134496 = N 1 1888 + 136416 = N 2 928 + 137376 = N 0 160 + 137568 = N 1 1888 + 139488 = N 1 928 + 140448 = N 2 160 + 140640 = N 0 1120 + 141792 = N 0 736 + 142560 = N 1 928 + 143520 = N 2 160 + 143712 = N 0 1120 + 144864 = N 0 736 + 145632 = N 2 928 + 146592 = N 0 160 + 146784 = N 1 1888 + 148704 = N 2 928 + 149664 = N 0 160 + 149856 = N 1 1696 + 151584 = N 1 0 + 151776 = N 2 384 +} +[ExpertDrums] +{ + 1536 = N 4 0 + 1536 = N 0 0 + 1632 = N 0 0 + 1728 = N 2 0 + 1824 = N 2 0 + 1920 = N 1 0 + 1920 = N 2 0 + 2016 = N 2 0 + 2112 = N 2 0 + 2208 = N 2 0 + 2304 = N 2 0 + 2400 = N 2 0 + 2496 = N 2 0 + 2496 = N 0 0 + 2592 = N 2 0 + 2592 = N 0 0 + 2688 = N 1 0 + 2688 = N 2 0 + 2784 = N 0 0 + 2880 = N 1 0 + 2880 = N 2 0 + 2976 = N 1 0 + 3072 = N 2 0 + 3072 = N 0 0 + 3168 = N 0 0 + 3264 = N 2 0 + 3360 = N 2 0 + 3456 = N 1 0 + 3456 = N 2 0 + 3552 = N 1 0 + 3552 = N 2 0 + 3648 = N 2 0 + 3744 = N 2 0 + 3840 = N 2 0 + 3840 = S 2 960 + 3936 = N 2 0 + 4032 = N 2 0 + 4032 = N 0 0 + 4128 = N 0 0 + 4224 = N 1 0 + 4224 = N 2 0 + 4320 = N 1 0 + 4416 = N 4 0 + 4512 = N 4 0 + 4608 = N 4 0 + 4608 = N 0 0 + 4800 = N 2 0 + 4896 = N 2 0 + 4992 = N 1 0 + 4992 = N 2 0 + 5088 = N 2 0 + 5184 = N 2 0 + 5280 = N 2 0 + 5376 = N 2 0 + 5472 = N 2 0 + 5568 = N 2 0 + 5568 = N 0 0 + 5664 = N 2 0 + 5760 = N 1 0 + 5760 = N 2 0 + 5856 = N 2 0 + 5952 = N 2 0 + 6048 = N 2 0 + 6144 = N 2 0 + 6144 = N 0 0 + 6240 = N 2 0 + 6336 = N 2 0 + 6432 = N 2 0 + 6528 = N 1 0 + 6528 = N 2 0 + 6624 = N 2 0 + 6720 = N 2 0 + 6816 = N 1 0 + 6816 = N 2 0 + 6864 = N 1 0 + 6912 = N 2 0 + 7008 = N 1 0 + 7008 = N 2 0 + 7056 = N 1 0 + 7104 = N 2 0 + 7104 = N 0 0 + 7200 = N 2 0 + 7296 = N 1 0 + 7296 = N 2 0 + 7392 = N 2 0 + 7392 = N 0 0 + 7488 = N 1 0 + 7584 = N 1 0 + 7680 = N 4 0 + 7680 = N 0 0 + 7776 = N 2 0 + 7824 = N 1 0 + 7872 = N 1 0 + 7920 = N 1 0 + 7968 = N 3 0 + 7968 = N 0 0 + 8064 = N 2 0 + 8112 = N 1 0 + 8160 = N 1 0 + 8208 = N 1 0 + 8256 = N 4 0 + 8256 = N 0 0 + 8352 = N 2 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8784 = N 0 0 + 8832 = N 1 0 + 8832 = N 4 0 + 8880 = N 0 0 + 8928 = N 1 0 + 8976 = N 4 0 + 9024 = N 0 0 + 9072 = N 4 0 + 9120 = N 1 0 + 9168 = N 0 0 + 9216 = N 4 0 + 9216 = N 0 0 + 9312 = N 2 0 + 9360 = N 2 0 + 9408 = N 2 0 + 9456 = N 2 0 + 9504 = N 2 0 + 9504 = N 0 0 + 9600 = N 1 0 + 9696 = N 2 0 + 9744 = N 2 0 + 9792 = N 2 0 + 9840 = N 2 0 + 9888 = N 2 0 + 9888 = N 0 0 + 9936 = N 2 0 + 9984 = N 2 0 + 10032 = N 2 0 + 10080 = N 2 0 + 10128 = N 2 0 + 10176 = N 2 0 + 10224 = N 2 0 + 10272 = N 2 0 + 10272 = N 0 0 + 10320 = N 2 0 + 10368 = N 1 0 + 10416 = N 2 0 + 10464 = N 2 0 + 10512 = N 2 0 + 10560 = N 2 0 + 10560 = N 0 0 + 10608 = N 2 0 + 10656 = N 2 0 + 10656 = N 0 0 + 10704 = N 1 0 + 10752 = N 4 0 + 10752 = N 0 0 + 10800 = N 2 0 + 10848 = N 2 0 + 10896 = N 2 0 + 10944 = N 2 0 + 10992 = N 2 0 + 11040 = N 2 0 + 11040 = N 0 0 + 11088 = N 2 0 + 11136 = N 1 0 + 11232 = N 2 0 + 11280 = N 2 0 + 11328 = N 1 0 + 11376 = N 1 0 + 11424 = N 4 0 + 11424 = N 0 0 + 11424 = S 2 912 + 11472 = N 2 0 + 11520 = N 2 0 + 11568 = N 2 0 + 11616 = N 3 0 + 11616 = N 0 0 + 11664 = N 2 0 + 11712 = N 2 0 + 11760 = N 2 0 + 11808 = N 4 0 + 11808 = N 0 0 + 11856 = N 2 0 + 11904 = N 2 0 + 11952 = N 0 0 + 12000 = N 0 0 + 12048 = N 3 0 + 12096 = N 1 0 + 12144 = N 0 0 + 12192 = N 4 0 + 12240 = N 1 0 + 12288 = N 4 0 + 12288 = N 0 0 + 12336 = N 2 0 + 12384 = N 2 0 + 12432 = N 2 0 + 12480 = N 2 0 + 12528 = N 2 0 + 12576 = N 2 0 + 12576 = N 0 0 + 12672 = N 1 0 + 12768 = N 2 0 + 12816 = N 2 0 + 12864 = N 2 0 + 12912 = N 2 0 + 12960 = N 2 0 + 12960 = N 0 0 + 13008 = N 2 0 + 13056 = N 2 0 + 13104 = N 2 0 + 13152 = N 2 0 + 13200 = N 2 0 + 13248 = N 2 0 + 13296 = N 2 0 + 13344 = N 2 0 + 13344 = N 0 0 + 13392 = N 2 0 + 13440 = N 1 0 + 13488 = N 2 0 + 13536 = N 2 0 + 13584 = N 2 0 + 13632 = N 2 0 + 13632 = N 0 0 + 13680 = N 2 0 + 13728 = N 2 0 + 13728 = N 0 0 + 13776 = N 1 0 + 13824 = N 4 0 + 13824 = N 0 0 + 13872 = N 2 0 + 13920 = N 2 0 + 13968 = N 2 0 + 14016 = N 2 0 + 14064 = N 2 0 + 14112 = N 2 0 + 14112 = N 0 0 + 14160 = N 2 0 + 14208 = N 1 0 + 14256 = N 2 0 + 14304 = N 2 0 + 14352 = N 2 0 + 14400 = N 1 0 + 14448 = N 1 0 + 14496 = N 4 0 + 14496 = N 0 0 + 14544 = N 2 0 + 14592 = N 2 0 + 14640 = N 2 0 + 14688 = N 3 0 + 14688 = N 0 0 + 14736 = N 2 0 + 14784 = N 2 0 + 14832 = N 2 0 + 14880 = N 4 0 + 14880 = N 0 0 + 14928 = N 2 0 + 14976 = N 2 0 + 15024 = N 2 0 + 15072 = N 1 0 + 15168 = N 1 0 + 15264 = N 1 0 + 15312 = N 1 0 + 15360 = N 3 0 + 15360 = N 0 0 + 15552 = N 1 0 + 15600 = N 1 0 + 15648 = N 4 0 + 15648 = N 0 0 + 15744 = N 2 0 + 15792 = N 2 0 + 15840 = N 2 0 + 15936 = N 1 0 + 15936 = N 2 0 + 16032 = N 2 0 + 16032 = N 0 0 + 16128 = N 2 0 + 16224 = N 2 0 + 16320 = N 1 0 + 16320 = N 2 0 + 16416 = N 2 0 + 16416 = N 0 0 + 16464 = N 2 0 + 16512 = N 2 0 + 16608 = N 2 0 + 16608 = N 0 0 + 16704 = N 1 0 + 16704 = N 2 0 + 16800 = N 2 0 + 16848 = N 2 0 + 16896 = N 3 0 + 16896 = N 0 0 + 16992 = N 2 0 + 17088 = N 1 0 + 17136 = N 1 0 + 17184 = N 4 0 + 17184 = N 0 0 + 17280 = N 2 0 + 17328 = N 2 0 + 17376 = N 2 0 + 17472 = N 1 0 + 17472 = N 2 0 + 17568 = N 2 0 + 17568 = N 0 0 + 17664 = N 2 0 + 17760 = N 2 0 + 17856 = N 1 0 + 17856 = N 2 0 + 17952 = N 2 0 + 17952 = N 0 0 + 18000 = N 2 0 + 18048 = N 2 0 + 18144 = N 2 0 + 18144 = N 0 0 + 18240 = N 1 0 + 18240 = N 2 0 + 18336 = N 2 0 + 18336 = N 0 0 + 18384 = N 2 0 + 18432 = N 3 0 + 18432 = N 0 0 + 18528 = N 2 0 + 18624 = N 1 0 + 18672 = N 1 0 + 18720 = N 4 0 + 18720 = N 0 0 + 18816 = N 2 0 + 18864 = N 2 0 + 18912 = N 2 0 + 19008 = N 1 0 + 19008 = N 2 0 + 19104 = N 2 0 + 19104 = N 0 0 + 19200 = N 2 0 + 19296 = N 2 0 + 19392 = N 1 0 + 19392 = N 2 0 + 19488 = N 2 0 + 19488 = N 0 0 + 19536 = N 2 0 + 19584 = N 2 0 + 19680 = N 2 0 + 19680 = N 0 0 + 19776 = N 1 0 + 19776 = N 2 0 + 19872 = N 2 0 + 19872 = N 0 0 + 19920 = N 2 0 + 19968 = N 3 0 + 19968 = N 0 0 + 19968 = S 2 1536 + 20064 = N 2 0 + 20160 = N 1 0 + 20208 = N 1 0 + 20256 = N 4 0 + 20256 = N 0 0 + 20352 = N 2 0 + 20400 = N 2 0 + 20448 = N 2 0 + 20544 = N 1 0 + 20544 = N 2 0 + 20640 = N 2 0 + 20640 = N 0 0 + 20736 = N 2 0 + 20832 = N 2 0 + 20928 = N 1 0 + 20928 = N 2 0 + 21024 = N 2 0 + 21024 = N 0 0 + 21072 = N 2 0 + 21120 = N 2 0 + 21216 = N 2 0 + 21216 = N 0 0 + 21312 = N 1 0 + 21312 = N 2 0 + 21408 = N 2 0 + 21408 = N 0 0 + 21456 = N 1 0 + 21984 = N 1 0 + 22080 = N 4 0 + 22080 = N 0 0 + 22272 = N 3 0 + 22272 = N 0 0 + 22464 = N 4 0 + 22464 = N 0 0 + 22656 = N 1 0 + 22656 = N 2 0 + 22752 = N 0 0 + 22848 = N 2 0 + 22944 = N 0 0 + 23040 = N 2 0 + 23040 = N 0 0 + 23136 = N 2 0 + 23232 = N 2 0 + 23232 = N 0 0 + 23328 = N 0 0 + 23424 = N 1 0 + 23424 = N 2 0 + 23520 = N 0 0 + 23616 = N 2 0 + 23616 = N 0 0 + 23808 = N 2 0 + 23808 = N 0 0 + 24000 = N 2 0 + 24000 = N 0 0 + 24096 = N 1 0 + 24192 = N 4 0 + 24192 = N 0 0 + 24288 = N 2 0 + 24384 = N 2 0 + 24480 = N 3 0 + 24480 = N 0 0 + 24576 = N 1 0 + 24672 = N 0 0 + 24768 = N 2 0 + 24768 = N 0 0 + 24960 = N 2 0 + 24960 = N 0 0 + 25056 = N 2 0 + 25152 = N 2 0 + 25152 = N 0 0 + 25344 = N 1 0 + 25344 = N 2 0 + 25440 = N 0 0 + 25536 = N 2 0 + 25632 = N 2 0 + 25632 = N 0 0 + 25680 = N 2 0 + 25728 = N 0 0 + 25776 = N 2 0 + 25824 = N 2 0 + 25920 = N 1 0 + 25920 = N 2 0 + 25968 = N 2 0 + 26016 = N 2 0 + 26016 = N 0 0 + 26064 = N 2 0 + 26112 = N 2 0 + 26208 = N 2 0 + 26208 = N 0 0 + 26304 = N 2 0 + 26304 = N 0 0 + 26352 = N 2 0 + 26400 = N 2 0 + 26496 = N 2 0 + 26496 = N 0 0 + 26592 = N 2 0 + 26688 = N 2 0 + 26688 = N 0 0 + 26784 = N 1 0 + 26880 = N 4 0 + 26880 = N 0 0 + 27072 = N 2 0 + 27264 = N 1 0 + 27264 = N 2 0 + 27360 = N 0 0 + 27456 = N 2 0 + 27456 = N 0 0 + 27648 = N 2 0 + 27648 = N 0 0 + 27744 = N 2 0 + 27840 = N 2 0 + 27840 = N 0 0 + 28032 = N 1 0 + 28032 = N 2 0 + 28128 = N 0 0 + 28224 = N 2 0 + 28224 = S 2 1440 + 28320 = N 0 0 + 28416 = N 2 0 + 28416 = N 0 0 + 28512 = N 2 0 + 28608 = N 2 0 + 28608 = N 0 0 + 28704 = N 0 0 + 28800 = N 1 0 + 28800 = N 2 0 + 28896 = N 0 0 + 28992 = N 2 0 + 28992 = N 0 0 + 29184 = N 2 0 + 29184 = N 0 0 + 29280 = N 2 0 + 29376 = N 2 0 + 29376 = N 0 0 + 29472 = N 1 0 + 29568 = N 4 0 + 29568 = N 0 0 + 29664 = N 2 0 + 29760 = N 2 0 + 29856 = N 3 0 + 29856 = N 0 0 + 29952 = N 1 0 + 30048 = N 0 0 + 30144 = N 2 0 + 30144 = N 0 0 + 30336 = N 2 0 + 30336 = N 0 0 + 30432 = N 2 0 + 30528 = N 2 0 + 30528 = N 0 0 + 30720 = N 1 0 + 30720 = N 2 0 + 30816 = N 0 0 + 30912 = N 2 0 + 31008 = N 2 0 + 31008 = N 0 0 + 31056 = N 2 0 + 31104 = N 0 0 + 31152 = N 2 0 + 31200 = N 2 0 + 31296 = N 1 0 + 31296 = N 2 0 + 31344 = N 2 0 + 31392 = N 2 0 + 31392 = N 0 0 + 31440 = N 2 0 + 31488 = N 2 0 + 31584 = N 2 0 + 31584 = N 0 0 + 31632 = N 2 0 + 31680 = N 0 0 + 31728 = N 2 0 + 31776 = N 2 0 + 31872 = N 2 0 + 31872 = N 0 0 + 31968 = N 2 0 + 32064 = N 2 0 + 32064 = N 0 0 + 32160 = N 1 0 + 32256 = N 4 0 + 32256 = N 0 0 + 32448 = N 2 0 + 32544 = N 2 0 + 32640 = N 1 0 + 32640 = N 2 0 + 32736 = N 2 0 + 32832 = N 2 0 + 32928 = N 2 0 + 33024 = N 2 0 + 33120 = N 2 0 + 33216 = N 2 0 + 33216 = N 0 0 + 33312 = N 2 0 + 33408 = N 1 0 + 33408 = N 2 0 + 33504 = N 2 0 + 33600 = N 2 0 + 33696 = N 2 0 + 33792 = N 4 0 + 33792 = N 0 0 + 33888 = N 2 0 + 33984 = N 2 0 + 34080 = N 2 0 + 34080 = N 0 0 + 34176 = N 1 0 + 34176 = N 2 0 + 34272 = N 2 0 + 34368 = N 2 0 + 34464 = N 2 0 + 34560 = N 2 0 + 34656 = N 2 0 + 34656 = N 0 0 + 34752 = N 2 0 + 34848 = N 2 0 + 34944 = N 1 0 + 34944 = N 2 0 + 35040 = N 2 0 + 35040 = N 0 0 + 35136 = N 2 0 + 35232 = N 1 0 + 35232 = N 2 0 + 35328 = N 2 0 + 35424 = N 2 0 + 35424 = N 0 0 + 35520 = N 1 0 + 35520 = N 2 0 + 35616 = N 4 0 + 35616 = N 0 0 + 35712 = N 2 0 + 35760 = N 2 0 + 35808 = N 2 0 + 35904 = N 1 0 + 35904 = N 2 0 + 36000 = N 2 0 + 36048 = N 2 0 + 36096 = N 2 0 + 36144 = N 0 0 + 36288 = N 1 0 + 36288 = N 2 0 + 36384 = N 2 0 + 36432 = N 0 0 + 36480 = N 2 0 + 36528 = N 2 0 + 36576 = N 2 0 + 36672 = N 1 0 + 36672 = N 2 0 + 36768 = N 2 0 + 36768 = N 0 0 + 36816 = N 2 0 + 36864 = N 2 0 + 36912 = N 0 0 + 37056 = N 1 0 + 37056 = N 2 0 + 37104 = N 0 0 + 37152 = N 2 0 + 37200 = N 2 0 + 37248 = N 4 0 + 37248 = N 0 0 + 37248 = S 2 1584 + 37440 = N 1 0 + 37440 = N 2 0 + 37536 = N 2 0 + 37632 = N 2 0 + 37680 = N 2 0 + 37728 = N 2 0 + 37776 = N 0 0 + 37824 = N 1 0 + 37824 = N 2 0 + 37920 = N 2 0 + 37968 = N 2 0 + 38016 = N 2 0 + 38064 = N 0 0 + 38208 = N 1 0 + 38208 = N 2 0 + 38304 = N 2 0 + 38352 = N 2 0 + 38400 = N 2 0 + 38400 = N 0 0 + 38544 = N 0 0 + 38592 = N 1 0 + 38592 = N 2 0 + 38640 = N 0 0 + 38688 = N 1 0 + 38736 = N 1 0 + 38784 = N 4 0 + 38784 = N 0 0 + 38832 = N 2 0 + 38880 = N 2 0 + 38976 = N 2 0 + 39024 = N 2 0 + 39072 = N 2 0 + 39120 = N 2 0 + 39168 = N 2 0 + 39264 = N 1 0 + 39264 = N 2 0 + 39360 = N 0 0 + 39456 = N 2 0 + 39552 = N 2 0 + 39600 = N 0 0 + 39648 = N 2 0 + 39744 = N 2 0 + 39840 = N 2 0 + 39936 = N 2 0 + 39936 = N 0 0 + 40032 = N 1 0 + 40032 = N 2 0 + 40128 = N 1 0 + 40176 = N 1 0 + 40224 = N 2 0 + 40368 = N 0 0 + 40416 = N 2 0 + 40464 = N 1 0 + 40512 = N 2 0 + 40560 = N 1 0 + 40608 = N 2 0 + 40656 = N 1 0 + 40704 = N 2 0 + 40800 = N 1 0 + 40800 = N 2 0 + 40896 = N 2 0 + 40944 = N 0 0 + 40992 = N 2 0 + 41088 = N 2 0 + 41184 = N 2 0 + 41232 = N 1 0 + 41280 = N 2 0 + 41328 = N 1 0 + 41376 = N 2 0 + 41424 = N 1 0 + 41472 = N 2 0 + 41520 = N 0 0 + 41568 = N 1 0 + 41568 = N 2 0 + 41616 = N 0 0 + 41712 = N 1 0 + 41760 = N 1 0 + 41808 = N 2 0 + 41856 = N 4 0 + 41904 = N 4 0 + 41952 = N 4 0 + 41952 = N 0 0 + 42096 = N 2 0 + 42240 = N 4 0 + 42384 = N 4 0 + 42528 = N 4 0 + 43200 = N 2 0 + 43248 = N 2 0 + 43296 = N 2 0 + 43392 = N 4 0 + 43440 = N 4 0 + 43488 = N 4 0 + 43488 = N 0 0 + 43632 = N 4 0 + 44352 = N 4 0 + 44400 = N 4 0 + 44448 = N 4 0 + 44496 = N 4 0 + 44544 = N 4 0 + 44592 = N 4 0 + 44640 = N 4 0 + 44688 = N 4 0 + 44736 = N 4 0 + 44784 = N 4 0 + 44832 = N 4 0 + 44880 = N 4 0 + 44928 = N 4 0 + 44976 = N 4 0 + 45024 = N 4 0 + 45168 = N 4 0 + 46272 = N 2 0 + 46368 = N 1 0 + 46560 = N 4 0 + 46560 = N 0 0 + 46656 = N 2 0 + 46752 = N 2 0 + 46848 = N 2 0 + 46944 = N 1 0 + 46944 = N 2 0 + 47040 = N 2 0 + 47136 = N 2 0 + 47232 = N 2 0 + 47328 = N 2 0 + 47328 = S 2 864 + 47424 = N 2 0 + 47424 = N 0 0 + 47520 = N 2 0 + 47520 = N 0 0 + 47616 = N 2 0 + 47712 = N 1 0 + 47712 = N 2 0 + 47904 = N 2 0 + 48000 = N 2 0 + 48096 = N 2 0 + 48096 = N 0 0 + 48192 = N 2 0 + 48288 = N 2 0 + 48384 = N 2 0 + 48480 = N 1 0 + 48480 = N 2 0 + 48576 = N 2 0 + 48672 = N 2 0 + 48768 = N 2 0 + 48864 = N 2 0 + 48960 = N 2 0 + 48960 = N 0 0 + 49056 = N 2 0 + 49056 = N 0 0 + 49152 = N 2 0 + 49248 = N 1 0 + 49248 = N 2 0 + 49344 = N 2 0 + 49440 = N 2 0 + 49536 = N 2 0 + 49632 = N 4 0 + 49632 = N 0 0 + 49728 = N 2 0 + 49824 = N 2 0 + 49920 = N 2 0 + 50016 = N 1 0 + 50016 = N 2 0 + 50112 = N 2 0 + 50208 = N 2 0 + 50304 = N 2 0 + 50400 = N 2 0 + 50496 = N 2 0 + 50496 = N 0 0 + 50592 = N 2 0 + 50592 = N 0 0 + 50784 = N 1 0 + 50784 = N 2 0 + 50880 = N 2 0 + 50976 = N 2 0 + 51072 = N 2 0 + 51168 = N 2 0 + 51168 = N 0 0 + 51264 = N 2 0 + 51360 = N 2 0 + 51456 = N 2 0 + 51552 = N 1 0 + 51552 = N 2 0 + 51648 = N 2 0 + 51744 = N 2 0 + 51840 = N 2 0 + 51936 = N 2 0 + 52032 = N 2 0 + 52032 = N 0 0 + 52128 = N 2 0 + 52128 = N 0 0 + 52224 = N 2 0 + 52320 = N 1 0 + 52320 = N 2 0 + 52416 = N 3 0 + 52512 = N 2 0 + 52608 = N 3 0 + 52704 = N 4 0 + 52704 = N 0 0 + 52896 = N 2 0 + 52992 = N 2 0 + 53088 = N 1 0 + 53088 = N 2 0 + 53184 = N 2 0 + 53280 = N 2 0 + 53472 = N 2 0 + 53568 = N 2 0 + 53568 = N 0 0 + 53664 = N 2 0 + 53664 = N 0 0 + 53856 = N 1 0 + 53856 = N 2 0 + 54048 = N 2 0 + 54240 = N 2 0 + 54240 = N 0 0 + 54336 = N 2 0 + 54432 = N 2 0 + 54528 = N 2 0 + 54624 = N 1 0 + 54624 = N 2 0 + 54720 = N 2 0 + 54816 = N 2 0 + 55008 = N 2 0 + 55104 = N 2 0 + 55104 = N 0 0 + 55200 = N 2 0 + 55200 = N 0 0 + 55296 = N 2 0 + 55392 = N 1 0 + 55392 = N 2 0 + 55488 = N 2 0 + 55584 = N 2 0 + 55680 = N 2 0 + 55776 = N 4 0 + 55776 = N 0 0 + 55776 = S 2 864 + 55968 = N 2 0 + 56160 = N 1 0 + 56160 = N 2 0 + 56256 = N 2 0 + 56352 = N 2 0 + 56448 = N 2 0 + 56544 = N 2 0 + 56640 = N 2 0 + 56640 = N 0 0 + 56736 = N 2 0 + 56736 = N 0 0 + 56832 = N 2 0 + 56928 = N 1 0 + 56928 = N 2 0 + 57024 = N 2 0 + 57120 = N 2 0 + 57216 = N 2 0 + 57312 = N 2 0 + 57312 = N 0 0 + 57408 = N 2 0 + 57504 = N 2 0 + 57600 = N 2 0 + 57696 = N 1 0 + 57696 = N 2 0 + 57792 = N 2 0 + 57888 = N 2 0 + 57984 = N 2 0 + 58080 = N 2 0 + 58176 = N 2 0 + 58176 = N 0 0 + 58272 = N 2 0 + 58272 = N 0 0 + 58368 = N 2 0 + 58464 = N 1 0 + 58512 = N 1 0 + 58608 = N 1 0 + 58656 = N 1 0 + 58704 = N 2 0 + 58752 = N 4 0 + 58800 = N 4 0 + 58848 = N 4 0 + 58848 = N 0 0 + 59040 = N 2 0 + 59136 = N 2 0 + 59184 = N 1 0 + 59232 = N 2 0 + 59328 = N 2 0 + 59424 = N 2 0 + 59472 = N 0 0 + 59520 = N 2 0 + 59616 = N 2 0 + 59712 = N 2 0 + 59760 = N 1 0 + 59808 = N 2 0 + 59808 = N 0 0 + 59904 = N 2 0 + 60000 = N 2 0 + 60096 = N 2 0 + 60144 = N 1 0 + 60192 = N 2 0 + 60288 = N 2 0 + 60384 = N 2 0 + 60432 = N 0 0 + 60480 = N 2 0 + 60576 = N 2 0 + 60672 = N 2 0 + 60720 = N 1 0 + 60768 = N 2 0 + 60768 = N 0 0 + 60864 = N 2 0 + 60960 = N 2 0 + 61008 = N 1 0 + 61056 = N 2 0 + 61056 = N 0 0 + 61152 = N 2 0 + 61248 = N 2 0 + 61344 = N 2 0 + 61392 = N 1 0 + 61440 = N 2 0 + 61536 = N 2 0 + 61632 = N 2 0 + 61680 = N 0 0 + 61728 = N 2 0 + 61824 = N 2 0 + 61920 = N 2 0 + 61968 = N 1 0 + 62016 = N 2 0 + 62112 = N 2 0 + 62208 = N 2 0 + 62304 = N 2 0 + 62352 = N 1 0 + 62400 = N 2 0 + 62496 = N 2 0 + 62592 = N 2 0 + 62640 = N 0 0 + 62688 = N 2 0 + 62736 = N 0 0 + 62784 = N 2 0 + 62832 = N 0 0 + 62880 = N 2 0 + 62928 = N 1 0 + 62976 = N 2 0 + 63024 = N 0 0 + 63072 = N 2 0 + 63168 = N 2 0 + 63216 = N 1 0 + 63264 = N 4 0 + 63264 = N 0 0 + 63360 = N 2 0 + 63456 = N 2 0 + 63552 = N 2 0 + 63600 = N 1 0 + 63648 = N 2 0 + 63744 = N 2 0 + 63744 = N 0 0 + 63840 = N 2 0 + 63936 = N 2 0 + 64032 = N 2 0 + 64080 = N 0 0 + 64128 = N 2 0 + 64176 = N 1 0 + 64224 = N 2 0 + 64224 = N 0 0 + 64320 = N 2 0 + 64416 = N 2 0 + 64512 = N 2 0 + 64560 = N 1 0 + 64608 = N 2 0 + 64704 = N 2 0 + 64800 = N 2 0 + 64800 = S 2 768 + 64848 = N 0 0 + 64896 = N 2 0 + 64992 = N 2 0 + 65088 = N 2 0 + 65136 = N 1 0 + 65184 = N 2 0 + 65184 = N 0 0 + 65280 = N 2 0 + 65376 = N 2 0 + 65424 = N 1 0 + 65472 = N 4 0 + 65472 = N 0 0 + 65568 = N 2 0 + 65664 = N 2 0 + 65760 = N 2 0 + 65808 = N 1 0 + 65856 = N 2 0 + 65952 = N 2 0 + 66048 = N 2 0 + 66096 = N 0 0 + 66144 = N 2 0 + 66240 = N 2 0 + 66336 = N 2 0 + 66384 = N 1 0 + 66432 = N 2 0 + 66432 = N 0 0 + 66528 = N 2 0 + 66624 = N 2 0 + 66720 = N 2 0 + 66768 = N 1 0 + 66816 = N 2 0 + 66912 = N 2 0 + 67008 = N 2 0 + 67056 = N 0 0 + 67104 = N 2 0 + 67152 = N 0 0 + 67200 = N 2 0 + 67248 = N 0 0 + 67296 = N 2 0 + 67344 = N 1 0 + 67392 = N 2 0 + 67440 = N 0 0 + 67488 = N 2 0 + 67584 = N 2 0 + 67632 = N 1 0 + 67680 = N 4 0 + 67680 = N 0 0 + 67872 = N 2 0 + 68016 = N 1 0 + 68064 = N 2 0 + 68256 = N 2 0 + 68304 = N 0 0 + 68448 = N 2 0 + 68592 = N 1 0 + 68640 = N 2 0 + 68640 = N 0 0 + 68832 = N 2 0 + 68976 = N 1 0 + 69024 = N 2 0 + 69216 = N 2 0 + 69264 = N 0 0 + 69408 = N 2 0 + 69552 = N 1 0 + 69600 = N 2 0 + 69600 = N 0 0 + 69792 = N 2 0 + 69840 = N 1 0 + 69888 = N 4 0 + 69888 = N 0 0 + 70080 = N 2 0 + 70224 = N 1 0 + 70272 = N 2 0 + 70464 = N 2 0 + 70512 = N 0 0 + 70656 = N 2 0 + 70800 = N 1 0 + 70848 = N 2 0 + 70848 = N 0 0 + 71040 = N 2 0 + 71184 = N 1 0 + 71232 = N 2 0 + 71424 = N 2 0 + 71472 = N 0 0 + 71568 = N 0 0 + 71616 = N 2 0 + 71664 = N 0 0 + 71760 = N 1 0 + 71808 = N 2 0 + 71856 = N 0 0 + 72000 = N 2 0 + 72048 = N 1 0 + 72096 = N 4 0 + 72096 = N 0 0 + 72096 = S 2 768 + 72192 = N 2 0 + 72240 = N 2 0 + 72288 = N 2 0 + 72432 = N 1 0 + 72480 = N 2 0 + 72576 = N 0 0 + 72672 = N 2 0 + 72864 = N 2 0 + 72912 = N 0 0 + 73008 = N 1 0 + 73056 = N 2 0 + 73056 = N 0 0 + 73248 = N 2 0 + 73392 = N 1 0 + 73440 = N 2 0 + 73632 = N 2 0 + 73680 = N 0 0 + 73824 = N 2 0 + 73968 = N 1 0 + 74016 = N 2 0 + 74016 = N 0 0 + 74208 = N 2 0 + 74256 = N 1 0 + 74304 = N 2 0 + 74304 = N 0 0 + 74496 = N 2 0 + 74640 = N 1 0 + 74688 = N 2 0 + 74880 = N 2 0 + 74928 = N 0 0 + 75072 = N 2 0 + 75216 = N 1 0 + 75264 = N 2 0 + 75264 = N 0 0 + 75456 = N 2 0 + 75600 = N 1 0 + 75648 = N 2 0 + 75840 = N 2 0 + 75888 = N 1 0 + 75936 = N 2 0 + 75984 = N 1 0 + 76032 = N 2 0 + 76080 = N 1 0 + 76128 = N 2 0 + 76176 = N 1 0 + 76224 = N 2 0 + 76272 = N 1 0 + 76464 = N 1 0 + 76512 = N 4 0 + 76512 = N 0 0 + 76608 = N 2 0 + 76704 = N 1 0 + 76704 = N 2 0 + 76752 = N 0 0 + 76800 = N 2 0 + 76896 = N 2 0 + 76992 = N 2 0 + 76992 = N 0 0 + 77088 = N 1 0 + 77088 = N 2 0 + 77184 = N 2 0 + 77280 = N 2 0 + 77328 = N 0 0 + 77376 = N 2 0 + 77472 = N 1 0 + 77472 = N 2 0 + 77568 = N 2 0 + 77616 = N 0 0 + 77664 = N 2 0 + 77760 = N 2 0 + 77856 = N 1 0 + 77856 = N 2 0 + 77904 = N 0 0 + 77952 = N 2 0 + 78048 = N 2 0 + 78144 = N 2 0 + 78144 = N 0 0 + 78240 = N 1 0 + 78240 = N 2 0 + 78336 = N 2 0 + 78384 = N 2 0 + 78432 = N 2 0 + 78432 = N 0 0 + 78528 = N 2 0 + 78624 = N 1 0 + 78624 = N 2 0 + 78672 = N 0 0 + 78720 = N 2 0 + 78816 = N 2 0 + 78912 = N 2 0 + 78912 = N 0 0 + 79008 = N 1 0 + 79008 = N 2 0 + 79104 = N 2 0 + 79200 = N 2 0 + 79248 = N 0 0 + 79296 = N 2 0 + 79392 = N 1 0 + 79392 = N 2 0 + 79488 = N 2 0 + 79536 = N 0 0 + 79584 = N 2 0 + 79680 = N 2 0 + 79776 = N 1 0 + 79776 = N 2 0 + 79824 = N 0 0 + 79872 = N 2 0 + 79968 = N 2 0 + 80064 = N 2 0 + 80160 = N 1 0 + 80160 = N 2 0 + 80256 = N 2 0 + 80304 = N 4 0 + 80304 = N 0 0 + 80304 = S 2 816 + 80544 = N 1 0 + 80592 = N 2 0 + 80592 = N 0 0 + 80688 = N 2 0 + 80688 = N 0 0 + 80832 = N 2 0 + 80832 = N 0 0 + 80928 = N 1 0 + 80928 = N 2 0 + 81024 = N 2 0 + 81120 = N 2 0 + 81120 = N 0 0 + 81168 = N 0 0 + 81216 = N 2 0 + 81264 = N 0 0 + 81312 = N 1 0 + 81312 = N 2 0 + 81408 = N 2 0 + 81456 = N 0 0 + 81504 = N 2 0 + 81600 = N 2 0 + 81696 = N 1 0 + 81696 = N 2 0 + 81744 = N 0 0 + 81792 = N 2 0 + 81888 = N 2 0 + 81984 = N 2 0 + 82032 = N 0 0 + 82080 = N 1 0 + 82080 = N 2 0 + 82176 = N 2 0 + 82224 = N 0 0 + 82272 = N 2 0 + 82368 = N 2 0 + 82368 = N 0 0 + 82464 = N 1 0 + 82512 = N 2 0 + 82560 = N 4 0 + 82608 = N 4 0 + 82608 = N 0 0 + 82704 = N 0 0 + 82848 = N 2 0 + 82992 = N 0 0 + 83040 = N 1 0 + 83040 = N 2 0 + 83232 = N 2 0 + 83280 = N 0 0 + 83424 = N 2 0 + 83616 = N 2 0 + 83760 = N 0 0 + 83808 = N 1 0 + 83808 = N 2 0 + 83952 = N 1 0 + 84000 = N 2 0 + 84048 = N 1 0 + 84096 = N 1 0 + 84144 = N 0 0 + 84192 = N 2 0 + 84336 = N 1 0 + 84384 = N 2 0 + 84432 = N 1 0 + 84480 = N 1 0 + 84528 = N 0 0 + 84576 = N 1 0 + 84576 = N 2 0 + 84720 = N 1 0 + 84768 = N 2 0 + 84816 = N 1 0 + 84864 = N 1 0 + 84912 = N 0 0 + 84960 = N 2 0 + 85440 = N 1 0 + 85440 = N 4 0 + 85536 = N 3 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85728 = N 4 0 + 85824 = N 0 0 + 85920 = N 4 0 + 86112 = N 1 0 + 86112 = N 4 0 + 86256 = N 0 0 + 86304 = N 4 0 + 86400 = N 0 0 + 86496 = N 4 0 + 86496 = N 0 0 + 86640 = N 0 0 + 86688 = N 4 0 + 86784 = N 0 0 + 86880 = N 1 0 + 86880 = N 4 0 + 86928 = N 4 0 + 86976 = N 4 0 + 86976 = N 0 0 + 87072 = N 4 0 + 87072 = N 0 0 + 87120 = N 1 0 + 87168 = N 1 0 + 87216 = N 3 0 + 87216 = N 0 0 + 87312 = N 4 0 + 87312 = N 0 0 + 87600 = N 2 0 + 87600 = N 0 0 + 87648 = N 1 0 + 87840 = N 2 0 + 87888 = N 0 0 + 88032 = N 2 0 + 88224 = N 2 0 + 88368 = N 0 0 + 88416 = N 1 0 + 88416 = N 2 0 + 88416 = S 2 1824 + 88560 = N 1 0 + 88608 = N 2 0 + 88656 = N 1 0 + 88704 = N 1 0 + 88752 = N 0 0 + 88800 = N 2 0 + 88848 = N 1 0 + 88944 = N 1 0 + 88992 = N 2 0 + 89040 = N 1 0 + 89088 = N 1 0 + 89136 = N 0 0 + 89184 = N 1 0 + 89184 = N 2 0 + 89328 = N 1 0 + 89376 = N 2 0 + 89424 = N 1 0 + 89472 = N 1 0 + 89520 = N 0 0 + 89568 = N 2 0 + 90048 = N 1 0 + 90048 = N 4 0 + 90144 = N 3 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90336 = N 4 0 + 90432 = N 0 0 + 90528 = N 4 0 + 90720 = N 1 0 + 90720 = N 4 0 + 90864 = N 0 0 + 90912 = N 4 0 + 91008 = N 0 0 + 91104 = N 4 0 + 91104 = N 0 0 + 91248 = N 0 0 + 91296 = N 4 0 + 91392 = N 0 0 + 91488 = N 1 0 + 91488 = N 4 0 + 91584 = N 0 0 + 91680 = N 4 0 + 91680 = N 0 0 + 91728 = N 1 0 + 91776 = N 1 0 + 91824 = N 1 0 + 91872 = N 3 0 + 91872 = N 0 0 + 91920 = N 1 0 + 91968 = N 1 0 + 92016 = N 1 0 + 92064 = N 1 0 + 92112 = N 1 0 + 92160 = N 1 0 + 92208 = N 1 0 + 92256 = N 1 0 + 92304 = N 1 0 + 92352 = N 1 0 + 92400 = N 1 0 + 92448 = N 1 0 + 92496 = N 1 0 + 92544 = N 1 0 + 92592 = N 1 0 + 92640 = N 1 0 + 92688 = N 1 0 + 92736 = N 1 0 + 92784 = N 1 0 + 92832 = N 1 0 + 92880 = N 1 0 + 92928 = N 1 0 + 92976 = N 1 0 + 93024 = N 1 0 + 93072 = N 1 0 + 93120 = N 1 0 + 93168 = N 1 0 + 93216 = N 1 0 + 93264 = N 1 0 + 93312 = N 1 0 + 93360 = N 1 0 + 93408 = N 1 0 + 93456 = N 1 0 + 93504 = N 1 0 + 93552 = N 1 0 + 93600 = N 1 0 + 93648 = N 1 0 + 93696 = N 1 0 + 93744 = N 1 0 + 93792 = N 1 0 + 93840 = N 1 0 + 93888 = N 1 0 + 93936 = N 1 0 + 93984 = N 1 0 + 94032 = N 1 0 + 94080 = N 1 0 + 94128 = N 1 0 + 94176 = N 1 0 + 94224 = N 1 0 + 94272 = N 1 0 + 94320 = N 1 0 + 94368 = N 1 0 + 94416 = N 1 0 + 94464 = N 1 0 + 94512 = N 1 0 + 94560 = N 1 0 + 94608 = N 1 0 + 94656 = N 1 0 + 94704 = N 1 0 + 94752 = N 1 0 + 94800 = N 1 0 + 94848 = N 1 0 + 94896 = N 1 0 + 94944 = N 1 0 + 94992 = N 1 0 + 95040 = N 1 0 + 95088 = N 1 0 + 95136 = N 1 0 + 95184 = N 1 0 + 95232 = N 1 0 + 95280 = N 1 0 + 95328 = N 1 0 + 95376 = N 1 0 + 95424 = N 1 0 + 95472 = N 1 0 + 95520 = N 1 0 + 95568 = N 1 0 + 95616 = N 1 0 + 95664 = N 1 0 + 95712 = N 1 0 + 95760 = N 1 0 + 95808 = N 1 0 + 95856 = N 1 0 + 95904 = N 1 0 + 95952 = N 1 0 + 96000 = N 1 0 + 96048 = N 1 0 + 96096 = N 1 0 + 96144 = N 1 0 + 96192 = N 1 0 + 96240 = N 1 0 + 96288 = N 1 0 + 96336 = N 1 0 + 96384 = N 1 0 + 96432 = N 1 0 + 96480 = N 1 0 + 96528 = N 1 0 + 96576 = N 1 0 + 96624 = N 1 0 + 96672 = N 1 0 + 96720 = N 1 0 + 96768 = N 1 0 + 96816 = N 1 0 + 96864 = N 1 0 + 96912 = N 1 0 + 96960 = N 1 0 + 97008 = N 1 0 + 97056 = N 1 0 + 97104 = N 1 0 + 97152 = N 1 0 + 97200 = N 1 0 + 97248 = N 1 0 + 97248 = S 2 816 + 97296 = N 1 0 + 97344 = N 1 0 + 97392 = N 1 0 + 97440 = N 1 0 + 97488 = N 1 0 + 97536 = N 1 0 + 97584 = N 1 0 + 97632 = N 1 0 + 97680 = N 1 0 + 97728 = N 1 0 + 97776 = N 1 0 + 97824 = N 1 0 + 97872 = N 1 0 + 97920 = N 1 0 + 97968 = N 1 0 + 98016 = N 3 0 + 98016 = N 0 0 + 98064 = N 1 0 + 98112 = N 1 0 + 98160 = N 1 0 + 98208 = N 1 0 + 98256 = N 1 0 + 98304 = N 1 0 + 98352 = N 1 0 + 98400 = N 1 0 + 98448 = N 1 0 + 98496 = N 1 0 + 98544 = N 1 0 + 98592 = N 1 0 + 98640 = N 1 0 + 98688 = N 1 0 + 98736 = N 1 0 + 98784 = N 1 0 + 98832 = N 1 0 + 98880 = N 1 0 + 98928 = N 1 0 + 98976 = N 1 0 + 99024 = N 1 0 + 99072 = N 1 0 + 99120 = N 1 0 + 99168 = N 1 0 + 99216 = N 1 0 + 99264 = N 1 0 + 99312 = N 1 0 + 99360 = N 1 0 + 99408 = N 1 0 + 99456 = N 1 0 + 99504 = N 1 0 + 99552 = N 1 0 + 99600 = N 1 0 + 99648 = N 1 0 + 99696 = N 1 0 + 99744 = N 1 0 + 99792 = N 1 0 + 99840 = N 1 0 + 99888 = N 1 0 + 99936 = N 1 0 + 99984 = N 1 0 + 100032 = N 1 0 + 100080 = N 1 0 + 100128 = N 1 0 + 100176 = N 1 0 + 100224 = N 1 0 + 100272 = N 1 0 + 100320 = N 1 0 + 100368 = N 1 0 + 100416 = N 1 0 + 100464 = N 1 0 + 100512 = N 1 0 + 100560 = N 1 0 + 100608 = N 1 0 + 100656 = N 1 0 + 100704 = N 1 0 + 100752 = N 1 0 + 100800 = N 1 0 + 100848 = N 1 0 + 100896 = N 1 0 + 100944 = N 1 0 + 100992 = N 1 0 + 101040 = N 1 0 + 101088 = N 1 0 + 101136 = N 1 0 + 101184 = N 1 0 + 101232 = N 1 0 + 101280 = N 1 0 + 101328 = N 1 0 + 101376 = N 1 0 + 101424 = N 1 0 + 101472 = N 1 0 + 101520 = N 1 0 + 101568 = N 1 0 + 101616 = N 1 0 + 101664 = N 1 0 + 101712 = N 1 0 + 101760 = N 1 0 + 101808 = N 1 0 + 101856 = N 1 0 + 101904 = N 1 0 + 101952 = N 1 0 + 102000 = N 1 0 + 102048 = N 1 0 + 102096 = N 1 0 + 102144 = N 1 0 + 102192 = N 1 0 + 102240 = N 1 0 + 102288 = N 1 0 + 102336 = N 1 0 + 102384 = N 1 0 + 102432 = N 1 0 + 102480 = N 1 0 + 102528 = N 1 0 + 102576 = N 1 0 + 102624 = N 1 0 + 102672 = N 1 0 + 102720 = N 1 0 + 102768 = N 1 0 + 102816 = N 1 0 + 102864 = N 1 0 + 102912 = N 1 0 + 102960 = N 1 0 + 103008 = N 1 0 + 103056 = N 1 0 + 103104 = N 1 0 + 103152 = N 1 0 + 103200 = N 1 0 + 103248 = N 1 0 + 103296 = N 1 0 + 103344 = N 1 0 + 103392 = N 1 0 + 103440 = N 1 0 + 103488 = N 1 0 + 103536 = N 1 0 + 103584 = N 1 0 + 103632 = N 1 0 + 103680 = N 1 0 + 103728 = N 1 0 + 103776 = N 1 0 + 103824 = N 1 0 + 103872 = N 1 0 + 103920 = N 1 0 + 103968 = N 1 0 + 104016 = N 1 0 + 104064 = N 1 0 + 104112 = N 1 0 + 104160 = N 3 0 + 104160 = N 0 0 + 104160 = S 2 1536 + 104352 = N 2 0 + 104448 = N 2 0 + 104544 = N 1 0 + 104544 = N 2 0 + 104640 = N 2 0 + 104736 = N 2 0 + 104832 = N 2 0 + 104928 = N 2 0 + 105024 = N 2 0 + 105120 = N 2 0 + 105120 = N 0 0 + 105312 = N 2 0 + 105408 = N 2 0 + 105504 = N 2 0 + 105600 = N 1 0 + 105600 = N 2 0 + 105696 = N 2 0 + 105696 = N 0 0 + 105792 = N 2 0 + 105888 = N 2 0 + 105984 = N 2 0 + 106080 = N 1 0 + 106080 = N 2 0 + 106176 = N 2 0 + 106272 = N 2 0 + 106368 = N 1 0 + 106368 = N 2 0 + 106416 = N 1 0 + 106464 = N 2 0 + 106560 = N 1 0 + 106560 = N 2 0 + 106608 = N 1 0 + 106656 = N 2 0 + 106656 = N 0 0 + 106752 = N 2 0 + 106848 = N 1 0 + 106848 = N 2 0 + 106944 = N 2 0 + 106944 = N 0 0 + 107040 = N 1 0 + 107136 = N 1 0 + 107232 = N 4 0 + 107232 = N 0 0 + 107328 = N 2 0 + 107376 = N 1 0 + 107424 = N 1 0 + 107472 = N 1 0 + 107520 = N 3 0 + 107520 = N 0 0 + 107616 = N 2 0 + 107664 = N 1 0 + 107712 = N 1 0 + 107760 = N 1 0 + 107808 = N 3 0 + 107808 = N 0 0 + 107904 = N 2 0 + 108000 = N 1 0 + 108096 = N 1 0 + 108192 = N 1 0 + 108336 = N 0 0 + 108384 = N 1 0 + 108384 = N 4 0 + 108432 = N 0 0 + 108480 = N 1 0 + 108528 = N 4 0 + 108576 = N 0 0 + 108624 = N 4 0 + 108672 = N 1 0 + 108720 = N 0 0 + 108768 = N 4 0 + 108768 = N 0 0 + 108864 = N 2 0 + 108912 = N 2 0 + 108960 = N 2 0 + 109008 = N 2 0 + 109056 = N 2 0 + 109056 = N 0 0 + 109152 = N 1 0 + 109200 = N 2 0 + 109248 = N 2 0 + 109296 = N 2 0 + 109344 = N 2 0 + 109392 = N 2 0 + 109440 = N 2 0 + 109440 = N 0 0 + 109488 = N 2 0 + 109536 = N 2 0 + 109584 = N 2 0 + 109632 = N 2 0 + 109680 = N 2 0 + 109728 = N 2 0 + 109776 = N 2 0 + 109824 = N 2 0 + 109824 = N 0 0 + 109872 = N 2 0 + 109920 = N 1 0 + 109968 = N 2 0 + 110016 = N 2 0 + 110064 = N 2 0 + 110112 = N 2 0 + 110112 = N 0 0 + 110160 = N 2 0 + 110208 = N 2 0 + 110208 = N 0 0 + 110256 = N 1 0 + 110304 = N 4 0 + 110304 = N 0 0 + 110352 = N 2 0 + 110400 = N 2 0 + 110448 = N 2 0 + 110496 = N 2 0 + 110544 = N 2 0 + 110592 = N 2 0 + 110592 = N 0 0 + 110688 = N 1 0 + 110736 = N 2 0 + 110784 = N 2 0 + 110832 = N 2 0 + 110880 = N 1 0 + 110928 = N 1 0 + 110976 = N 4 0 + 110976 = N 0 0 + 111024 = N 2 0 + 111072 = N 2 0 + 111120 = N 2 0 + 111168 = N 3 0 + 111168 = N 0 0 + 111216 = N 2 0 + 111264 = N 2 0 + 111312 = N 2 0 + 111360 = N 4 0 + 111360 = N 0 0 + 111408 = N 2 0 + 111456 = N 2 0 + 111504 = N 0 0 + 111552 = N 0 0 + 111600 = N 3 0 + 111648 = N 1 0 + 111696 = N 0 0 + 111744 = N 4 0 + 111792 = N 1 0 + 111840 = N 4 0 + 111840 = N 0 0 + 111936 = N 2 0 + 111984 = N 2 0 + 112032 = N 2 0 + 112080 = N 2 0 + 112128 = N 2 0 + 112128 = N 0 0 + 112224 = N 1 0 + 112272 = N 2 0 + 112320 = N 2 0 + 112368 = N 2 0 + 112416 = N 2 0 + 112464 = N 2 0 + 112512 = N 2 0 + 112512 = N 0 0 + 112560 = N 2 0 + 112608 = N 2 0 + 112656 = N 2 0 + 112704 = N 2 0 + 112752 = N 2 0 + 112800 = N 2 0 + 112848 = N 2 0 + 112896 = N 2 0 + 112896 = N 0 0 + 112944 = N 2 0 + 112992 = N 1 0 + 113040 = N 2 0 + 113088 = N 2 0 + 113136 = N 2 0 + 113184 = N 2 0 + 113184 = N 0 0 + 113232 = N 2 0 + 113280 = N 2 0 + 113280 = N 0 0 + 113328 = N 1 0 + 113376 = N 4 0 + 113376 = N 0 0 + 113376 = S 2 1632 + 113424 = N 2 0 + 113472 = N 2 0 + 113520 = N 2 0 + 113568 = N 2 0 + 113616 = N 2 0 + 113664 = N 2 0 + 113664 = N 0 0 + 113760 = N 1 0 + 113808 = N 2 0 + 113856 = N 2 0 + 113904 = N 2 0 + 113952 = N 1 0 + 114000 = N 1 0 + 114048 = N 4 0 + 114048 = N 0 0 + 114096 = N 2 0 + 114144 = N 2 0 + 114192 = N 2 0 + 114240 = N 3 0 + 114240 = N 0 0 + 114288 = N 2 0 + 114336 = N 2 0 + 114384 = N 2 0 + 114432 = N 4 0 + 114432 = N 0 0 + 114480 = N 2 0 + 114528 = N 2 0 + 114576 = N 2 0 + 114624 = N 1 0 + 114720 = N 1 0 + 114816 = N 1 0 + 114864 = N 1 0 + 114912 = N 3 0 + 114912 = N 0 0 + 115104 = N 1 0 + 115152 = N 1 0 + 115200 = N 4 0 + 115200 = N 0 0 + 115296 = N 2 0 + 115344 = N 2 0 + 115392 = N 2 0 + 115488 = N 1 0 + 115488 = N 2 0 + 115584 = N 2 0 + 115584 = N 0 0 + 115680 = N 2 0 + 115776 = N 2 0 + 115872 = N 2 0 + 115968 = N 2 0 + 115968 = N 0 0 + 116016 = N 2 0 + 116064 = N 2 0 + 116160 = N 2 0 + 116160 = N 0 0 + 116256 = N 1 0 + 116256 = N 2 0 + 116352 = N 2 0 + 116352 = N 0 0 + 116448 = N 3 0 + 116448 = N 0 0 + 116544 = N 2 0 + 116640 = N 1 0 + 116688 = N 1 0 + 116736 = N 4 0 + 116736 = N 0 0 + 116832 = N 2 0 + 116880 = N 2 0 + 116928 = N 2 0 + 117024 = N 1 0 + 117024 = N 2 0 + 117120 = N 2 0 + 117120 = N 0 0 + 117216 = N 2 0 + 117312 = N 2 0 + 117408 = N 2 0 + 117504 = N 2 0 + 117504 = N 0 0 + 117552 = N 2 0 + 117600 = N 2 0 + 117696 = N 2 0 + 117696 = N 0 0 + 117792 = N 2 0 + 117888 = N 2 0 + 117888 = N 0 0 + 117984 = N 3 0 + 117984 = N 0 0 + 118080 = N 2 0 + 118176 = N 1 0 + 118224 = N 1 0 + 118272 = N 4 0 + 118272 = N 0 0 + 118368 = N 2 0 + 118464 = N 2 0 + 118560 = N 1 0 + 118560 = N 2 0 + 118656 = N 2 0 + 118656 = N 0 0 + 118752 = N 2 0 + 118848 = N 2 0 + 118944 = N 2 0 + 119040 = N 2 0 + 119040 = N 0 0 + 119088 = N 2 0 + 119136 = N 2 0 + 119232 = N 2 0 + 119232 = N 0 0 + 119328 = N 1 0 + 119328 = N 2 0 + 119424 = N 2 0 + 119424 = N 0 0 + 119520 = N 3 0 + 119616 = N 2 0 + 119712 = N 1 0 + 119760 = N 1 0 + 119808 = N 4 0 + 119808 = N 0 0 + 119904 = N 2 0 + 119952 = N 2 0 + 120000 = N 2 0 + 120096 = N 2 0 + 120192 = N 2 0 + 120192 = N 0 0 + 120288 = N 2 0 + 120384 = N 2 0 + 120480 = N 2 0 + 120576 = N 2 0 + 120576 = N 0 0 + 120624 = N 2 0 + 120672 = N 2 0 + 120768 = N 1 0 + 120768 = N 2 0 + 120768 = N 0 0 + 120864 = N 2 0 + 120960 = N 1 0 + 120960 = N 2 0 + 120960 = N 0 0 + 121008 = N 1 0 + 121056 = N 4 0 + 121056 = N 0 0 + 121152 = N 2 0 + 121248 = N 2 0 + 121344 = N 2 0 + 121440 = N 1 0 + 121440 = N 2 0 + 121536 = N 2 0 + 121632 = N 2 0 + 121728 = N 2 0 + 121824 = N 2 0 + 121920 = N 2 0 + 122016 = N 2 0 + 122016 = N 0 0 + 122208 = N 1 0 + 122208 = N 2 0 + 122304 = N 2 0 + 122400 = N 2 0 + 122496 = N 1 0 + 122496 = N 2 0 + 122592 = N 2 0 + 122592 = N 0 0 + 122592 = S 2 1632 + 122688 = N 2 0 + 122784 = N 2 0 + 122880 = N 2 0 + 122976 = N 1 0 + 122976 = N 2 0 + 123072 = N 2 0 + 123168 = N 2 0 + 123264 = N 1 0 + 123264 = N 2 0 + 123312 = N 1 0 + 123360 = N 2 0 + 123456 = N 1 0 + 123456 = N 2 0 + 123504 = N 1 0 + 123552 = N 2 0 + 123552 = N 0 0 + 123648 = N 2 0 + 123744 = N 1 0 + 123744 = N 2 0 + 123840 = N 2 0 + 123840 = N 0 0 + 123936 = N 2 0 + 124032 = N 2 0 + 124128 = N 4 0 + 124128 = N 0 0 + 124224 = N 2 0 + 124320 = N 2 0 + 124416 = N 2 0 + 124512 = N 1 0 + 124512 = N 2 0 + 124608 = N 2 0 + 124704 = N 2 0 + 124800 = N 2 0 + 124896 = N 2 0 + 124992 = N 2 0 + 125088 = N 2 0 + 125088 = N 0 0 + 125280 = N 1 0 + 125280 = N 2 0 + 125376 = N 2 0 + 125472 = N 2 0 + 125568 = N 1 0 + 125568 = N 2 0 + 125664 = N 2 0 + 125664 = N 0 0 + 125760 = N 2 0 + 125856 = N 2 0 + 125952 = N 2 0 + 126048 = N 1 0 + 126048 = N 2 0 + 126144 = N 2 0 + 126240 = N 2 0 + 126336 = N 1 0 + 126336 = N 2 0 + 126384 = N 1 0 + 126432 = N 2 0 + 126528 = N 1 0 + 126528 = N 2 0 + 126576 = N 1 0 + 126624 = N 2 0 + 126624 = N 0 0 + 126720 = N 2 0 + 126816 = N 1 0 + 126912 = N 2 0 + 127008 = N 4 0 + 127104 = N 0 0 + 127200 = N 3 0 + 127200 = N 0 0 + 127392 = N 4 0 + 127584 = N 1 0 + 127584 = N 4 0 + 127776 = N 4 0 + 127968 = N 4 0 + 128064 = N 1 0 + 128160 = N 4 0 + 128160 = N 0 0 + 128352 = N 1 0 + 128352 = N 4 0 + 128544 = N 4 0 + 128640 = N 2 0 + 128736 = N 4 0 + 128736 = N 0 0 + 128928 = N 4 0 + 129024 = N 2 0 + 129120 = N 1 0 + 129120 = N 4 0 + 129312 = N 2 0 + 129312 = N 4 0 + 129504 = N 4 0 + 129600 = N 1 0 + 129696 = N 4 0 + 129696 = N 0 0 + 129888 = N 1 0 + 129888 = N 4 0 + 129984 = N 0 0 + 130080 = N 4 0 + 130176 = N 0 0 + 130272 = N 3 0 + 130272 = N 4 0 + 130272 = N 0 0 + 130464 = N 4 0 + 130656 = N 1 0 + 130656 = N 4 0 + 130848 = N 4 0 + 131040 = N 4 0 + 131136 = N 1 0 + 131232 = N 4 0 + 131232 = N 0 0 + 131424 = N 1 0 + 131424 = N 4 0 + 131616 = N 4 0 + 131712 = N 2 0 + 131808 = N 4 0 + 131808 = N 0 0 + 131808 = S 2 1632 + 132000 = N 4 0 + 132096 = N 2 0 + 132192 = N 1 0 + 132192 = N 4 0 + 132384 = N 4 0 + 132480 = N 1 0 + 132576 = N 4 0 + 132672 = N 1 0 + 132768 = N 4 0 + 132768 = N 0 0 + 132960 = N 1 0 + 132960 = N 4 0 + 133152 = N 4 0 + 133344 = N 3 0 + 133344 = N 4 0 + 133344 = N 0 0 + 133536 = N 4 0 + 133728 = N 1 0 + 133728 = N 4 0 + 133920 = N 4 0 + 134112 = N 4 0 + 134208 = N 1 0 + 134304 = N 4 0 + 134304 = N 0 0 + 134496 = N 1 0 + 134496 = N 4 0 + 134688 = N 4 0 + 134784 = N 2 0 + 134880 = N 4 0 + 134880 = N 0 0 + 135072 = N 4 0 + 135168 = N 2 0 + 135264 = N 1 0 + 135264 = N 4 0 + 135456 = N 2 0 + 135456 = N 4 0 + 135648 = N 4 0 + 135744 = N 1 0 + 135840 = N 4 0 + 135840 = N 0 0 + 136032 = N 1 0 + 136032 = N 4 0 + 136128 = N 0 0 + 136224 = N 4 0 + 136320 = N 0 0 + 136416 = N 3 0 + 136416 = N 4 0 + 136416 = N 0 0 + 136608 = N 4 0 + 136800 = N 1 0 + 136800 = N 4 0 + 136992 = N 4 0 + 137184 = N 4 0 + 137280 = N 1 0 + 137376 = N 4 0 + 137376 = N 0 0 + 137568 = N 1 0 + 137568 = N 4 0 + 137760 = N 4 0 + 137856 = N 2 0 + 137952 = N 4 0 + 137952 = N 0 0 + 138144 = N 4 0 + 138240 = N 2 0 + 138336 = N 1 0 + 138336 = N 4 0 + 138528 = N 4 0 + 138624 = N 1 0 + 138720 = N 4 0 + 138816 = N 2 0 + 138912 = N 4 0 + 139008 = N 0 0 + 139104 = N 1 0 + 139104 = N 4 0 + 139200 = N 0 0 + 139296 = N 1 0 + 139296 = N 4 0 + 139392 = N 1 0 + 139392 = N 4 0 + 139488 = N 3 0 + 139488 = N 0 0 + 139680 = N 4 0 + 139872 = N 1 0 + 139872 = N 4 0 + 140064 = N 4 0 + 140256 = N 4 0 + 140256 = S 2 1632 + 140352 = N 1 0 + 140448 = N 4 0 + 140448 = N 0 0 + 140640 = N 1 0 + 140640 = N 4 0 + 140832 = N 4 0 + 140928 = N 2 0 + 141024 = N 4 0 + 141024 = N 0 0 + 141216 = N 4 0 + 141312 = N 2 0 + 141408 = N 1 0 + 141408 = N 4 0 + 141600 = N 2 0 + 141600 = N 4 0 + 141792 = N 4 0 + 141984 = N 4 0 + 141984 = N 0 0 + 142176 = N 1 0 + 142176 = N 4 0 + 142272 = N 0 0 + 142368 = N 4 0 + 142560 = N 3 0 + 142560 = N 4 0 + 142560 = N 0 0 + 142752 = N 4 0 + 142944 = N 1 0 + 142944 = N 4 0 + 143136 = N 4 0 + 143328 = N 4 0 + 143424 = N 1 0 + 143520 = N 4 0 + 143520 = N 0 0 + 143712 = N 1 0 + 143712 = N 4 0 + 143904 = N 4 0 + 144000 = N 2 0 + 144096 = N 4 0 + 144096 = N 0 0 + 144288 = N 4 0 + 144384 = N 2 0 + 144480 = N 1 0 + 144480 = N 4 0 + 144672 = N 4 0 + 144768 = N 1 0 + 144864 = N 4 0 + 144960 = N 1 0 + 145056 = N 4 0 + 145056 = N 0 0 + 145248 = N 1 0 + 145248 = N 4 0 + 145440 = N 4 0 + 145632 = N 3 0 + 145632 = N 4 0 + 145632 = N 0 0 + 145824 = N 4 0 + 146016 = N 1 0 + 146016 = N 4 0 + 146208 = N 4 0 + 146400 = N 4 0 + 146496 = N 1 0 + 146592 = N 4 0 + 146592 = N 0 0 + 146784 = N 1 0 + 146784 = N 4 0 + 146976 = N 4 0 + 147072 = N 2 0 + 147168 = N 4 0 + 147168 = N 0 0 + 147360 = N 4 0 + 147456 = N 2 0 + 147552 = N 1 0 + 147552 = N 4 0 + 147744 = N 2 0 + 147744 = N 4 0 + 147936 = N 4 0 + 148032 = N 1 0 + 148128 = N 4 0 + 148128 = N 0 0 + 148320 = N 1 0 + 148320 = N 4 0 + 148416 = N 0 0 + 148512 = N 4 0 + 148608 = N 0 0 + 148704 = N 3 0 + 148704 = N 4 0 + 148704 = N 0 0 + 148896 = N 4 0 + 149088 = N 1 0 + 149088 = N 4 0 + 149280 = N 4 0 + 149472 = N 4 0 + 149568 = N 1 0 + 149664 = N 4 0 + 149664 = N 0 0 + 149856 = N 1 0 + 149856 = N 4 0 + 150048 = N 4 0 + 150144 = N 2 0 + 150240 = N 4 0 + 150240 = N 0 0 + 150432 = N 4 0 + 150528 = N 2 0 + 150624 = N 1 0 + 150624 = N 4 0 + 150816 = N 4 0 + 150912 = N 1 0 + 151008 = N 4 0 + 151104 = N 1 0 + 151200 = N 4 0 + 151200 = N 0 0 + 151392 = N 1 0 + 151488 = N 2 0 + 151584 = N 4 0 + 151680 = N 4 0 +} +[HardDrums] +{ + 1536 = N 4 0 + 1536 = N 0 0 + 1632 = N 0 0 + 1728 = N 2 0 + 1824 = N 2 0 + 1920 = N 1 0 + 1920 = N 2 0 + 2016 = N 2 0 + 2112 = N 2 0 + 2208 = N 2 0 + 2304 = N 2 0 + 2400 = N 2 0 + 2496 = N 2 0 + 2496 = N 0 0 + 2592 = N 2 0 + 2592 = N 0 0 + 2688 = N 1 0 + 2688 = N 2 0 + 2784 = N 0 0 + 2880 = N 1 0 + 2880 = N 2 0 + 2976 = N 1 0 + 3072 = N 2 0 + 3072 = N 0 0 + 3168 = N 0 0 + 3264 = N 2 0 + 3360 = N 2 0 + 3456 = N 1 0 + 3456 = N 2 0 + 3552 = N 1 0 + 3552 = N 2 0 + 3648 = N 2 0 + 3744 = N 2 0 + 3840 = N 2 0 + 3840 = S 2 960 + 3936 = N 2 0 + 4032 = N 2 0 + 4032 = N 0 0 + 4128 = N 0 0 + 4224 = N 1 0 + 4224 = N 2 0 + 4320 = N 1 0 + 4416 = N 4 0 + 4512 = N 4 0 + 4608 = N 4 0 + 4608 = N 0 0 + 4800 = N 2 0 + 4896 = N 2 0 + 4992 = N 1 0 + 4992 = N 2 0 + 5088 = N 2 0 + 5184 = N 2 0 + 5280 = N 2 0 + 5376 = N 2 0 + 5472 = N 2 0 + 5568 = N 2 0 + 5568 = N 0 0 + 5664 = N 2 0 + 5760 = N 1 0 + 5760 = N 2 0 + 5856 = N 2 0 + 5952 = N 2 0 + 6048 = N 2 0 + 6144 = N 2 0 + 6144 = N 0 0 + 6240 = N 2 0 + 6336 = N 2 0 + 6432 = N 2 0 + 6528 = N 1 0 + 6528 = N 2 0 + 6624 = N 2 0 + 6720 = N 2 0 + 6816 = N 2 0 + 6912 = N 2 0 + 7008 = N 2 0 + 7104 = N 2 0 + 7104 = N 0 0 + 7200 = N 2 0 + 7296 = N 1 0 + 7296 = N 2 0 + 7392 = N 2 0 + 7392 = N 0 0 + 7488 = N 1 0 + 7584 = N 1 0 + 7680 = N 4 0 + 7680 = N 0 0 + 7776 = N 2 0 + 7872 = N 1 0 + 7968 = N 3 0 + 7968 = N 0 0 + 8064 = N 2 0 + 8160 = N 1 0 + 8256 = N 4 0 + 8256 = N 0 0 + 8352 = N 2 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8784 = N 0 0 + 8832 = N 1 0 + 8832 = N 4 0 + 8928 = N 1 0 + 8976 = N 4 0 + 9072 = N 4 0 + 9120 = N 1 0 + 9216 = N 4 0 + 9216 = N 0 0 + 9312 = N 2 0 + 9408 = N 2 0 + 9504 = N 2 0 + 9504 = N 0 0 + 9600 = N 1 0 + 9600 = N 2 0 + 9696 = N 2 0 + 9792 = N 2 0 + 9888 = N 2 0 + 9888 = N 0 0 + 9984 = N 2 0 + 10080 = N 2 0 + 10176 = N 2 0 + 10272 = N 2 0 + 10272 = N 0 0 + 10368 = N 1 0 + 10368 = N 2 0 + 10464 = N 2 0 + 10560 = N 2 0 + 10560 = N 0 0 + 10656 = N 2 0 + 10656 = N 0 0 + 10704 = N 1 0 + 10752 = N 4 0 + 10752 = N 0 0 + 10848 = N 2 0 + 10944 = N 2 0 + 11040 = N 2 0 + 11040 = N 0 0 + 11136 = N 1 0 + 11232 = N 2 0 + 11328 = N 1 0 + 11424 = N 4 0 + 11424 = N 0 0 + 11424 = S 2 912 + 11520 = N 2 0 + 11616 = N 3 0 + 11616 = N 0 0 + 11712 = N 2 0 + 11808 = N 4 0 + 11808 = N 0 0 + 11904 = N 2 0 + 12000 = N 0 0 + 12048 = N 3 0 + 12096 = N 1 0 + 12192 = N 4 0 + 12240 = N 1 0 + 12288 = N 4 0 + 12288 = N 0 0 + 12384 = N 2 0 + 12480 = N 2 0 + 12576 = N 2 0 + 12576 = N 0 0 + 12672 = N 1 0 + 12672 = N 2 0 + 12768 = N 2 0 + 12864 = N 2 0 + 12960 = N 2 0 + 12960 = N 0 0 + 13056 = N 2 0 + 13152 = N 2 0 + 13248 = N 2 0 + 13344 = N 2 0 + 13344 = N 0 0 + 13440 = N 1 0 + 13440 = N 2 0 + 13536 = N 2 0 + 13632 = N 2 0 + 13632 = N 0 0 + 13728 = N 2 0 + 13728 = N 0 0 + 13776 = N 1 0 + 13824 = N 4 0 + 13824 = N 0 0 + 13920 = N 2 0 + 14016 = N 2 0 + 14112 = N 2 0 + 14112 = N 0 0 + 14208 = N 1 0 + 14304 = N 2 0 + 14400 = N 1 0 + 14496 = N 4 0 + 14496 = N 0 0 + 14592 = N 2 0 + 14688 = N 3 0 + 14688 = N 0 0 + 14784 = N 2 0 + 14880 = N 4 0 + 14880 = N 0 0 + 14976 = N 2 0 + 15072 = N 1 0 + 15168 = N 1 0 + 15264 = N 1 0 + 15360 = N 3 0 + 15360 = N 0 0 + 15552 = N 1 0 + 15648 = N 4 0 + 15648 = N 0 0 + 15744 = N 2 0 + 15840 = N 2 0 + 15936 = N 1 0 + 15936 = N 2 0 + 16032 = N 2 0 + 16032 = N 0 0 + 16128 = N 2 0 + 16224 = N 2 0 + 16320 = N 1 0 + 16320 = N 2 0 + 16416 = N 2 0 + 16416 = N 0 0 + 16512 = N 2 0 + 16608 = N 2 0 + 16608 = N 0 0 + 16704 = N 1 0 + 16704 = N 2 0 + 16800 = N 2 0 + 16896 = N 3 0 + 16896 = N 0 0 + 16992 = N 2 0 + 17088 = N 1 0 + 17184 = N 4 0 + 17184 = N 0 0 + 17280 = N 2 0 + 17376 = N 2 0 + 17472 = N 1 0 + 17472 = N 2 0 + 17568 = N 2 0 + 17568 = N 0 0 + 17664 = N 2 0 + 17760 = N 2 0 + 17856 = N 1 0 + 17856 = N 2 0 + 17952 = N 2 0 + 17952 = N 0 0 + 18048 = N 2 0 + 18144 = N 2 0 + 18144 = N 0 0 + 18240 = N 1 0 + 18240 = N 2 0 + 18336 = N 2 0 + 18336 = N 0 0 + 18432 = N 3 0 + 18432 = N 0 0 + 18528 = N 2 0 + 18624 = N 1 0 + 18720 = N 4 0 + 18720 = N 0 0 + 18816 = N 2 0 + 18912 = N 2 0 + 19008 = N 1 0 + 19008 = N 2 0 + 19104 = N 2 0 + 19104 = N 0 0 + 19200 = N 2 0 + 19296 = N 2 0 + 19392 = N 1 0 + 19392 = N 2 0 + 19488 = N 2 0 + 19488 = N 0 0 + 19584 = N 2 0 + 19680 = N 2 0 + 19680 = N 0 0 + 19776 = N 1 0 + 19776 = N 2 0 + 19872 = N 2 0 + 19872 = N 0 0 + 19968 = N 3 0 + 19968 = N 0 0 + 19968 = S 2 1536 + 20064 = N 2 0 + 20160 = N 1 0 + 20256 = N 4 0 + 20256 = N 0 0 + 20352 = N 2 0 + 20448 = N 2 0 + 20544 = N 1 0 + 20544 = N 2 0 + 20640 = N 2 0 + 20640 = N 0 0 + 20736 = N 2 0 + 20832 = N 2 0 + 20928 = N 1 0 + 20928 = N 2 0 + 21024 = N 2 0 + 21024 = N 0 0 + 21120 = N 2 0 + 21216 = N 2 0 + 21216 = N 0 0 + 21312 = N 1 0 + 21312 = N 2 0 + 21408 = N 2 0 + 21408 = N 0 0 + 21456 = N 1 0 + 21984 = N 1 0 + 22080 = N 4 0 + 22080 = N 0 0 + 22272 = N 3 0 + 22272 = N 0 0 + 22464 = N 4 0 + 22464 = N 0 0 + 22656 = N 1 0 + 22656 = N 2 0 + 22752 = N 0 0 + 22848 = N 2 0 + 22944 = N 0 0 + 23040 = N 2 0 + 23040 = N 0 0 + 23136 = N 2 0 + 23232 = N 2 0 + 23232 = N 0 0 + 23328 = N 0 0 + 23424 = N 1 0 + 23424 = N 2 0 + 23520 = N 0 0 + 23616 = N 2 0 + 23616 = N 0 0 + 23808 = N 2 0 + 23808 = N 0 0 + 24000 = N 2 0 + 24000 = N 0 0 + 24096 = N 1 0 + 24192 = N 4 0 + 24192 = N 0 0 + 24288 = N 2 0 + 24384 = N 2 0 + 24480 = N 3 0 + 24480 = N 0 0 + 24576 = N 1 0 + 24672 = N 0 0 + 24768 = N 2 0 + 24768 = N 0 0 + 24960 = N 2 0 + 24960 = N 0 0 + 25056 = N 2 0 + 25152 = N 2 0 + 25152 = N 0 0 + 25344 = N 1 0 + 25344 = N 2 0 + 25440 = N 0 0 + 25536 = N 2 0 + 25632 = N 2 0 + 25632 = N 0 0 + 25728 = N 0 0 + 25824 = N 2 0 + 25920 = N 1 0 + 25920 = N 2 0 + 26016 = N 2 0 + 26016 = N 0 0 + 26112 = N 2 0 + 26208 = N 2 0 + 26208 = N 0 0 + 26304 = N 2 0 + 26304 = N 0 0 + 26400 = N 2 0 + 26496 = N 2 0 + 26496 = N 0 0 + 26592 = N 2 0 + 26688 = N 2 0 + 26688 = N 0 0 + 26784 = N 1 0 + 26880 = N 4 0 + 26880 = N 0 0 + 27072 = N 2 0 + 27264 = N 1 0 + 27264 = N 2 0 + 27360 = N 0 0 + 27456 = N 2 0 + 27456 = N 0 0 + 27648 = N 2 0 + 27648 = N 0 0 + 27744 = N 2 0 + 27840 = N 2 0 + 27840 = N 0 0 + 28032 = N 1 0 + 28032 = N 2 0 + 28128 = N 0 0 + 28224 = N 2 0 + 28224 = S 2 1440 + 28320 = N 0 0 + 28416 = N 2 0 + 28416 = N 0 0 + 28512 = N 2 0 + 28608 = N 2 0 + 28608 = N 0 0 + 28704 = N 0 0 + 28800 = N 1 0 + 28800 = N 2 0 + 28896 = N 0 0 + 28992 = N 2 0 + 28992 = N 0 0 + 29184 = N 2 0 + 29184 = N 0 0 + 29280 = N 2 0 + 29376 = N 2 0 + 29376 = N 0 0 + 29472 = N 1 0 + 29568 = N 4 0 + 29568 = N 0 0 + 29664 = N 2 0 + 29760 = N 2 0 + 29856 = N 3 0 + 29856 = N 0 0 + 29952 = N 1 0 + 30048 = N 0 0 + 30144 = N 2 0 + 30144 = N 0 0 + 30336 = N 2 0 + 30336 = N 0 0 + 30432 = N 2 0 + 30528 = N 2 0 + 30528 = N 0 0 + 30720 = N 1 0 + 30720 = N 2 0 + 30816 = N 0 0 + 30912 = N 2 0 + 31008 = N 2 0 + 31008 = N 0 0 + 31104 = N 0 0 + 31200 = N 2 0 + 31296 = N 1 0 + 31296 = N 2 0 + 31392 = N 2 0 + 31392 = N 0 0 + 31488 = N 2 0 + 31584 = N 2 0 + 31584 = N 0 0 + 31680 = N 0 0 + 31776 = N 2 0 + 31872 = N 2 0 + 31872 = N 0 0 + 31968 = N 2 0 + 32064 = N 2 0 + 32064 = N 0 0 + 32160 = N 1 0 + 32256 = N 4 0 + 32256 = N 0 0 + 32448 = N 2 0 + 32544 = N 2 0 + 32640 = N 1 0 + 32640 = N 2 0 + 32736 = N 2 0 + 32832 = N 2 0 + 32928 = N 2 0 + 33024 = N 2 0 + 33120 = N 2 0 + 33216 = N 2 0 + 33216 = N 0 0 + 33312 = N 2 0 + 33408 = N 1 0 + 33408 = N 2 0 + 33504 = N 2 0 + 33600 = N 2 0 + 33696 = N 2 0 + 33792 = N 4 0 + 33792 = N 0 0 + 33888 = N 2 0 + 33984 = N 2 0 + 34080 = N 2 0 + 34080 = N 0 0 + 34176 = N 1 0 + 34176 = N 2 0 + 34272 = N 2 0 + 34368 = N 2 0 + 34464 = N 2 0 + 34560 = N 2 0 + 34656 = N 2 0 + 34656 = N 0 0 + 34752 = N 2 0 + 34848 = N 2 0 + 34944 = N 1 0 + 34944 = N 2 0 + 35040 = N 2 0 + 35040 = N 0 0 + 35136 = N 2 0 + 35232 = N 1 0 + 35232 = N 2 0 + 35328 = N 2 0 + 35424 = N 2 0 + 35424 = N 0 0 + 35520 = N 1 0 + 35520 = N 2 0 + 35616 = N 4 0 + 35616 = N 0 0 + 35712 = N 2 0 + 35808 = N 2 0 + 35904 = N 1 0 + 35904 = N 2 0 + 36000 = N 2 0 + 36096 = N 2 0 + 36144 = N 0 0 + 36288 = N 1 0 + 36288 = N 2 0 + 36384 = N 2 0 + 36432 = N 0 0 + 36480 = N 2 0 + 36576 = N 2 0 + 36672 = N 1 0 + 36672 = N 2 0 + 36768 = N 2 0 + 36768 = N 0 0 + 36864 = N 2 0 + 36912 = N 0 0 + 37056 = N 1 0 + 37056 = N 2 0 + 37104 = N 0 0 + 37152 = N 2 0 + 37248 = N 4 0 + 37248 = N 0 0 + 37248 = S 2 1584 + 37440 = N 1 0 + 37440 = N 2 0 + 37536 = N 2 0 + 37632 = N 2 0 + 37728 = N 2 0 + 37776 = N 0 0 + 37824 = N 1 0 + 37824 = N 2 0 + 37920 = N 2 0 + 38016 = N 2 0 + 38064 = N 0 0 + 38208 = N 1 0 + 38208 = N 2 0 + 38304 = N 2 0 + 38400 = N 2 0 + 38400 = N 0 0 + 38544 = N 0 0 + 38592 = N 1 0 + 38592 = N 2 0 + 38688 = N 1 0 + 38784 = N 4 0 + 38784 = N 0 0 + 38880 = N 2 0 + 38976 = N 2 0 + 39072 = N 2 0 + 39168 = N 2 0 + 39264 = N 1 0 + 39264 = N 2 0 + 39360 = N 0 0 + 39456 = N 2 0 + 39552 = N 2 0 + 39600 = N 0 0 + 39648 = N 2 0 + 39744 = N 2 0 + 39840 = N 2 0 + 39936 = N 2 0 + 39936 = N 0 0 + 40032 = N 1 0 + 40032 = N 2 0 + 40224 = N 2 0 + 40368 = N 0 0 + 40416 = N 2 0 + 40512 = N 2 0 + 40608 = N 2 0 + 40704 = N 2 0 + 40800 = N 1 0 + 40800 = N 2 0 + 40896 = N 2 0 + 40944 = N 0 0 + 40992 = N 2 0 + 41088 = N 2 0 + 41184 = N 2 0 + 41280 = N 2 0 + 41376 = N 2 0 + 41472 = N 2 0 + 41520 = N 0 0 + 41568 = N 1 0 + 41568 = N 2 0 + 41712 = N 1 0 + 41760 = N 1 0 + 41856 = N 4 0 + 41952 = N 4 0 + 41952 = N 0 0 + 42096 = N 2 0 + 42240 = N 4 0 + 42384 = N 4 0 + 42528 = N 4 0 + 43200 = N 2 0 + 43296 = N 2 0 + 43392 = N 4 0 + 43488 = N 4 0 + 43488 = N 0 0 + 43632 = N 4 0 + 44352 = N 4 0 + 44400 = N 4 0 + 44448 = N 4 0 + 44496 = N 4 0 + 44544 = N 4 0 + 44592 = N 4 0 + 44640 = N 4 0 + 44688 = N 4 0 + 44736 = N 4 0 + 44784 = N 4 0 + 44832 = N 4 0 + 44880 = N 4 0 + 44928 = N 4 0 + 44976 = N 4 0 + 45024 = N 4 0 + 45168 = N 4 0 + 46272 = N 2 0 + 46368 = N 1 0 + 46560 = N 4 0 + 46560 = N 0 0 + 46656 = N 2 0 + 46752 = N 2 0 + 46848 = N 2 0 + 46944 = N 1 0 + 46944 = N 2 0 + 47040 = N 2 0 + 47136 = N 2 0 + 47232 = N 2 0 + 47328 = N 2 0 + 47328 = S 2 864 + 47424 = N 2 0 + 47424 = N 0 0 + 47520 = N 2 0 + 47520 = N 0 0 + 47616 = N 2 0 + 47712 = N 1 0 + 47712 = N 2 0 + 47904 = N 2 0 + 48000 = N 2 0 + 48096 = N 2 0 + 48096 = N 0 0 + 48192 = N 2 0 + 48288 = N 2 0 + 48384 = N 2 0 + 48480 = N 1 0 + 48480 = N 2 0 + 48576 = N 2 0 + 48672 = N 2 0 + 48768 = N 2 0 + 48864 = N 2 0 + 48960 = N 2 0 + 48960 = N 0 0 + 49056 = N 2 0 + 49056 = N 0 0 + 49152 = N 2 0 + 49248 = N 1 0 + 49248 = N 2 0 + 49344 = N 2 0 + 49440 = N 2 0 + 49536 = N 2 0 + 49632 = N 4 0 + 49632 = N 0 0 + 49728 = N 2 0 + 49824 = N 2 0 + 49920 = N 2 0 + 50016 = N 1 0 + 50016 = N 2 0 + 50112 = N 2 0 + 50208 = N 2 0 + 50304 = N 2 0 + 50400 = N 2 0 + 50496 = N 2 0 + 50496 = N 0 0 + 50592 = N 2 0 + 50592 = N 0 0 + 50784 = N 1 0 + 50784 = N 2 0 + 50880 = N 2 0 + 50976 = N 2 0 + 51072 = N 2 0 + 51168 = N 2 0 + 51168 = N 0 0 + 51264 = N 2 0 + 51360 = N 2 0 + 51456 = N 2 0 + 51552 = N 1 0 + 51552 = N 2 0 + 51648 = N 2 0 + 51744 = N 2 0 + 51840 = N 2 0 + 51936 = N 2 0 + 52032 = N 2 0 + 52032 = N 0 0 + 52128 = N 2 0 + 52128 = N 0 0 + 52224 = N 2 0 + 52320 = N 1 0 + 52320 = N 2 0 + 52416 = N 3 0 + 52512 = N 2 0 + 52608 = N 3 0 + 52704 = N 4 0 + 52704 = N 0 0 + 52896 = N 2 0 + 52992 = N 2 0 + 53088 = N 1 0 + 53088 = N 2 0 + 53184 = N 2 0 + 53280 = N 2 0 + 53472 = N 2 0 + 53568 = N 2 0 + 53568 = N 0 0 + 53664 = N 2 0 + 53664 = N 0 0 + 53856 = N 1 0 + 53856 = N 2 0 + 54048 = N 2 0 + 54240 = N 2 0 + 54240 = N 0 0 + 54336 = N 2 0 + 54432 = N 2 0 + 54528 = N 2 0 + 54624 = N 1 0 + 54624 = N 2 0 + 54720 = N 2 0 + 54816 = N 2 0 + 55008 = N 2 0 + 55104 = N 2 0 + 55104 = N 0 0 + 55200 = N 2 0 + 55200 = N 0 0 + 55296 = N 2 0 + 55392 = N 1 0 + 55392 = N 2 0 + 55488 = N 2 0 + 55584 = N 2 0 + 55680 = N 2 0 + 55776 = N 4 0 + 55776 = N 0 0 + 55776 = S 2 864 + 55968 = N 2 0 + 56160 = N 1 0 + 56160 = N 2 0 + 56256 = N 2 0 + 56352 = N 2 0 + 56448 = N 2 0 + 56544 = N 2 0 + 56640 = N 2 0 + 56640 = N 0 0 + 56736 = N 2 0 + 56736 = N 0 0 + 56832 = N 2 0 + 56928 = N 1 0 + 56928 = N 2 0 + 57024 = N 2 0 + 57120 = N 2 0 + 57216 = N 2 0 + 57312 = N 2 0 + 57312 = N 0 0 + 57408 = N 2 0 + 57504 = N 2 0 + 57600 = N 2 0 + 57696 = N 1 0 + 57696 = N 2 0 + 57792 = N 2 0 + 57888 = N 2 0 + 57984 = N 2 0 + 58080 = N 2 0 + 58176 = N 2 0 + 58176 = N 0 0 + 58272 = N 2 0 + 58272 = N 0 0 + 58368 = N 2 0 + 58464 = N 1 0 + 58512 = N 1 0 + 58608 = N 1 0 + 58656 = N 1 0 + 58752 = N 4 0 + 58848 = N 4 0 + 58848 = N 0 0 + 59040 = N 2 0 + 59184 = N 1 0 + 59232 = N 2 0 + 59424 = N 2 0 + 59472 = N 0 0 + 59616 = N 2 0 + 59760 = N 1 0 + 59808 = N 2 0 + 59808 = N 0 0 + 60000 = N 2 0 + 60144 = N 1 0 + 60192 = N 2 0 + 60384 = N 2 0 + 60432 = N 0 0 + 60576 = N 2 0 + 60720 = N 1 0 + 60768 = N 2 0 + 60768 = N 0 0 + 60864 = N 2 0 + 61008 = N 1 0 + 61056 = N 2 0 + 61056 = N 0 0 + 61248 = N 2 0 + 61392 = N 1 0 + 61440 = N 2 0 + 61632 = N 2 0 + 61680 = N 0 0 + 61824 = N 2 0 + 61968 = N 1 0 + 62016 = N 2 0 + 62208 = N 2 0 + 62352 = N 1 0 + 62400 = N 2 0 + 62640 = N 0 0 + 62736 = N 0 0 + 62832 = N 0 0 + 62928 = N 1 0 + 63024 = N 0 0 + 63216 = N 1 0 + 63264 = N 4 0 + 63264 = N 0 0 + 63456 = N 2 0 + 63600 = N 1 0 + 63648 = N 2 0 + 63744 = N 0 0 + 63840 = N 2 0 + 64032 = N 2 0 + 64080 = N 0 0 + 64176 = N 1 0 + 64224 = N 2 0 + 64224 = N 0 0 + 64416 = N 2 0 + 64560 = N 1 0 + 64608 = N 2 0 + 64800 = N 2 0 + 64800 = S 2 768 + 64848 = N 0 0 + 64992 = N 2 0 + 65136 = N 1 0 + 65184 = N 2 0 + 65184 = N 0 0 + 65280 = N 2 0 + 65424 = N 1 0 + 65472 = N 4 0 + 65472 = N 0 0 + 65664 = N 2 0 + 65808 = N 1 0 + 65856 = N 2 0 + 66048 = N 2 0 + 66096 = N 0 0 + 66240 = N 2 0 + 66384 = N 1 0 + 66432 = N 2 0 + 66432 = N 0 0 + 66624 = N 2 0 + 66768 = N 1 0 + 66816 = N 2 0 + 67056 = N 0 0 + 67152 = N 0 0 + 67248 = N 0 0 + 67344 = N 1 0 + 67440 = N 0 0 + 67632 = N 1 0 + 67680 = N 4 0 + 67680 = N 0 0 + 67872 = N 2 0 + 68016 = N 1 0 + 68064 = N 2 0 + 68256 = N 2 0 + 68304 = N 0 0 + 68448 = N 2 0 + 68592 = N 1 0 + 68640 = N 2 0 + 68640 = N 0 0 + 68832 = N 2 0 + 68976 = N 1 0 + 69024 = N 2 0 + 69216 = N 2 0 + 69264 = N 0 0 + 69408 = N 2 0 + 69552 = N 1 0 + 69600 = N 2 0 + 69600 = N 0 0 + 69840 = N 1 0 + 69888 = N 4 0 + 69888 = N 0 0 + 70080 = N 2 0 + 70224 = N 1 0 + 70272 = N 2 0 + 70464 = N 2 0 + 70512 = N 0 0 + 70656 = N 2 0 + 70800 = N 1 0 + 70848 = N 2 0 + 70848 = N 0 0 + 71040 = N 2 0 + 71184 = N 1 0 + 71232 = N 2 0 + 71424 = N 2 0 + 71472 = N 0 0 + 71568 = N 0 0 + 71616 = N 2 0 + 71664 = N 0 0 + 71760 = N 1 0 + 71808 = N 2 0 + 71856 = N 0 0 + 72048 = N 1 0 + 72096 = N 4 0 + 72096 = N 0 0 + 72096 = S 2 768 + 72192 = N 2 0 + 72288 = N 2 0 + 72432 = N 1 0 + 72480 = N 2 0 + 72576 = N 0 0 + 72672 = N 2 0 + 72864 = N 2 0 + 72912 = N 0 0 + 73008 = N 1 0 + 73056 = N 2 0 + 73056 = N 0 0 + 73248 = N 2 0 + 73392 = N 1 0 + 73440 = N 2 0 + 73632 = N 2 0 + 73680 = N 0 0 + 73824 = N 2 0 + 73968 = N 1 0 + 74016 = N 2 0 + 74016 = N 0 0 + 74256 = N 1 0 + 74304 = N 2 0 + 74304 = N 0 0 + 74496 = N 2 0 + 74640 = N 1 0 + 74688 = N 2 0 + 74880 = N 2 0 + 74928 = N 0 0 + 75072 = N 2 0 + 75216 = N 1 0 + 75264 = N 2 0 + 75264 = N 0 0 + 75456 = N 2 0 + 75600 = N 1 0 + 75648 = N 2 0 + 75888 = N 1 0 + 75984 = N 1 0 + 76080 = N 1 0 + 76176 = N 1 0 + 76272 = N 1 0 + 76464 = N 1 0 + 76512 = N 4 0 + 76512 = N 0 0 + 76608 = N 2 0 + 76704 = N 1 0 + 76704 = N 2 0 + 76752 = N 0 0 + 76800 = N 2 0 + 76896 = N 2 0 + 76992 = N 2 0 + 76992 = N 0 0 + 77088 = N 1 0 + 77088 = N 2 0 + 77184 = N 2 0 + 77280 = N 2 0 + 77328 = N 0 0 + 77376 = N 2 0 + 77472 = N 1 0 + 77472 = N 2 0 + 77568 = N 2 0 + 77616 = N 0 0 + 77664 = N 2 0 + 77760 = N 2 0 + 77856 = N 1 0 + 77856 = N 2 0 + 77904 = N 0 0 + 77952 = N 2 0 + 78048 = N 2 0 + 78144 = N 2 0 + 78144 = N 0 0 + 78240 = N 1 0 + 78240 = N 2 0 + 78336 = N 2 0 + 78432 = N 2 0 + 78432 = N 0 0 + 78528 = N 2 0 + 78624 = N 1 0 + 78624 = N 2 0 + 78672 = N 0 0 + 78720 = N 2 0 + 78816 = N 2 0 + 78912 = N 2 0 + 78912 = N 0 0 + 79008 = N 1 0 + 79008 = N 2 0 + 79104 = N 2 0 + 79200 = N 2 0 + 79248 = N 0 0 + 79296 = N 2 0 + 79392 = N 1 0 + 79392 = N 2 0 + 79488 = N 2 0 + 79536 = N 0 0 + 79584 = N 2 0 + 79680 = N 2 0 + 79776 = N 1 0 + 79776 = N 2 0 + 79824 = N 0 0 + 79872 = N 2 0 + 79968 = N 2 0 + 80064 = N 2 0 + 80160 = N 1 0 + 80160 = N 2 0 + 80304 = N 4 0 + 80304 = N 0 0 + 80304 = S 2 816 + 80544 = N 1 0 + 80592 = N 2 0 + 80592 = N 0 0 + 80688 = N 2 0 + 80688 = N 0 0 + 80832 = N 2 0 + 80832 = N 0 0 + 80928 = N 1 0 + 80928 = N 2 0 + 81024 = N 2 0 + 81120 = N 2 0 + 81120 = N 0 0 + 81216 = N 2 0 + 81264 = N 0 0 + 81312 = N 1 0 + 81312 = N 2 0 + 81408 = N 2 0 + 81456 = N 0 0 + 81504 = N 2 0 + 81600 = N 2 0 + 81696 = N 1 0 + 81696 = N 2 0 + 81744 = N 0 0 + 81792 = N 2 0 + 81888 = N 2 0 + 81984 = N 2 0 + 82032 = N 0 0 + 82080 = N 1 0 + 82080 = N 2 0 + 82176 = N 2 0 + 82224 = N 0 0 + 82272 = N 2 0 + 82368 = N 2 0 + 82368 = N 0 0 + 82464 = N 1 0 + 82608 = N 4 0 + 82608 = N 0 0 + 82704 = N 0 0 + 82848 = N 2 0 + 82992 = N 0 0 + 83040 = N 1 0 + 83040 = N 2 0 + 83232 = N 2 0 + 83280 = N 0 0 + 83424 = N 2 0 + 83616 = N 2 0 + 83760 = N 0 0 + 83808 = N 1 0 + 83808 = N 2 0 + 84000 = N 2 0 + 84144 = N 0 0 + 84192 = N 2 0 + 84384 = N 2 0 + 84528 = N 0 0 + 84576 = N 1 0 + 84576 = N 2 0 + 84768 = N 2 0 + 84912 = N 0 0 + 84960 = N 2 0 + 85440 = N 1 0 + 85440 = N 4 0 + 85536 = N 3 0 + 85536 = N 0 0 + 85680 = N 0 0 + 85728 = N 4 0 + 85824 = N 0 0 + 85920 = N 4 0 + 86112 = N 1 0 + 86112 = N 4 0 + 86256 = N 0 0 + 86304 = N 4 0 + 86400 = N 0 0 + 86496 = N 4 0 + 86496 = N 0 0 + 86640 = N 0 0 + 86688 = N 4 0 + 86784 = N 0 0 + 86880 = N 1 0 + 86880 = N 4 0 + 86976 = N 4 0 + 86976 = N 0 0 + 87072 = N 4 0 + 87072 = N 0 0 + 87168 = N 1 0 + 87216 = N 3 0 + 87216 = N 0 0 + 87312 = N 4 0 + 87312 = N 0 0 + 87600 = N 2 0 + 87600 = N 0 0 + 87648 = N 1 0 + 87840 = N 2 0 + 87888 = N 0 0 + 88032 = N 2 0 + 88224 = N 2 0 + 88368 = N 0 0 + 88416 = N 1 0 + 88416 = N 2 0 + 88416 = S 2 1824 + 88608 = N 2 0 + 88752 = N 0 0 + 88800 = N 2 0 + 88992 = N 2 0 + 89136 = N 0 0 + 89184 = N 1 0 + 89184 = N 2 0 + 89376 = N 2 0 + 89520 = N 0 0 + 89568 = N 2 0 + 90048 = N 1 0 + 90048 = N 4 0 + 90144 = N 3 0 + 90144 = N 0 0 + 90288 = N 0 0 + 90336 = N 4 0 + 90432 = N 0 0 + 90528 = N 4 0 + 90720 = N 1 0 + 90720 = N 4 0 + 90864 = N 0 0 + 90912 = N 4 0 + 91008 = N 0 0 + 91104 = N 4 0 + 91104 = N 0 0 + 91248 = N 0 0 + 91296 = N 4 0 + 91392 = N 0 0 + 91488 = N 1 0 + 91488 = N 4 0 + 91584 = N 0 0 + 91680 = N 4 0 + 91680 = N 0 0 + 91776 = N 1 0 + 91872 = N 3 0 + 91872 = N 0 0 + 91968 = N 1 0 + 92064 = N 1 0 + 92160 = N 1 0 + 92256 = N 1 0 + 92352 = N 1 0 + 92448 = N 1 0 + 92544 = N 1 0 + 92640 = N 1 0 + 92736 = N 1 0 + 92832 = N 1 0 + 92928 = N 1 0 + 93024 = N 1 0 + 93120 = N 1 0 + 93216 = N 1 0 + 93312 = N 1 0 + 93408 = N 1 0 + 93504 = N 1 0 + 93600 = N 1 0 + 93696 = N 1 0 + 93792 = N 1 0 + 93888 = N 1 0 + 93984 = N 1 0 + 94080 = N 1 0 + 94176 = N 1 0 + 94272 = N 1 0 + 94368 = N 1 0 + 94464 = N 1 0 + 94560 = N 1 0 + 94656 = N 1 0 + 94752 = N 1 0 + 94848 = N 1 0 + 94944 = N 1 0 + 95040 = N 1 0 + 95136 = N 1 0 + 95232 = N 1 0 + 95328 = N 1 0 + 95424 = N 1 0 + 95520 = N 1 0 + 95616 = N 1 0 + 95712 = N 1 0 + 95808 = N 1 0 + 95904 = N 1 0 + 96000 = N 1 0 + 96096 = N 1 0 + 96192 = N 1 0 + 96288 = N 1 0 + 96384 = N 1 0 + 96480 = N 1 0 + 96576 = N 1 0 + 96672 = N 1 0 + 96768 = N 1 0 + 96864 = N 1 0 + 96960 = N 1 0 + 97056 = N 1 0 + 97152 = N 1 0 + 97248 = N 1 0 + 97248 = S 2 816 + 97344 = N 1 0 + 97440 = N 1 0 + 97536 = N 1 0 + 97632 = N 1 0 + 97728 = N 1 0 + 97824 = N 1 0 + 97920 = N 1 0 + 98016 = N 3 0 + 98016 = N 0 0 + 98112 = N 1 0 + 98208 = N 1 0 + 98304 = N 1 0 + 98400 = N 1 0 + 98496 = N 1 0 + 98592 = N 1 0 + 98688 = N 1 0 + 98784 = N 1 0 + 98880 = N 1 0 + 98976 = N 1 0 + 99072 = N 1 0 + 99168 = N 1 0 + 99264 = N 1 0 + 99360 = N 1 0 + 99456 = N 1 0 + 99552 = N 1 0 + 99648 = N 1 0 + 99744 = N 1 0 + 99840 = N 1 0 + 99936 = N 1 0 + 100032 = N 1 0 + 100128 = N 1 0 + 100224 = N 1 0 + 100320 = N 1 0 + 100416 = N 1 0 + 100512 = N 1 0 + 100608 = N 1 0 + 100704 = N 1 0 + 100800 = N 1 0 + 100896 = N 1 0 + 100992 = N 1 0 + 101088 = N 1 0 + 101184 = N 1 0 + 101280 = N 1 0 + 101376 = N 1 0 + 101472 = N 1 0 + 101568 = N 1 0 + 101664 = N 1 0 + 101760 = N 1 0 + 101856 = N 1 0 + 101952 = N 1 0 + 102048 = N 1 0 + 102144 = N 1 0 + 102240 = N 1 0 + 102336 = N 1 0 + 102432 = N 1 0 + 102528 = N 1 0 + 102624 = N 1 0 + 102720 = N 1 0 + 102816 = N 1 0 + 102912 = N 1 0 + 103008 = N 1 0 + 103104 = N 1 0 + 103200 = N 1 0 + 103296 = N 1 0 + 103392 = N 1 0 + 103488 = N 1 0 + 103584 = N 1 0 + 103680 = N 1 0 + 103776 = N 1 0 + 103872 = N 1 0 + 103968 = N 1 0 + 104064 = N 1 0 + 104160 = N 3 0 + 104160 = N 0 0 + 104160 = S 2 1536 + 104352 = N 2 0 + 104448 = N 2 0 + 104544 = N 1 0 + 104544 = N 2 0 + 104640 = N 2 0 + 104736 = N 2 0 + 104832 = N 2 0 + 104928 = N 2 0 + 105024 = N 2 0 + 105120 = N 2 0 + 105120 = N 0 0 + 105312 = N 2 0 + 105408 = N 2 0 + 105504 = N 2 0 + 105600 = N 1 0 + 105600 = N 2 0 + 105696 = N 2 0 + 105696 = N 0 0 + 105792 = N 2 0 + 105888 = N 2 0 + 105984 = N 2 0 + 106080 = N 1 0 + 106080 = N 2 0 + 106176 = N 2 0 + 106272 = N 2 0 + 106368 = N 2 0 + 106464 = N 2 0 + 106560 = N 2 0 + 106656 = N 2 0 + 106656 = N 0 0 + 106752 = N 2 0 + 106848 = N 1 0 + 106848 = N 2 0 + 106944 = N 2 0 + 106944 = N 0 0 + 107040 = N 1 0 + 107136 = N 1 0 + 107232 = N 4 0 + 107232 = N 0 0 + 107328 = N 2 0 + 107424 = N 1 0 + 107520 = N 3 0 + 107520 = N 0 0 + 107616 = N 2 0 + 107712 = N 1 0 + 107808 = N 3 0 + 107808 = N 0 0 + 107904 = N 2 0 + 108000 = N 1 0 + 108096 = N 1 0 + 108192 = N 1 0 + 108336 = N 0 0 + 108384 = N 1 0 + 108384 = N 4 0 + 108480 = N 1 0 + 108528 = N 4 0 + 108624 = N 4 0 + 108672 = N 1 0 + 108768 = N 4 0 + 108768 = N 0 0 + 108864 = N 2 0 + 108960 = N 2 0 + 109056 = N 2 0 + 109056 = N 0 0 + 109152 = N 1 0 + 109152 = N 2 0 + 109248 = N 2 0 + 109344 = N 2 0 + 109440 = N 2 0 + 109440 = N 0 0 + 109536 = N 2 0 + 109632 = N 2 0 + 109728 = N 2 0 + 109824 = N 2 0 + 109824 = N 0 0 + 109920 = N 1 0 + 109920 = N 2 0 + 110016 = N 2 0 + 110112 = N 2 0 + 110112 = N 0 0 + 110208 = N 2 0 + 110208 = N 0 0 + 110256 = N 1 0 + 110304 = N 4 0 + 110304 = N 0 0 + 110400 = N 2 0 + 110496 = N 2 0 + 110592 = N 2 0 + 110592 = N 0 0 + 110688 = N 1 0 + 110688 = N 2 0 + 110784 = N 2 0 + 110880 = N 1 0 + 110976 = N 4 0 + 110976 = N 0 0 + 111072 = N 2 0 + 111168 = N 3 0 + 111168 = N 0 0 + 111264 = N 2 0 + 111360 = N 4 0 + 111360 = N 0 0 + 111456 = N 2 0 + 111552 = N 0 0 + 111600 = N 3 0 + 111648 = N 1 0 + 111744 = N 4 0 + 111792 = N 1 0 + 111840 = N 4 0 + 111840 = N 0 0 + 111936 = N 2 0 + 112032 = N 2 0 + 112128 = N 2 0 + 112128 = N 0 0 + 112224 = N 1 0 + 112224 = N 2 0 + 112320 = N 2 0 + 112416 = N 2 0 + 112512 = N 2 0 + 112512 = N 0 0 + 112608 = N 2 0 + 112704 = N 2 0 + 112800 = N 2 0 + 112896 = N 2 0 + 112896 = N 0 0 + 112992 = N 1 0 + 112992 = N 2 0 + 113088 = N 2 0 + 113184 = N 2 0 + 113184 = N 0 0 + 113280 = N 2 0 + 113280 = N 0 0 + 113328 = N 1 0 + 113376 = N 4 0 + 113376 = N 0 0 + 113376 = S 2 1632 + 113472 = N 2 0 + 113568 = N 2 0 + 113664 = N 2 0 + 113664 = N 0 0 + 113760 = N 1 0 + 113760 = N 2 0 + 113856 = N 2 0 + 113952 = N 1 0 + 114048 = N 4 0 + 114048 = N 0 0 + 114144 = N 2 0 + 114240 = N 3 0 + 114240 = N 0 0 + 114336 = N 2 0 + 114432 = N 4 0 + 114432 = N 0 0 + 114528 = N 2 0 + 114624 = N 1 0 + 114720 = N 1 0 + 114816 = N 1 0 + 114912 = N 3 0 + 114912 = N 0 0 + 115104 = N 1 0 + 115200 = N 4 0 + 115200 = N 0 0 + 115296 = N 2 0 + 115392 = N 2 0 + 115488 = N 1 0 + 115488 = N 2 0 + 115584 = N 2 0 + 115584 = N 0 0 + 115680 = N 2 0 + 115776 = N 2 0 + 115872 = N 2 0 + 115968 = N 2 0 + 115968 = N 0 0 + 116064 = N 2 0 + 116160 = N 2 0 + 116160 = N 0 0 + 116256 = N 1 0 + 116256 = N 2 0 + 116352 = N 2 0 + 116352 = N 0 0 + 116448 = N 3 0 + 116448 = N 0 0 + 116544 = N 2 0 + 116640 = N 1 0 + 116736 = N 4 0 + 116736 = N 0 0 + 116832 = N 2 0 + 116928 = N 2 0 + 117024 = N 1 0 + 117024 = N 2 0 + 117120 = N 2 0 + 117120 = N 0 0 + 117216 = N 2 0 + 117312 = N 2 0 + 117408 = N 2 0 + 117504 = N 2 0 + 117504 = N 0 0 + 117600 = N 2 0 + 117696 = N 2 0 + 117696 = N 0 0 + 117792 = N 2 0 + 117888 = N 2 0 + 117888 = N 0 0 + 117984 = N 3 0 + 117984 = N 0 0 + 118080 = N 2 0 + 118176 = N 1 0 + 118272 = N 4 0 + 118272 = N 0 0 + 118368 = N 2 0 + 118464 = N 2 0 + 118560 = N 1 0 + 118560 = N 2 0 + 118656 = N 2 0 + 118656 = N 0 0 + 118752 = N 2 0 + 118848 = N 2 0 + 118944 = N 2 0 + 119040 = N 2 0 + 119040 = N 0 0 + 119136 = N 2 0 + 119232 = N 2 0 + 119232 = N 0 0 + 119328 = N 1 0 + 119328 = N 2 0 + 119424 = N 2 0 + 119424 = N 0 0 + 119520 = N 3 0 + 119616 = N 2 0 + 119712 = N 1 0 + 119808 = N 4 0 + 119808 = N 0 0 + 119904 = N 2 0 + 120000 = N 2 0 + 120096 = N 2 0 + 120192 = N 2 0 + 120192 = N 0 0 + 120288 = N 2 0 + 120384 = N 2 0 + 120480 = N 2 0 + 120576 = N 2 0 + 120576 = N 0 0 + 120672 = N 2 0 + 120768 = N 1 0 + 120768 = N 2 0 + 120768 = N 0 0 + 120864 = N 2 0 + 120960 = N 1 0 + 120960 = N 2 0 + 120960 = N 0 0 + 121056 = N 4 0 + 121056 = N 0 0 + 121152 = N 2 0 + 121248 = N 2 0 + 121344 = N 2 0 + 121440 = N 1 0 + 121440 = N 2 0 + 121536 = N 2 0 + 121632 = N 2 0 + 121728 = N 2 0 + 121824 = N 2 0 + 121920 = N 2 0 + 122016 = N 2 0 + 122016 = N 0 0 + 122208 = N 1 0 + 122208 = N 2 0 + 122304 = N 2 0 + 122400 = N 2 0 + 122496 = N 1 0 + 122496 = N 2 0 + 122592 = N 2 0 + 122592 = N 0 0 + 122592 = S 2 1632 + 122688 = N 2 0 + 122784 = N 2 0 + 122880 = N 2 0 + 122976 = N 1 0 + 122976 = N 2 0 + 123072 = N 2 0 + 123168 = N 2 0 + 123264 = N 2 0 + 123360 = N 2 0 + 123456 = N 2 0 + 123552 = N 2 0 + 123552 = N 0 0 + 123648 = N 2 0 + 123744 = N 1 0 + 123744 = N 2 0 + 123840 = N 2 0 + 123840 = N 0 0 + 123936 = N 2 0 + 124032 = N 2 0 + 124128 = N 4 0 + 124128 = N 0 0 + 124224 = N 2 0 + 124320 = N 2 0 + 124416 = N 2 0 + 124512 = N 1 0 + 124512 = N 2 0 + 124608 = N 2 0 + 124704 = N 2 0 + 124800 = N 2 0 + 124896 = N 2 0 + 124992 = N 2 0 + 125088 = N 2 0 + 125088 = N 0 0 + 125280 = N 1 0 + 125280 = N 2 0 + 125376 = N 2 0 + 125472 = N 2 0 + 125568 = N 1 0 + 125568 = N 2 0 + 125664 = N 2 0 + 125664 = N 0 0 + 125760 = N 2 0 + 125856 = N 2 0 + 125952 = N 2 0 + 126048 = N 1 0 + 126048 = N 2 0 + 126144 = N 2 0 + 126240 = N 2 0 + 126336 = N 2 0 + 126432 = N 2 0 + 126528 = N 2 0 + 126624 = N 2 0 + 126624 = N 0 0 + 126720 = N 2 0 + 126816 = N 1 0 + 126912 = N 2 0 + 127008 = N 4 0 + 127104 = N 0 0 + 127200 = N 3 0 + 127200 = N 0 0 + 127392 = N 4 0 + 127584 = N 1 0 + 127584 = N 4 0 + 127776 = N 4 0 + 127968 = N 4 0 + 128064 = N 1 0 + 128160 = N 4 0 + 128160 = N 0 0 + 128352 = N 1 0 + 128352 = N 4 0 + 128544 = N 4 0 + 128640 = N 2 0 + 128736 = N 4 0 + 128736 = N 0 0 + 128928 = N 4 0 + 129120 = N 1 0 + 129120 = N 4 0 + 129312 = N 2 0 + 129312 = N 4 0 + 129504 = N 4 0 + 129600 = N 1 0 + 129696 = N 4 0 + 129696 = N 0 0 + 129888 = N 1 0 + 129888 = N 4 0 + 129984 = N 0 0 + 130080 = N 4 0 + 130176 = N 0 0 + 130272 = N 3 0 + 130272 = N 0 0 + 130464 = N 4 0 + 130656 = N 1 0 + 130656 = N 4 0 + 130848 = N 4 0 + 131040 = N 4 0 + 131136 = N 1 0 + 131232 = N 4 0 + 131232 = N 0 0 + 131424 = N 1 0 + 131424 = N 4 0 + 131616 = N 4 0 + 131712 = N 2 0 + 131808 = N 4 0 + 131808 = N 0 0 + 131808 = S 2 1632 + 132000 = N 4 0 + 132192 = N 1 0 + 132192 = N 4 0 + 132384 = N 4 0 + 132480 = N 1 0 + 132576 = N 4 0 + 132672 = N 1 0 + 132768 = N 4 0 + 132768 = N 0 0 + 132960 = N 1 0 + 132960 = N 4 0 + 133152 = N 4 0 + 133344 = N 3 0 + 133344 = N 0 0 + 133536 = N 4 0 + 133728 = N 1 0 + 133728 = N 4 0 + 133920 = N 4 0 + 134112 = N 4 0 + 134208 = N 1 0 + 134304 = N 4 0 + 134304 = N 0 0 + 134496 = N 1 0 + 134496 = N 4 0 + 134688 = N 4 0 + 134784 = N 2 0 + 134880 = N 4 0 + 134880 = N 0 0 + 135072 = N 4 0 + 135264 = N 1 0 + 135264 = N 4 0 + 135456 = N 2 0 + 135456 = N 4 0 + 135648 = N 4 0 + 135744 = N 1 0 + 135840 = N 4 0 + 135840 = N 0 0 + 136032 = N 1 0 + 136032 = N 4 0 + 136128 = N 0 0 + 136224 = N 4 0 + 136320 = N 0 0 + 136416 = N 3 0 + 136416 = N 0 0 + 136608 = N 4 0 + 136800 = N 1 0 + 136800 = N 4 0 + 136992 = N 4 0 + 137184 = N 4 0 + 137280 = N 1 0 + 137376 = N 4 0 + 137376 = N 0 0 + 137568 = N 1 0 + 137568 = N 4 0 + 137760 = N 4 0 + 137856 = N 2 0 + 137952 = N 4 0 + 137952 = N 0 0 + 138144 = N 4 0 + 138336 = N 1 0 + 138336 = N 4 0 + 138528 = N 4 0 + 138624 = N 1 0 + 138720 = N 4 0 + 138816 = N 2 0 + 138912 = N 4 0 + 139008 = N 0 0 + 139104 = N 1 0 + 139104 = N 4 0 + 139200 = N 0 0 + 139296 = N 1 0 + 139392 = N 1 0 + 139488 = N 3 0 + 139488 = N 0 0 + 139680 = N 4 0 + 139872 = N 1 0 + 139872 = N 4 0 + 140064 = N 4 0 + 140256 = N 4 0 + 140256 = S 2 1632 + 140352 = N 1 0 + 140448 = N 4 0 + 140448 = N 0 0 + 140640 = N 1 0 + 140640 = N 4 0 + 140832 = N 4 0 + 140928 = N 2 0 + 141024 = N 4 0 + 141024 = N 0 0 + 141216 = N 4 0 + 141408 = N 1 0 + 141408 = N 4 0 + 141600 = N 2 0 + 141600 = N 4 0 + 141792 = N 4 0 + 141984 = N 4 0 + 141984 = N 0 0 + 142176 = N 1 0 + 142176 = N 4 0 + 142272 = N 0 0 + 142368 = N 4 0 + 142560 = N 3 0 + 142560 = N 0 0 + 142752 = N 4 0 + 142944 = N 1 0 + 142944 = N 4 0 + 143136 = N 4 0 + 143328 = N 4 0 + 143424 = N 1 0 + 143520 = N 4 0 + 143520 = N 0 0 + 143712 = N 1 0 + 143712 = N 4 0 + 143904 = N 4 0 + 144000 = N 2 0 + 144096 = N 4 0 + 144096 = N 0 0 + 144288 = N 4 0 + 144480 = N 1 0 + 144480 = N 4 0 + 144672 = N 4 0 + 144768 = N 1 0 + 144864 = N 4 0 + 144960 = N 1 0 + 145056 = N 4 0 + 145056 = N 0 0 + 145248 = N 1 0 + 145248 = N 4 0 + 145440 = N 4 0 + 145632 = N 3 0 + 145632 = N 0 0 + 145824 = N 4 0 + 146016 = N 1 0 + 146016 = N 4 0 + 146208 = N 4 0 + 146400 = N 4 0 + 146496 = N 1 0 + 146592 = N 4 0 + 146592 = N 0 0 + 146784 = N 1 0 + 146784 = N 4 0 + 146976 = N 4 0 + 147072 = N 2 0 + 147168 = N 4 0 + 147168 = N 0 0 + 147360 = N 4 0 + 147552 = N 1 0 + 147552 = N 4 0 + 147744 = N 2 0 + 147744 = N 4 0 + 147936 = N 4 0 + 148032 = N 1 0 + 148128 = N 4 0 + 148128 = N 0 0 + 148320 = N 1 0 + 148320 = N 4 0 + 148416 = N 0 0 + 148512 = N 4 0 + 148608 = N 0 0 + 148704 = N 3 0 + 148704 = N 0 0 + 148896 = N 4 0 + 149088 = N 1 0 + 149088 = N 4 0 + 149280 = N 4 0 + 149472 = N 4 0 + 149568 = N 1 0 + 149664 = N 4 0 + 149664 = N 0 0 + 149856 = N 1 0 + 149856 = N 4 0 + 150048 = N 4 0 + 150144 = N 2 0 + 150240 = N 4 0 + 150240 = N 0 0 + 150432 = N 4 0 + 150624 = N 1 0 + 150624 = N 4 0 + 150816 = N 4 0 + 150912 = N 1 0 + 151008 = N 4 0 + 151104 = N 1 0 + 151200 = N 4 0 + 151200 = N 0 0 + 151392 = N 1 0 + 151488 = N 2 0 + 151584 = N 4 0 + 151680 = N 4 0 +} +[MediumDrums] +{ + 1536 = N 4 0 + 1536 = N 0 0 + 1632 = N 0 0 + 1728 = N 2 0 + 1920 = N 1 0 + 1920 = N 2 0 + 2112 = N 2 0 + 2304 = N 2 0 + 2496 = N 2 0 + 2496 = N 0 0 + 2592 = N 0 0 + 2688 = N 1 0 + 2688 = N 2 0 + 2784 = N 0 0 + 2880 = N 1 0 + 2880 = N 2 0 + 3072 = N 2 0 + 3072 = N 0 0 + 3168 = N 0 0 + 3264 = N 2 0 + 3456 = N 1 0 + 3456 = N 2 0 + 3552 = N 1 0 + 3648 = N 2 0 + 3840 = N 2 0 + 3840 = S 2 960 + 4032 = N 2 0 + 4032 = N 0 0 + 4128 = N 0 0 + 4224 = N 1 0 + 4416 = N 4 0 + 4512 = N 4 0 + 4608 = N 4 0 + 4608 = N 0 0 + 4800 = N 2 0 + 4992 = N 1 0 + 4992 = N 2 0 + 5184 = N 2 0 + 5376 = N 2 0 + 5568 = N 2 0 + 5568 = N 0 0 + 5760 = N 1 0 + 5760 = N 2 0 + 5952 = N 2 0 + 6144 = N 2 0 + 6144 = N 0 0 + 6336 = N 2 0 + 6528 = N 1 0 + 6528 = N 2 0 + 6720 = N 2 0 + 6912 = N 2 0 + 7104 = N 2 0 + 7104 = N 0 0 + 7296 = N 1 0 + 7296 = N 2 0 + 7392 = N 0 0 + 7488 = N 1 0 + 7584 = N 1 0 + 7680 = N 4 0 + 7680 = N 0 0 + 7872 = N 1 0 + 7968 = N 3 0 + 7968 = N 0 0 + 8160 = N 1 0 + 8256 = N 4 0 + 8256 = N 0 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8832 = N 1 0 + 8832 = N 4 0 + 8976 = N 4 0 + 9120 = N 1 0 + 9216 = N 4 0 + 9216 = N 0 0 + 9408 = N 2 0 + 9504 = N 0 0 + 9600 = N 1 0 + 9600 = N 2 0 + 9792 = N 2 0 + 9888 = N 0 0 + 9984 = N 2 0 + 10176 = N 2 0 + 10272 = N 0 0 + 10368 = N 1 0 + 10368 = N 2 0 + 10560 = N 2 0 + 10560 = N 0 0 + 10752 = N 4 0 + 10752 = N 0 0 + 10944 = N 2 0 + 11040 = N 0 0 + 11136 = N 1 0 + 11328 = N 1 0 + 11424 = N 4 0 + 11424 = N 0 0 + 11424 = S 2 912 + 11616 = N 3 0 + 11616 = N 0 0 + 11808 = N 4 0 + 11808 = N 0 0 + 12000 = N 0 0 + 12096 = N 1 0 + 12192 = N 4 0 + 12288 = N 4 0 + 12288 = N 0 0 + 12480 = N 2 0 + 12576 = N 0 0 + 12672 = N 1 0 + 12672 = N 2 0 + 12864 = N 2 0 + 12960 = N 0 0 + 13056 = N 2 0 + 13248 = N 2 0 + 13344 = N 0 0 + 13440 = N 1 0 + 13440 = N 2 0 + 13632 = N 2 0 + 13632 = N 0 0 + 13824 = N 4 0 + 13824 = N 0 0 + 14016 = N 2 0 + 14208 = N 1 0 + 14400 = N 1 0 + 14496 = N 4 0 + 14496 = N 0 0 + 14688 = N 3 0 + 14688 = N 0 0 + 14880 = N 4 0 + 14880 = N 0 0 + 15072 = N 1 0 + 15168 = N 1 0 + 15264 = N 1 0 + 15360 = N 3 0 + 15360 = N 0 0 + 15552 = N 1 0 + 15648 = N 4 0 + 15840 = N 2 0 + 15936 = N 1 0 + 15936 = N 2 0 + 16032 = N 0 0 + 16128 = N 2 0 + 16320 = N 1 0 + 16320 = N 2 0 + 16416 = N 0 0 + 16512 = N 2 0 + 16608 = N 0 0 + 16704 = N 1 0 + 16704 = N 2 0 + 16896 = N 3 0 + 16896 = N 0 0 + 17088 = N 1 0 + 17184 = N 4 0 + 17184 = N 0 0 + 17376 = N 2 0 + 17472 = N 1 0 + 17472 = N 2 0 + 17568 = N 0 0 + 17664 = N 2 0 + 17856 = N 1 0 + 17856 = N 2 0 + 17952 = N 0 0 + 18048 = N 2 0 + 18144 = N 0 0 + 18240 = N 1 0 + 18240 = N 2 0 + 18432 = N 3 0 + 18432 = N 0 0 + 18624 = N 1 0 + 18720 = N 4 0 + 18720 = N 0 0 + 18912 = N 2 0 + 19008 = N 1 0 + 19008 = N 2 0 + 19104 = N 0 0 + 19200 = N 2 0 + 19392 = N 1 0 + 19392 = N 2 0 + 19488 = N 0 0 + 19584 = N 2 0 + 19680 = N 0 0 + 19776 = N 1 0 + 19776 = N 2 0 + 19872 = N 0 0 + 19968 = N 3 0 + 19968 = N 0 0 + 19968 = S 2 1536 + 20160 = N 1 0 + 20256 = N 4 0 + 20256 = N 0 0 + 20448 = N 2 0 + 20544 = N 1 0 + 20544 = N 2 0 + 20640 = N 0 0 + 20736 = N 2 0 + 20928 = N 1 0 + 20928 = N 2 0 + 21024 = N 0 0 + 21120 = N 2 0 + 21216 = N 0 0 + 21312 = N 1 0 + 21312 = N 2 0 + 21408 = N 0 0 + 21984 = N 1 0 + 22080 = N 4 0 + 22080 = N 0 0 + 22272 = N 3 0 + 22272 = N 0 0 + 22464 = N 4 0 + 22464 = N 0 0 + 22656 = N 1 0 + 22656 = N 2 0 + 22752 = N 0 0 + 22848 = N 2 0 + 23040 = N 2 0 + 23040 = N 0 0 + 23232 = N 2 0 + 23232 = N 0 0 + 23328 = N 0 0 + 23424 = N 1 0 + 23424 = N 2 0 + 23616 = N 2 0 + 23616 = N 0 0 + 23808 = N 2 0 + 23808 = N 0 0 + 24000 = N 2 0 + 24000 = N 0 0 + 24096 = N 1 0 + 24192 = N 4 0 + 24192 = N 0 0 + 24480 = N 3 0 + 24480 = N 0 0 + 24576 = N 1 0 + 24768 = N 2 0 + 24768 = N 0 0 + 24960 = N 2 0 + 24960 = N 0 0 + 25152 = N 2 0 + 25152 = N 0 0 + 25344 = N 1 0 + 25344 = N 2 0 + 25440 = N 0 0 + 25536 = N 2 0 + 25632 = N 0 0 + 25728 = N 0 0 + 25920 = N 1 0 + 25920 = N 2 0 + 26016 = N 0 0 + 26112 = N 2 0 + 26208 = N 0 0 + 26304 = N 2 0 + 26304 = N 0 0 + 26496 = N 2 0 + 26496 = N 0 0 + 26688 = N 2 0 + 26688 = N 0 0 + 26784 = N 1 0 + 26880 = N 4 0 + 26880 = N 0 0 + 27072 = N 2 0 + 27264 = N 1 0 + 27264 = N 2 0 + 27360 = N 0 0 + 27456 = N 2 0 + 27456 = N 0 0 + 27648 = N 2 0 + 27648 = N 0 0 + 27840 = N 2 0 + 27840 = N 0 0 + 28032 = N 1 0 + 28032 = N 2 0 + 28128 = N 0 0 + 28224 = N 2 0 + 28224 = S 2 1440 + 28320 = N 0 0 + 28416 = N 2 0 + 28416 = N 0 0 + 28608 = N 2 0 + 28608 = N 0 0 + 28704 = N 0 0 + 28800 = N 1 0 + 28800 = N 2 0 + 28992 = N 2 0 + 28992 = N 0 0 + 29184 = N 2 0 + 29184 = N 0 0 + 29376 = N 2 0 + 29376 = N 0 0 + 29472 = N 1 0 + 29568 = N 4 0 + 29568 = N 0 0 + 29856 = N 3 0 + 29856 = N 0 0 + 29952 = N 1 0 + 30144 = N 2 0 + 30144 = N 0 0 + 30336 = N 2 0 + 30336 = N 0 0 + 30528 = N 2 0 + 30528 = N 0 0 + 30720 = N 1 0 + 30720 = N 2 0 + 30816 = N 0 0 + 30912 = N 2 0 + 31008 = N 0 0 + 31104 = N 0 0 + 31296 = N 1 0 + 31296 = N 2 0 + 31392 = N 0 0 + 31488 = N 2 0 + 31584 = N 0 0 + 31680 = N 0 0 + 31872 = N 2 0 + 31872 = N 0 0 + 32064 = N 2 0 + 32064 = N 0 0 + 32160 = N 1 0 + 32256 = N 4 0 + 32256 = N 0 0 + 32448 = N 2 0 + 32640 = N 1 0 + 32640 = N 2 0 + 32832 = N 2 0 + 33024 = N 2 0 + 33216 = N 2 0 + 33216 = N 0 0 + 33408 = N 1 0 + 33408 = N 2 0 + 33600 = N 2 0 + 33792 = N 4 0 + 33792 = N 0 0 + 33984 = N 2 0 + 34080 = N 0 0 + 34176 = N 1 0 + 34176 = N 2 0 + 34368 = N 2 0 + 34560 = N 2 0 + 34656 = N 0 0 + 34752 = N 2 0 + 34944 = N 1 0 + 34944 = N 2 0 + 35040 = N 0 0 + 35136 = N 2 0 + 35232 = N 1 0 + 35328 = N 2 0 + 35424 = N 0 0 + 35520 = N 1 0 + 35616 = N 4 0 + 35616 = N 0 0 + 35808 = N 2 0 + 35904 = N 1 0 + 35904 = N 2 0 + 36000 = N 2 0 + 36096 = N 2 0 + 36288 = N 1 0 + 36288 = N 2 0 + 36384 = N 2 0 + 36480 = N 2 0 + 36576 = N 2 0 + 36672 = N 1 0 + 36672 = N 2 0 + 36768 = N 2 0 + 36768 = N 0 0 + 36864 = N 2 0 + 37056 = N 1 0 + 37056 = N 2 0 + 37248 = N 4 0 + 37248 = N 0 0 + 37248 = S 2 1584 + 37440 = N 1 0 + 37440 = N 2 0 + 37536 = N 2 0 + 37632 = N 2 0 + 37728 = N 2 0 + 37824 = N 1 0 + 37824 = N 2 0 + 37920 = N 2 0 + 38016 = N 2 0 + 38208 = N 1 0 + 38208 = N 2 0 + 38304 = N 2 0 + 38400 = N 2 0 + 38400 = N 0 0 + 38592 = N 1 0 + 38688 = N 1 0 + 38784 = N 4 0 + 38784 = N 0 0 + 38976 = N 2 0 + 39072 = N 2 0 + 39168 = N 2 0 + 39264 = N 1 0 + 39264 = N 2 0 + 39360 = N 0 0 + 39456 = N 2 0 + 39648 = N 2 0 + 39840 = N 2 0 + 39936 = N 0 0 + 40032 = N 1 0 + 40032 = N 2 0 + 40224 = N 2 0 + 40416 = N 2 0 + 40608 = N 2 0 + 40800 = N 1 0 + 40800 = N 2 0 + 40992 = N 2 0 + 41184 = N 2 0 + 41376 = N 2 0 + 41568 = N 1 0 + 41568 = N 2 0 + 41760 = N 1 0 + 41856 = N 4 0 + 41952 = N 4 0 + 41952 = N 0 0 + 42096 = N 2 0 + 42240 = N 4 0 + 42384 = N 4 0 + 42528 = N 4 0 + 43296 = N 2 0 + 43488 = N 4 0 + 43488 = N 0 0 + 43632 = N 4 0 + 44352 = N 4 0 + 44448 = N 4 0 + 44544 = N 4 0 + 44640 = N 4 0 + 44736 = N 4 0 + 44832 = N 4 0 + 44928 = N 4 0 + 45024 = N 4 0 + 45168 = N 4 0 + 46272 = N 2 0 + 46368 = N 1 0 + 46560 = N 4 0 + 46560 = N 0 0 + 46752 = N 2 0 + 46944 = N 1 0 + 46944 = N 2 0 + 47136 = N 2 0 + 47328 = N 2 0 + 47328 = S 2 864 + 47424 = N 0 0 + 47520 = N 2 0 + 47520 = N 0 0 + 47712 = N 1 0 + 47712 = N 2 0 + 47904 = N 2 0 + 48096 = N 2 0 + 48096 = N 0 0 + 48288 = N 2 0 + 48480 = N 1 0 + 48480 = N 2 0 + 48672 = N 2 0 + 48864 = N 2 0 + 48960 = N 0 0 + 49056 = N 2 0 + 49056 = N 0 0 + 49248 = N 1 0 + 49248 = N 2 0 + 49440 = N 2 0 + 49632 = N 4 0 + 49632 = N 0 0 + 49824 = N 2 0 + 50016 = N 1 0 + 50016 = N 2 0 + 50208 = N 2 0 + 50400 = N 2 0 + 50496 = N 0 0 + 50592 = N 2 0 + 50592 = N 0 0 + 50784 = N 1 0 + 50784 = N 2 0 + 50976 = N 2 0 + 51168 = N 2 0 + 51168 = N 0 0 + 51360 = N 2 0 + 51552 = N 1 0 + 51552 = N 2 0 + 51744 = N 2 0 + 51936 = N 2 0 + 52032 = N 0 0 + 52128 = N 2 0 + 52128 = N 0 0 + 52320 = N 1 0 + 52320 = N 2 0 + 52512 = N 2 0 + 52704 = N 4 0 + 52704 = N 0 0 + 52896 = N 2 0 + 53088 = N 1 0 + 53088 = N 2 0 + 53280 = N 2 0 + 53472 = N 2 0 + 53568 = N 0 0 + 53664 = N 2 0 + 53664 = N 0 0 + 53856 = N 1 0 + 53856 = N 2 0 + 54048 = N 2 0 + 54240 = N 2 0 + 54240 = N 0 0 + 54432 = N 2 0 + 54624 = N 1 0 + 54624 = N 2 0 + 54816 = N 2 0 + 55008 = N 2 0 + 55104 = N 0 0 + 55200 = N 2 0 + 55200 = N 0 0 + 55392 = N 1 0 + 55392 = N 2 0 + 55584 = N 2 0 + 55776 = N 4 0 + 55776 = N 0 0 + 55776 = S 2 864 + 55968 = N 2 0 + 56160 = N 1 0 + 56160 = N 2 0 + 56352 = N 2 0 + 56544 = N 2 0 + 56640 = N 0 0 + 56736 = N 2 0 + 56736 = N 0 0 + 56928 = N 1 0 + 56928 = N 2 0 + 57120 = N 2 0 + 57312 = N 2 0 + 57312 = N 0 0 + 57504 = N 2 0 + 57696 = N 1 0 + 57696 = N 2 0 + 57888 = N 2 0 + 58080 = N 2 0 + 58176 = N 0 0 + 58272 = N 2 0 + 58272 = N 0 0 + 58464 = N 1 0 + 58656 = N 1 0 + 58752 = N 4 0 + 58848 = N 4 0 + 58848 = N 0 0 + 59040 = N 2 0 + 59232 = N 2 0 + 59424 = N 2 0 + 59616 = N 2 0 + 59808 = N 2 0 + 59808 = N 0 0 + 60000 = N 2 0 + 60192 = N 2 0 + 60384 = N 2 0 + 60576 = N 2 0 + 60768 = N 2 0 + 60768 = N 0 0 + 60864 = N 2 0 + 61056 = N 2 0 + 61056 = N 0 0 + 61248 = N 2 0 + 61440 = N 2 0 + 61632 = N 2 0 + 61824 = N 2 0 + 62016 = N 2 0 + 62208 = N 2 0 + 62400 = N 2 0 + 62640 = N 0 0 + 62832 = N 0 0 + 62928 = N 1 0 + 63024 = N 0 0 + 63264 = N 4 0 + 63264 = N 0 0 + 63456 = N 2 0 + 63648 = N 2 0 + 63744 = N 0 0 + 63840 = N 2 0 + 64032 = N 2 0 + 64224 = N 2 0 + 64224 = N 0 0 + 64416 = N 2 0 + 64608 = N 2 0 + 64800 = N 2 0 + 64800 = S 2 768 + 64992 = N 2 0 + 65184 = N 2 0 + 65184 = N 0 0 + 65280 = N 2 0 + 65472 = N 4 0 + 65472 = N 0 0 + 65664 = N 2 0 + 65856 = N 2 0 + 66048 = N 2 0 + 66240 = N 2 0 + 66432 = N 2 0 + 66432 = N 0 0 + 66624 = N 2 0 + 66816 = N 2 0 + 67056 = N 0 0 + 67248 = N 0 0 + 67344 = N 1 0 + 67440 = N 0 0 + 67680 = N 4 0 + 67680 = N 0 0 + 67872 = N 2 0 + 68064 = N 2 0 + 68256 = N 2 0 + 68448 = N 2 0 + 68640 = N 2 0 + 68640 = N 0 0 + 68832 = N 2 0 + 69024 = N 2 0 + 69216 = N 2 0 + 69408 = N 2 0 + 69600 = N 2 0 + 69600 = N 0 0 + 69888 = N 4 0 + 69888 = N 0 0 + 70080 = N 2 0 + 70272 = N 2 0 + 70464 = N 2 0 + 70656 = N 2 0 + 70848 = N 2 0 + 70848 = N 0 0 + 71040 = N 2 0 + 71232 = N 2 0 + 71472 = N 0 0 + 71664 = N 0 0 + 71760 = N 1 0 + 71856 = N 0 0 + 72096 = N 4 0 + 72096 = N 0 0 + 72096 = S 2 768 + 72288 = N 2 0 + 72480 = N 2 0 + 72576 = N 0 0 + 72672 = N 2 0 + 72864 = N 2 0 + 73056 = N 2 0 + 73056 = N 0 0 + 73248 = N 2 0 + 73440 = N 2 0 + 73632 = N 2 0 + 73824 = N 2 0 + 74016 = N 2 0 + 74016 = N 0 0 + 74304 = N 2 0 + 74304 = N 0 0 + 74496 = N 2 0 + 74688 = N 2 0 + 74880 = N 2 0 + 75072 = N 2 0 + 75264 = N 2 0 + 75264 = N 0 0 + 75456 = N 2 0 + 75648 = N 2 0 + 75888 = N 1 0 + 75984 = N 1 0 + 76080 = N 1 0 + 76176 = N 1 0 + 76272 = N 1 0 + 76512 = N 4 0 + 76512 = N 0 0 + 76704 = N 1 0 + 76704 = N 2 0 + 76800 = N 2 0 + 76896 = N 2 0 + 76992 = N 2 0 + 76992 = N 0 0 + 77088 = N 1 0 + 77088 = N 2 0 + 77184 = N 2 0 + 77280 = N 2 0 + 77376 = N 2 0 + 77472 = N 1 0 + 77472 = N 2 0 + 77568 = N 2 0 + 77664 = N 2 0 + 77760 = N 2 0 + 77856 = N 1 0 + 77856 = N 2 0 + 77952 = N 2 0 + 78048 = N 2 0 + 78144 = N 2 0 + 78144 = N 0 0 + 78240 = N 1 0 + 78240 = N 2 0 + 78336 = N 2 0 + 78432 = N 2 0 + 78432 = N 0 0 + 78528 = N 2 0 + 78624 = N 1 0 + 78624 = N 2 0 + 78720 = N 2 0 + 78816 = N 2 0 + 78912 = N 2 0 + 78912 = N 0 0 + 79008 = N 1 0 + 79008 = N 2 0 + 79104 = N 2 0 + 79200 = N 2 0 + 79296 = N 2 0 + 79392 = N 1 0 + 79392 = N 2 0 + 79488 = N 2 0 + 79584 = N 2 0 + 79680 = N 2 0 + 79776 = N 1 0 + 79776 = N 2 0 + 79872 = N 2 0 + 79968 = N 2 0 + 80064 = N 2 0 + 80160 = N 1 0 + 80160 = N 2 0 + 80304 = N 4 0 + 80304 = N 0 0 + 80304 = S 2 816 + 80592 = N 2 0 + 80592 = N 0 0 + 80688 = N 2 0 + 80688 = N 0 0 + 80832 = N 2 0 + 80832 = N 0 0 + 80928 = N 1 0 + 80928 = N 2 0 + 81024 = N 2 0 + 81120 = N 2 0 + 81120 = N 0 0 + 81216 = N 2 0 + 81312 = N 1 0 + 81312 = N 2 0 + 81408 = N 2 0 + 81504 = N 2 0 + 81600 = N 2 0 + 81696 = N 1 0 + 81696 = N 2 0 + 81792 = N 2 0 + 81888 = N 2 0 + 81984 = N 2 0 + 82080 = N 1 0 + 82080 = N 2 0 + 82176 = N 2 0 + 82272 = N 2 0 + 82368 = N 2 0 + 82368 = N 0 0 + 82464 = N 1 0 + 82608 = N 4 0 + 82608 = N 0 0 + 82704 = N 0 0 + 82848 = N 2 0 + 83040 = N 1 0 + 83040 = N 2 0 + 83232 = N 2 0 + 83424 = N 2 0 + 83616 = N 2 0 + 83808 = N 1 0 + 83808 = N 2 0 + 84000 = N 2 0 + 84192 = N 2 0 + 84384 = N 2 0 + 84576 = N 1 0 + 84576 = N 2 0 + 84768 = N 2 0 + 84960 = N 2 0 + 85440 = N 1 0 + 85536 = N 3 0 + 85536 = N 0 0 + 85728 = N 4 0 + 85824 = N 0 0 + 85920 = N 4 0 + 86112 = N 1 0 + 86112 = N 4 0 + 86304 = N 4 0 + 86400 = N 0 0 + 86496 = N 4 0 + 86496 = N 0 0 + 86688 = N 4 0 + 86784 = N 0 0 + 86880 = N 1 0 + 86880 = N 4 0 + 86976 = N 0 0 + 87072 = N 4 0 + 87072 = N 0 0 + 87216 = N 3 0 + 87216 = N 0 0 + 87312 = N 0 0 + 87648 = N 1 0 + 87840 = N 2 0 + 88032 = N 2 0 + 88224 = N 2 0 + 88416 = N 1 0 + 88416 = N 2 0 + 88416 = S 2 1824 + 88608 = N 2 0 + 88800 = N 2 0 + 88992 = N 2 0 + 89184 = N 1 0 + 89184 = N 2 0 + 89376 = N 2 0 + 89568 = N 2 0 + 90048 = N 1 0 + 90144 = N 3 0 + 90144 = N 0 0 + 90336 = N 4 0 + 90432 = N 0 0 + 90528 = N 4 0 + 90720 = N 1 0 + 90720 = N 4 0 + 90912 = N 4 0 + 91008 = N 0 0 + 91104 = N 4 0 + 91104 = N 0 0 + 91296 = N 4 0 + 91392 = N 0 0 + 91488 = N 1 0 + 91488 = N 4 0 + 91584 = N 0 0 + 91680 = N 4 0 + 91680 = N 0 0 + 91872 = N 3 0 + 91872 = N 0 0 + 92064 = N 1 0 + 92256 = N 1 0 + 92448 = N 1 0 + 92640 = N 1 0 + 92832 = N 1 0 + 93024 = N 1 0 + 93216 = N 1 0 + 93408 = N 1 0 + 93600 = N 1 0 + 93792 = N 1 0 + 93984 = N 1 0 + 94176 = N 1 0 + 94368 = N 1 0 + 94560 = N 1 0 + 94752 = N 1 0 + 94944 = N 1 0 + 95136 = N 1 0 + 95328 = N 1 0 + 95520 = N 1 0 + 95712 = N 1 0 + 95904 = N 1 0 + 96096 = N 1 0 + 96288 = N 1 0 + 96480 = N 1 0 + 96672 = N 1 0 + 96864 = N 1 0 + 97056 = N 1 0 + 97248 = N 1 0 + 97248 = S 2 816 + 97440 = N 1 0 + 97632 = N 1 0 + 97824 = N 1 0 + 98016 = N 3 0 + 98016 = N 0 0 + 98208 = N 1 0 + 98400 = N 1 0 + 98592 = N 1 0 + 98784 = N 1 0 + 98976 = N 1 0 + 99168 = N 1 0 + 99360 = N 1 0 + 99552 = N 1 0 + 99744 = N 1 0 + 99936 = N 1 0 + 100128 = N 1 0 + 100320 = N 1 0 + 100512 = N 1 0 + 100704 = N 1 0 + 100896 = N 1 0 + 101088 = N 1 0 + 101280 = N 1 0 + 101472 = N 1 0 + 101664 = N 1 0 + 101856 = N 1 0 + 102048 = N 1 0 + 102240 = N 1 0 + 102432 = N 1 0 + 102624 = N 1 0 + 102816 = N 1 0 + 103008 = N 1 0 + 103200 = N 1 0 + 103392 = N 1 0 + 103584 = N 1 0 + 103776 = N 1 0 + 103968 = N 1 0 + 104160 = N 3 0 + 104160 = N 0 0 + 104160 = S 2 1536 + 104352 = N 2 0 + 104544 = N 1 0 + 104544 = N 2 0 + 104736 = N 2 0 + 104928 = N 2 0 + 105120 = N 2 0 + 105120 = N 0 0 + 105312 = N 2 0 + 105504 = N 2 0 + 105600 = N 1 0 + 105696 = N 2 0 + 105696 = N 0 0 + 105888 = N 2 0 + 106080 = N 1 0 + 106080 = N 2 0 + 106272 = N 2 0 + 106464 = N 2 0 + 106656 = N 2 0 + 106656 = N 0 0 + 106848 = N 1 0 + 106848 = N 2 0 + 107040 = N 1 0 + 107136 = N 1 0 + 107232 = N 4 0 + 107232 = N 0 0 + 107424 = N 1 0 + 107520 = N 3 0 + 107520 = N 0 0 + 107712 = N 1 0 + 107808 = N 3 0 + 107808 = N 0 0 + 108000 = N 1 0 + 108096 = N 1 0 + 108192 = N 1 0 + 108384 = N 1 0 + 108384 = N 4 0 + 108528 = N 4 0 + 108672 = N 1 0 + 108768 = N 4 0 + 108768 = N 0 0 + 108960 = N 2 0 + 109056 = N 0 0 + 109152 = N 1 0 + 109152 = N 2 0 + 109344 = N 2 0 + 109440 = N 0 0 + 109536 = N 2 0 + 109728 = N 2 0 + 109824 = N 0 0 + 109920 = N 1 0 + 109920 = N 2 0 + 110112 = N 2 0 + 110112 = N 0 0 + 110304 = N 4 0 + 110304 = N 0 0 + 110496 = N 2 0 + 110592 = N 0 0 + 110688 = N 1 0 + 110688 = N 2 0 + 110880 = N 1 0 + 110976 = N 4 0 + 110976 = N 0 0 + 111168 = N 3 0 + 111168 = N 0 0 + 111360 = N 4 0 + 111360 = N 0 0 + 111648 = N 1 0 + 111744 = N 4 0 + 111840 = N 4 0 + 111840 = N 0 0 + 112032 = N 2 0 + 112128 = N 0 0 + 112224 = N 1 0 + 112224 = N 2 0 + 112416 = N 2 0 + 112512 = N 0 0 + 112608 = N 2 0 + 112800 = N 2 0 + 112896 = N 0 0 + 112992 = N 1 0 + 112992 = N 2 0 + 113184 = N 2 0 + 113184 = N 0 0 + 113376 = N 4 0 + 113376 = N 0 0 + 113376 = S 2 1632 + 113568 = N 2 0 + 113664 = N 0 0 + 113760 = N 1 0 + 113760 = N 2 0 + 113952 = N 1 0 + 114048 = N 4 0 + 114048 = N 0 0 + 114240 = N 3 0 + 114240 = N 0 0 + 114432 = N 4 0 + 114432 = N 0 0 + 114624 = N 1 0 + 114720 = N 1 0 + 114816 = N 1 0 + 114912 = N 3 0 + 114912 = N 0 0 + 115104 = N 1 0 + 115200 = N 4 0 + 115200 = N 0 0 + 115392 = N 2 0 + 115488 = N 1 0 + 115488 = N 2 0 + 115584 = N 0 0 + 115680 = N 2 0 + 115872 = N 2 0 + 115968 = N 0 0 + 116064 = N 2 0 + 116160 = N 0 0 + 116256 = N 1 0 + 116256 = N 2 0 + 116352 = N 0 0 + 116448 = N 3 0 + 116448 = N 0 0 + 116640 = N 1 0 + 116736 = N 4 0 + 116736 = N 0 0 + 116928 = N 2 0 + 117024 = N 1 0 + 117024 = N 2 0 + 117120 = N 0 0 + 117216 = N 2 0 + 117408 = N 2 0 + 117504 = N 0 0 + 117600 = N 2 0 + 117696 = N 0 0 + 117792 = N 2 0 + 117888 = N 0 0 + 117984 = N 3 0 + 117984 = N 0 0 + 118176 = N 1 0 + 118272 = N 4 0 + 118272 = N 0 0 + 118464 = N 2 0 + 118560 = N 1 0 + 118560 = N 2 0 + 118656 = N 0 0 + 118752 = N 2 0 + 118944 = N 2 0 + 119040 = N 0 0 + 119136 = N 2 0 + 119232 = N 0 0 + 119328 = N 1 0 + 119328 = N 2 0 + 119520 = N 3 0 + 119712 = N 1 0 + 119808 = N 4 0 + 119808 = N 0 0 + 120000 = N 2 0 + 120096 = N 2 0 + 120192 = N 0 0 + 120288 = N 2 0 + 120480 = N 2 0 + 120576 = N 0 0 + 120672 = N 2 0 + 120768 = N 1 0 + 120864 = N 2 0 + 120960 = N 0 0 + 121056 = N 4 0 + 121056 = N 0 0 + 121248 = N 2 0 + 121440 = N 1 0 + 121440 = N 2 0 + 121632 = N 2 0 + 121824 = N 2 0 + 122016 = N 2 0 + 122016 = N 0 0 + 122208 = N 1 0 + 122208 = N 2 0 + 122400 = N 2 0 + 122496 = N 1 0 + 122592 = N 2 0 + 122592 = N 0 0 + 122592 = S 2 1632 + 122784 = N 2 0 + 122976 = N 1 0 + 122976 = N 2 0 + 123168 = N 2 0 + 123360 = N 2 0 + 123552 = N 2 0 + 123552 = N 0 0 + 123744 = N 1 0 + 123744 = N 2 0 + 123840 = N 0 0 + 123936 = N 2 0 + 124128 = N 4 0 + 124128 = N 0 0 + 124320 = N 2 0 + 124512 = N 1 0 + 124512 = N 2 0 + 124704 = N 2 0 + 124896 = N 2 0 + 125088 = N 2 0 + 125088 = N 0 0 + 125280 = N 1 0 + 125280 = N 2 0 + 125472 = N 2 0 + 125568 = N 1 0 + 125664 = N 2 0 + 125664 = N 0 0 + 125856 = N 2 0 + 126048 = N 1 0 + 126048 = N 2 0 + 126240 = N 2 0 + 126432 = N 2 0 + 126624 = N 2 0 + 126624 = N 0 0 + 126816 = N 1 0 + 127008 = N 4 0 + 127200 = N 3 0 + 127200 = N 0 0 + 127392 = N 4 0 + 127584 = N 1 0 + 127584 = N 4 0 + 127776 = N 4 0 + 127968 = N 4 0 + 128160 = N 4 0 + 128160 = N 0 0 + 128352 = N 1 0 + 128352 = N 4 0 + 128544 = N 4 0 + 128736 = N 4 0 + 128736 = N 0 0 + 128928 = N 4 0 + 129120 = N 1 0 + 129120 = N 4 0 + 129312 = N 2 0 + 129312 = N 4 0 + 129504 = N 4 0 + 129696 = N 4 0 + 129696 = N 0 0 + 129888 = N 1 0 + 129888 = N 4 0 + 129984 = N 0 0 + 130080 = N 4 0 + 130272 = N 3 0 + 130272 = N 0 0 + 130464 = N 4 0 + 130656 = N 1 0 + 130656 = N 4 0 + 130848 = N 4 0 + 131040 = N 4 0 + 131232 = N 4 0 + 131232 = N 0 0 + 131424 = N 1 0 + 131424 = N 4 0 + 131616 = N 4 0 + 131808 = N 4 0 + 131808 = N 0 0 + 131808 = S 2 1632 + 132000 = N 4 0 + 132192 = N 1 0 + 132192 = N 4 0 + 132384 = N 4 0 + 132576 = N 4 0 + 132768 = N 4 0 + 132768 = N 0 0 + 132960 = N 1 0 + 132960 = N 4 0 + 133152 = N 4 0 + 133344 = N 3 0 + 133344 = N 0 0 + 133536 = N 4 0 + 133728 = N 1 0 + 133728 = N 4 0 + 133920 = N 4 0 + 134112 = N 4 0 + 134304 = N 4 0 + 134304 = N 0 0 + 134496 = N 1 0 + 134496 = N 4 0 + 134688 = N 4 0 + 134880 = N 4 0 + 134880 = N 0 0 + 135072 = N 4 0 + 135264 = N 1 0 + 135264 = N 4 0 + 135456 = N 2 0 + 135456 = N 4 0 + 135648 = N 4 0 + 135840 = N 4 0 + 135840 = N 0 0 + 136032 = N 1 0 + 136032 = N 4 0 + 136128 = N 0 0 + 136224 = N 4 0 + 136416 = N 3 0 + 136416 = N 0 0 + 136608 = N 4 0 + 136800 = N 1 0 + 136800 = N 4 0 + 136992 = N 4 0 + 137184 = N 4 0 + 137376 = N 4 0 + 137376 = N 0 0 + 137568 = N 1 0 + 137568 = N 4 0 + 137760 = N 4 0 + 137952 = N 4 0 + 137952 = N 0 0 + 138144 = N 4 0 + 138336 = N 1 0 + 138336 = N 4 0 + 138528 = N 4 0 + 138720 = N 4 0 + 138816 = N 2 0 + 139008 = N 0 0 + 139104 = N 1 0 + 139104 = N 4 0 + 139296 = N 1 0 + 139392 = N 1 0 + 139488 = N 3 0 + 139488 = N 0 0 + 139680 = N 4 0 + 139872 = N 1 0 + 139872 = N 4 0 + 140064 = N 4 0 + 140256 = N 4 0 + 140256 = S 2 1632 + 140448 = N 4 0 + 140448 = N 0 0 + 140640 = N 1 0 + 140640 = N 4 0 + 140832 = N 4 0 + 141024 = N 4 0 + 141024 = N 0 0 + 141216 = N 4 0 + 141408 = N 1 0 + 141408 = N 4 0 + 141600 = N 2 0 + 141600 = N 4 0 + 141792 = N 4 0 + 141984 = N 4 0 + 141984 = N 0 0 + 142176 = N 1 0 + 142176 = N 4 0 + 142272 = N 0 0 + 142368 = N 4 0 + 142560 = N 3 0 + 142560 = N 0 0 + 142752 = N 4 0 + 142944 = N 1 0 + 142944 = N 4 0 + 143136 = N 4 0 + 143328 = N 4 0 + 143520 = N 4 0 + 143520 = N 0 0 + 143712 = N 1 0 + 143712 = N 4 0 + 143904 = N 4 0 + 144096 = N 4 0 + 144096 = N 0 0 + 144288 = N 4 0 + 144480 = N 1 0 + 144480 = N 4 0 + 144672 = N 4 0 + 144864 = N 4 0 + 145056 = N 4 0 + 145056 = N 0 0 + 145248 = N 1 0 + 145248 = N 4 0 + 145440 = N 4 0 + 145632 = N 3 0 + 145632 = N 0 0 + 145824 = N 4 0 + 146016 = N 1 0 + 146016 = N 4 0 + 146208 = N 4 0 + 146400 = N 4 0 + 146592 = N 4 0 + 146592 = N 0 0 + 146784 = N 1 0 + 146784 = N 4 0 + 146976 = N 4 0 + 147168 = N 4 0 + 147168 = N 0 0 + 147360 = N 4 0 + 147552 = N 1 0 + 147552 = N 4 0 + 147744 = N 2 0 + 147744 = N 4 0 + 147936 = N 4 0 + 148128 = N 4 0 + 148128 = N 0 0 + 148320 = N 1 0 + 148320 = N 4 0 + 148416 = N 0 0 + 148512 = N 4 0 + 148704 = N 3 0 + 148704 = N 0 0 + 148896 = N 4 0 + 149088 = N 1 0 + 149088 = N 4 0 + 149280 = N 4 0 + 149472 = N 4 0 + 149664 = N 4 0 + 149664 = N 0 0 + 149856 = N 1 0 + 149856 = N 4 0 + 150048 = N 4 0 + 150240 = N 4 0 + 150240 = N 0 0 + 150432 = N 4 0 + 150624 = N 1 0 + 150624 = N 4 0 + 150816 = N 4 0 + 151008 = N 4 0 + 151200 = N 4 0 + 151200 = N 0 0 + 151392 = N 1 0 + 151584 = N 4 0 + 151680 = N 4 0 +} +[EasyDrums] +{ + 1536 = N 4 0 + 1536 = N 0 0 + 1728 = N 2 0 + 1920 = N 1 0 + 1920 = N 2 0 + 2112 = N 2 0 + 2304 = N 2 0 + 2496 = N 2 0 + 2688 = N 1 0 + 2688 = N 2 0 + 2880 = N 1 0 + 2880 = N 2 0 + 3072 = N 2 0 + 3072 = N 0 0 + 3264 = N 2 0 + 3456 = N 1 0 + 3456 = N 2 0 + 3648 = N 2 0 + 3840 = N 2 0 + 3840 = S 2 960 + 4032 = N 2 0 + 4224 = N 1 0 + 4416 = N 4 0 + 4608 = N 4 0 + 4608 = N 0 0 + 4800 = N 2 0 + 4992 = N 1 0 + 4992 = N 2 0 + 5184 = N 2 0 + 5376 = N 2 0 + 5568 = N 2 0 + 5760 = N 1 0 + 5760 = N 2 0 + 5952 = N 2 0 + 6144 = N 2 0 + 6336 = N 2 0 + 6528 = N 1 0 + 6528 = N 2 0 + 6720 = N 2 0 + 6912 = N 2 0 + 7104 = N 2 0 + 7296 = N 1 0 + 7296 = N 2 0 + 7488 = N 1 0 + 7680 = N 4 0 + 7680 = N 0 0 + 7968 = N 3 0 + 7968 = N 0 0 + 8256 = N 4 0 + 8256 = N 0 0 + 8448 = N 1 0 + 8640 = N 1 0 + 8832 = N 1 0 + 8832 = N 4 0 + 9216 = N 4 0 + 9216 = N 0 0 + 9408 = N 2 0 + 9600 = N 1 0 + 9600 = N 2 0 + 9792 = N 2 0 + 9984 = N 2 0 + 10176 = N 2 0 + 10368 = N 1 0 + 10368 = N 2 0 + 10560 = N 2 0 + 10752 = N 4 0 + 10752 = N 0 0 + 10944 = N 2 0 + 11136 = N 1 0 + 11424 = N 4 0 + 11424 = N 0 0 + 11424 = S 2 912 + 11616 = N 3 0 + 11616 = N 0 0 + 11808 = N 4 0 + 11808 = N 0 0 + 12096 = N 1 0 + 12288 = N 4 0 + 12288 = N 0 0 + 12480 = N 2 0 + 12672 = N 1 0 + 12672 = N 2 0 + 12864 = N 2 0 + 13056 = N 2 0 + 13248 = N 2 0 + 13440 = N 1 0 + 13440 = N 2 0 + 13632 = N 2 0 + 13824 = N 4 0 + 13824 = N 0 0 + 14016 = N 2 0 + 14208 = N 1 0 + 14496 = N 4 0 + 14496 = N 0 0 + 14688 = N 3 0 + 14688 = N 0 0 + 14880 = N 4 0 + 14880 = N 0 0 + 15072 = N 1 0 + 15168 = N 1 0 + 15360 = N 3 0 + 15360 = N 0 0 + 15648 = N 4 0 + 15936 = N 1 0 + 16032 = N 0 0 + 16320 = N 1 0 + 16416 = N 0 0 + 16608 = N 0 0 + 16704 = N 1 0 + 16896 = N 3 0 + 16896 = N 0 0 + 17184 = N 4 0 + 17184 = N 0 0 + 17472 = N 1 0 + 17568 = N 0 0 + 17856 = N 1 0 + 17952 = N 0 0 + 18144 = N 0 0 + 18240 = N 1 0 + 18432 = N 3 0 + 18432 = N 0 0 + 18720 = N 4 0 + 18720 = N 0 0 + 19008 = N 1 0 + 19104 = N 0 0 + 19392 = N 1 0 + 19488 = N 0 0 + 19680 = N 0 0 + 19776 = N 1 0 + 19968 = N 3 0 + 19968 = N 0 0 + 19968 = S 2 1536 + 20256 = N 4 0 + 20256 = N 0 0 + 20544 = N 1 0 + 20640 = N 0 0 + 20928 = N 1 0 + 21024 = N 0 0 + 21216 = N 0 0 + 21312 = N 1 0 + 21408 = N 0 0 + 22080 = N 4 0 + 22080 = N 0 0 + 22272 = N 3 0 + 22272 = N 0 0 + 22464 = N 4 0 + 22464 = N 0 0 + 22656 = N 1 0 + 22752 = N 0 0 + 23040 = N 0 0 + 23232 = N 0 0 + 23328 = N 0 0 + 23424 = N 1 0 + 23616 = N 0 0 + 23808 = N 0 0 + 24000 = N 0 0 + 24192 = N 4 0 + 24192 = N 0 0 + 24480 = N 3 0 + 24480 = N 0 0 + 24768 = N 0 0 + 24960 = N 0 0 + 25152 = N 0 0 + 25344 = N 1 0 + 25440 = N 0 0 + 25632 = N 0 0 + 25728 = N 0 0 + 25920 = N 1 0 + 26016 = N 0 0 + 26208 = N 0 0 + 26304 = N 0 0 + 26496 = N 0 0 + 26688 = N 0 0 + 26880 = N 4 0 + 26880 = N 0 0 + 27264 = N 1 0 + 27360 = N 0 0 + 27456 = N 0 0 + 27648 = N 0 0 + 27840 = N 0 0 + 28032 = N 1 0 + 28128 = N 0 0 + 28224 = S 2 1440 + 28320 = N 0 0 + 28416 = N 0 0 + 28608 = N 0 0 + 28704 = N 0 0 + 28800 = N 1 0 + 28992 = N 0 0 + 29184 = N 0 0 + 29376 = N 0 0 + 29568 = N 4 0 + 29568 = N 0 0 + 29856 = N 3 0 + 29856 = N 0 0 + 30144 = N 0 0 + 30336 = N 0 0 + 30528 = N 0 0 + 30720 = N 1 0 + 30816 = N 0 0 + 31008 = N 0 0 + 31104 = N 0 0 + 31296 = N 1 0 + 31392 = N 0 0 + 31584 = N 0 0 + 31680 = N 0 0 + 31872 = N 0 0 + 32064 = N 0 0 + 32256 = N 4 0 + 32256 = N 0 0 + 32448 = N 2 0 + 32640 = N 1 0 + 32640 = N 2 0 + 32832 = N 2 0 + 33024 = N 2 0 + 33216 = N 2 0 + 33408 = N 1 0 + 33408 = N 2 0 + 33600 = N 2 0 + 33792 = N 4 0 + 33792 = N 0 0 + 33984 = N 2 0 + 34176 = N 1 0 + 34176 = N 2 0 + 34368 = N 2 0 + 34560 = N 2 0 + 34752 = N 2 0 + 34944 = N 1 0 + 34944 = N 2 0 + 35136 = N 2 0 + 35328 = N 2 0 + 35616 = N 4 0 + 35616 = N 0 0 + 35904 = N 1 0 + 35904 = N 2 0 + 36096 = N 2 0 + 36288 = N 1 0 + 36288 = N 2 0 + 36480 = N 2 0 + 36672 = N 1 0 + 36672 = N 2 0 + 36864 = N 2 0 + 37056 = N 1 0 + 37056 = N 2 0 + 37248 = N 4 0 + 37248 = N 0 0 + 37248 = S 2 1584 + 37440 = N 1 0 + 37440 = N 2 0 + 37632 = N 2 0 + 37824 = N 1 0 + 37824 = N 2 0 + 38016 = N 2 0 + 38208 = N 1 0 + 38208 = N 2 0 + 38400 = N 2 0 + 38592 = N 1 0 + 38784 = N 4 0 + 38784 = N 0 0 + 39072 = N 2 0 + 39264 = N 1 0 + 39264 = N 2 0 + 39456 = N 2 0 + 39648 = N 2 0 + 39840 = N 2 0 + 40032 = N 1 0 + 40032 = N 2 0 + 40224 = N 2 0 + 40416 = N 2 0 + 40608 = N 2 0 + 40800 = N 1 0 + 40800 = N 2 0 + 40992 = N 2 0 + 41184 = N 2 0 + 41376 = N 2 0 + 41568 = N 1 0 + 41568 = N 2 0 + 41760 = N 1 0 + 41952 = N 4 0 + 41952 = N 0 0 + 42240 = N 4 0 + 42528 = N 4 0 + 43296 = N 2 0 + 43488 = N 4 0 + 43488 = N 0 0 + 44448 = N 4 0 + 44640 = N 4 0 + 44832 = N 4 0 + 45024 = N 4 0 + 45168 = N 4 0 + 46368 = N 1 0 + 46560 = N 4 0 + 46560 = N 0 0 + 46752 = N 2 0 + 46944 = N 1 0 + 46944 = N 2 0 + 47136 = N 2 0 + 47328 = N 2 0 + 47328 = S 2 864 + 47520 = N 2 0 + 47712 = N 1 0 + 47712 = N 2 0 + 47904 = N 2 0 + 48096 = N 2 0 + 48288 = N 2 0 + 48480 = N 1 0 + 48480 = N 2 0 + 48672 = N 2 0 + 48864 = N 2 0 + 49056 = N 2 0 + 49248 = N 1 0 + 49248 = N 2 0 + 49440 = N 2 0 + 49632 = N 4 0 + 49632 = N 0 0 + 49824 = N 2 0 + 50016 = N 1 0 + 50016 = N 2 0 + 50208 = N 2 0 + 50400 = N 2 0 + 50592 = N 2 0 + 50784 = N 1 0 + 50784 = N 2 0 + 50976 = N 2 0 + 51168 = N 2 0 + 51360 = N 2 0 + 51552 = N 1 0 + 51552 = N 2 0 + 51744 = N 2 0 + 51936 = N 2 0 + 52128 = N 2 0 + 52320 = N 1 0 + 52320 = N 2 0 + 52512 = N 2 0 + 52704 = N 4 0 + 52704 = N 0 0 + 52896 = N 2 0 + 53088 = N 1 0 + 53088 = N 2 0 + 53280 = N 2 0 + 53472 = N 2 0 + 53664 = N 2 0 + 53856 = N 1 0 + 53856 = N 2 0 + 54048 = N 2 0 + 54240 = N 2 0 + 54432 = N 2 0 + 54624 = N 1 0 + 54624 = N 2 0 + 54816 = N 2 0 + 55008 = N 2 0 + 55200 = N 2 0 + 55392 = N 1 0 + 55392 = N 2 0 + 55584 = N 2 0 + 55776 = N 4 0 + 55776 = N 0 0 + 55776 = S 2 864 + 55968 = N 2 0 + 56160 = N 1 0 + 56160 = N 2 0 + 56352 = N 2 0 + 56544 = N 2 0 + 56736 = N 2 0 + 56928 = N 1 0 + 56928 = N 2 0 + 57120 = N 2 0 + 57312 = N 2 0 + 57504 = N 2 0 + 57696 = N 1 0 + 57696 = N 2 0 + 57888 = N 2 0 + 58080 = N 2 0 + 58272 = N 2 0 + 58464 = N 1 0 + 58656 = N 1 0 + 58848 = N 4 0 + 58848 = N 0 0 + 59040 = N 2 0 + 59232 = N 2 0 + 59424 = N 2 0 + 59616 = N 2 0 + 59808 = N 2 0 + 59808 = N 0 0 + 60000 = N 2 0 + 60192 = N 2 0 + 60384 = N 2 0 + 60576 = N 2 0 + 60768 = N 2 0 + 60768 = N 0 0 + 61056 = N 2 0 + 61056 = N 0 0 + 61248 = N 2 0 + 61440 = N 2 0 + 61632 = N 2 0 + 61824 = N 2 0 + 62016 = N 2 0 + 62208 = N 2 0 + 62400 = N 2 0 + 62640 = N 0 0 + 62832 = N 0 0 + 63024 = N 0 0 + 63264 = N 4 0 + 63264 = N 0 0 + 63456 = N 2 0 + 63648 = N 2 0 + 63840 = N 2 0 + 64032 = N 2 0 + 64224 = N 2 0 + 64224 = N 0 0 + 64416 = N 2 0 + 64608 = N 2 0 + 64800 = N 2 0 + 64800 = S 2 768 + 64992 = N 2 0 + 65184 = N 2 0 + 65184 = N 0 0 + 65472 = N 4 0 + 65472 = N 0 0 + 65664 = N 2 0 + 65856 = N 2 0 + 66048 = N 2 0 + 66240 = N 2 0 + 66432 = N 2 0 + 66432 = N 0 0 + 66624 = N 2 0 + 66816 = N 2 0 + 67056 = N 0 0 + 67248 = N 0 0 + 67440 = N 0 0 + 67680 = N 4 0 + 67680 = N 0 0 + 67872 = N 2 0 + 68064 = N 2 0 + 68256 = N 2 0 + 68448 = N 2 0 + 68640 = N 2 0 + 68640 = N 0 0 + 68832 = N 2 0 + 69024 = N 2 0 + 69216 = N 2 0 + 69408 = N 2 0 + 69600 = N 2 0 + 69600 = N 0 0 + 69888 = N 4 0 + 69888 = N 0 0 + 70080 = N 2 0 + 70272 = N 2 0 + 70464 = N 2 0 + 70656 = N 2 0 + 70848 = N 2 0 + 70848 = N 0 0 + 71040 = N 2 0 + 71232 = N 2 0 + 71472 = N 0 0 + 71664 = N 0 0 + 71856 = N 0 0 + 72096 = N 4 0 + 72096 = N 0 0 + 72096 = S 2 768 + 72288 = N 2 0 + 72480 = N 2 0 + 72672 = N 2 0 + 72864 = N 2 0 + 73056 = N 2 0 + 73056 = N 0 0 + 73248 = N 2 0 + 73440 = N 2 0 + 73632 = N 2 0 + 73824 = N 2 0 + 74016 = N 2 0 + 74016 = N 0 0 + 74304 = N 2 0 + 74304 = N 0 0 + 74496 = N 2 0 + 74688 = N 2 0 + 74880 = N 2 0 + 75072 = N 2 0 + 75264 = N 2 0 + 75264 = N 0 0 + 75456 = N 2 0 + 75648 = N 2 0 + 75888 = N 1 0 + 76080 = N 1 0 + 76272 = N 1 0 + 76512 = N 4 0 + 76512 = N 0 0 + 76704 = N 1 0 + 76704 = N 2 0 + 76896 = N 2 0 + 77088 = N 1 0 + 77088 = N 2 0 + 77280 = N 2 0 + 77472 = N 1 0 + 77472 = N 2 0 + 77664 = N 2 0 + 77856 = N 1 0 + 77856 = N 2 0 + 78048 = N 2 0 + 78240 = N 1 0 + 78240 = N 2 0 + 78432 = N 2 0 + 78624 = N 1 0 + 78624 = N 2 0 + 78816 = N 2 0 + 79008 = N 1 0 + 79008 = N 2 0 + 79200 = N 2 0 + 79392 = N 1 0 + 79392 = N 2 0 + 79584 = N 2 0 + 79776 = N 1 0 + 79776 = N 2 0 + 79968 = N 2 0 + 80160 = N 1 0 + 80160 = N 2 0 + 80304 = N 4 0 + 80304 = N 0 0 + 80304 = S 2 816 + 80592 = N 2 0 + 80688 = N 2 0 + 80928 = N 1 0 + 80928 = N 2 0 + 81120 = N 2 0 + 81312 = N 1 0 + 81312 = N 2 0 + 81504 = N 2 0 + 81696 = N 1 0 + 81696 = N 2 0 + 81888 = N 2 0 + 82080 = N 1 0 + 82080 = N 2 0 + 82272 = N 2 0 + 82368 = N 2 0 + 82464 = N 1 0 + 82608 = N 4 0 + 82608 = N 0 0 + 82848 = N 2 0 + 83040 = N 1 0 + 83040 = N 2 0 + 83232 = N 2 0 + 83424 = N 2 0 + 83616 = N 2 0 + 83808 = N 1 0 + 83808 = N 2 0 + 84000 = N 2 0 + 84192 = N 2 0 + 84384 = N 2 0 + 84576 = N 1 0 + 84576 = N 2 0 + 84768 = N 2 0 + 84960 = N 2 0 + 85536 = N 3 0 + 85536 = N 0 0 + 85728 = N 4 0 + 85920 = N 4 0 + 86112 = N 1 0 + 86112 = N 4 0 + 86304 = N 4 0 + 86496 = N 4 0 + 86496 = N 0 0 + 86688 = N 4 0 + 86880 = N 1 0 + 86880 = N 4 0 + 87072 = N 4 0 + 87216 = N 3 0 + 87216 = N 0 0 + 87648 = N 1 0 + 87840 = N 2 0 + 88032 = N 2 0 + 88224 = N 2 0 + 88416 = N 1 0 + 88416 = N 2 0 + 88416 = S 2 1824 + 88608 = N 2 0 + 88800 = N 2 0 + 88992 = N 2 0 + 89184 = N 1 0 + 89184 = N 2 0 + 89376 = N 2 0 + 89568 = N 2 0 + 90144 = N 3 0 + 90144 = N 0 0 + 90336 = N 4 0 + 90528 = N 4 0 + 90720 = N 1 0 + 90720 = N 4 0 + 90912 = N 4 0 + 91104 = N 4 0 + 91104 = N 0 0 + 91296 = N 4 0 + 91488 = N 1 0 + 91488 = N 4 0 + 91680 = N 4 0 + 91872 = N 3 0 + 91872 = N 0 0 + 92064 = N 1 0 + 92256 = N 1 0 + 92448 = N 1 0 + 92640 = N 1 0 + 92832 = N 1 0 + 93024 = N 1 0 + 93216 = N 1 0 + 93408 = N 1 0 + 93600 = N 1 0 + 93792 = N 1 0 + 93984 = N 1 0 + 94176 = N 1 0 + 94368 = N 1 0 + 94560 = N 1 0 + 94752 = N 1 0 + 94944 = N 1 0 + 95136 = N 1 0 + 95328 = N 1 0 + 95520 = N 1 0 + 95712 = N 1 0 + 95904 = N 1 0 + 96096 = N 1 0 + 96288 = N 1 0 + 96480 = N 1 0 + 96672 = N 1 0 + 96864 = N 1 0 + 97056 = N 1 0 + 97248 = N 1 0 + 97248 = S 2 816 + 97440 = N 1 0 + 97632 = N 1 0 + 97824 = N 1 0 + 98016 = N 3 0 + 98016 = N 0 0 + 98208 = N 1 0 + 98400 = N 1 0 + 98592 = N 1 0 + 98784 = N 1 0 + 98976 = N 1 0 + 99168 = N 1 0 + 99360 = N 1 0 + 99552 = N 1 0 + 99744 = N 1 0 + 99936 = N 1 0 + 100128 = N 1 0 + 100320 = N 1 0 + 100512 = N 1 0 + 100704 = N 1 0 + 100896 = N 1 0 + 101088 = N 1 0 + 101280 = N 1 0 + 101472 = N 1 0 + 101664 = N 1 0 + 101856 = N 1 0 + 102048 = N 1 0 + 102240 = N 1 0 + 102432 = N 1 0 + 102624 = N 1 0 + 102816 = N 1 0 + 103008 = N 1 0 + 103200 = N 1 0 + 103392 = N 1 0 + 103584 = N 1 0 + 103776 = N 1 0 + 103968 = N 1 0 + 104160 = N 3 0 + 104160 = N 0 0 + 104160 = S 2 1536 + 104352 = N 2 0 + 104544 = N 1 0 + 104544 = N 2 0 + 104736 = N 2 0 + 104928 = N 2 0 + 105120 = N 2 0 + 105312 = N 2 0 + 105504 = N 2 0 + 105600 = N 1 0 + 105696 = N 2 0 + 105888 = N 2 0 + 106080 = N 1 0 + 106080 = N 2 0 + 106272 = N 2 0 + 106464 = N 2 0 + 106656 = N 2 0 + 106848 = N 1 0 + 106848 = N 2 0 + 107040 = N 1 0 + 107232 = N 4 0 + 107232 = N 0 0 + 107520 = N 3 0 + 107520 = N 0 0 + 107808 = N 3 0 + 107808 = N 0 0 + 108000 = N 1 0 + 108192 = N 1 0 + 108384 = N 1 0 + 108384 = N 4 0 + 108768 = N 4 0 + 108768 = N 0 0 + 108960 = N 2 0 + 109152 = N 1 0 + 109152 = N 2 0 + 109344 = N 2 0 + 109536 = N 2 0 + 109728 = N 2 0 + 109920 = N 1 0 + 109920 = N 2 0 + 110112 = N 2 0 + 110304 = N 4 0 + 110304 = N 0 0 + 110496 = N 2 0 + 110688 = N 1 0 + 110688 = N 2 0 + 110976 = N 4 0 + 110976 = N 0 0 + 111168 = N 3 0 + 111168 = N 0 0 + 111360 = N 4 0 + 111360 = N 0 0 + 111648 = N 1 0 + 111744 = N 4 0 + 111840 = N 4 0 + 111840 = N 0 0 + 112032 = N 2 0 + 112224 = N 1 0 + 112224 = N 2 0 + 112416 = N 2 0 + 112608 = N 2 0 + 112800 = N 2 0 + 112992 = N 1 0 + 112992 = N 2 0 + 113184 = N 2 0 + 113376 = N 4 0 + 113376 = N 0 0 + 113376 = S 2 1632 + 113568 = N 2 0 + 113760 = N 1 0 + 113760 = N 2 0 + 114048 = N 4 0 + 114048 = N 0 0 + 114240 = N 3 0 + 114240 = N 0 0 + 114432 = N 4 0 + 114432 = N 0 0 + 114624 = N 1 0 + 114720 = N 1 0 + 114912 = N 3 0 + 114912 = N 0 0 + 115200 = N 4 0 + 115200 = N 0 0 + 115488 = N 1 0 + 115584 = N 0 0 + 115968 = N 0 0 + 116160 = N 0 0 + 116256 = N 1 0 + 116448 = N 3 0 + 116448 = N 0 0 + 116736 = N 4 0 + 116736 = N 0 0 + 117024 = N 1 0 + 117120 = N 0 0 + 117504 = N 0 0 + 117696 = N 0 0 + 117984 = N 3 0 + 117984 = N 0 0 + 118272 = N 4 0 + 118272 = N 0 0 + 118560 = N 1 0 + 118656 = N 0 0 + 119040 = N 0 0 + 119232 = N 0 0 + 119328 = N 1 0 + 119520 = N 3 0 + 119808 = N 4 0 + 119808 = N 0 0 + 120096 = N 2 0 + 120288 = N 2 0 + 120480 = N 2 0 + 120672 = N 2 0 + 120768 = N 1 0 + 120864 = N 2 0 + 121056 = N 4 0 + 121056 = N 0 0 + 121248 = N 2 0 + 121440 = N 1 0 + 121440 = N 2 0 + 121632 = N 2 0 + 121824 = N 2 0 + 122016 = N 2 0 + 122208 = N 1 0 + 122208 = N 2 0 + 122400 = N 2 0 + 122496 = N 1 0 + 122592 = N 2 0 + 122592 = S 2 1632 + 122784 = N 2 0 + 122976 = N 1 0 + 122976 = N 2 0 + 123168 = N 2 0 + 123360 = N 2 0 + 123552 = N 2 0 + 123744 = N 1 0 + 123744 = N 2 0 + 123936 = N 2 0 + 124128 = N 4 0 + 124128 = N 0 0 + 124320 = N 2 0 + 124512 = N 1 0 + 124512 = N 2 0 + 124704 = N 2 0 + 124896 = N 2 0 + 125088 = N 2 0 + 125280 = N 1 0 + 125280 = N 2 0 + 125472 = N 2 0 + 125568 = N 1 0 + 125664 = N 2 0 + 125856 = N 2 0 + 126048 = N 1 0 + 126048 = N 2 0 + 126240 = N 2 0 + 126432 = N 2 0 + 126624 = N 2 0 + 126816 = N 1 0 + 127008 = N 4 0 + 127200 = N 3 0 + 127200 = N 0 0 + 127392 = N 4 0 + 127584 = N 1 0 + 127584 = N 4 0 + 127776 = N 4 0 + 127968 = N 4 0 + 128160 = N 4 0 + 128352 = N 1 0 + 128352 = N 4 0 + 128544 = N 4 0 + 128736 = N 4 0 + 128928 = N 4 0 + 129120 = N 1 0 + 129120 = N 4 0 + 129312 = N 2 0 + 129312 = N 4 0 + 129504 = N 4 0 + 129696 = N 4 0 + 129888 = N 1 0 + 129888 = N 4 0 + 130080 = N 4 0 + 130272 = N 3 0 + 130272 = N 0 0 + 130464 = N 4 0 + 130656 = N 1 0 + 130656 = N 4 0 + 130848 = N 4 0 + 131040 = N 4 0 + 131232 = N 4 0 + 131424 = N 1 0 + 131424 = N 4 0 + 131616 = N 4 0 + 131808 = N 4 0 + 131808 = S 2 1632 + 132000 = N 4 0 + 132192 = N 1 0 + 132192 = N 4 0 + 132384 = N 4 0 + 132576 = N 4 0 + 132768 = N 4 0 + 132960 = N 1 0 + 132960 = N 4 0 + 133152 = N 4 0 + 133344 = N 3 0 + 133344 = N 0 0 + 133536 = N 4 0 + 133728 = N 1 0 + 133728 = N 4 0 + 133920 = N 4 0 + 134112 = N 4 0 + 134304 = N 4 0 + 134496 = N 1 0 + 134496 = N 4 0 + 134688 = N 4 0 + 134880 = N 4 0 + 135072 = N 4 0 + 135264 = N 1 0 + 135264 = N 4 0 + 135456 = N 2 0 + 135456 = N 4 0 + 135648 = N 4 0 + 135840 = N 4 0 + 136032 = N 1 0 + 136032 = N 4 0 + 136224 = N 4 0 + 136416 = N 3 0 + 136416 = N 0 0 + 136608 = N 4 0 + 136800 = N 1 0 + 136800 = N 4 0 + 136992 = N 4 0 + 137184 = N 4 0 + 137376 = N 4 0 + 137568 = N 1 0 + 137568 = N 4 0 + 137760 = N 4 0 + 137952 = N 4 0 + 138144 = N 4 0 + 138336 = N 1 0 + 138336 = N 4 0 + 138528 = N 4 0 + 138720 = N 4 0 + 138816 = N 2 0 + 139104 = N 1 0 + 139104 = N 4 0 + 139296 = N 1 0 + 139488 = N 3 0 + 139488 = N 0 0 + 139680 = N 4 0 + 139872 = N 1 0 + 139872 = N 4 0 + 140064 = N 4 0 + 140256 = N 4 0 + 140256 = S 2 1632 + 140448 = N 4 0 + 140640 = N 1 0 + 140640 = N 4 0 + 140832 = N 4 0 + 141024 = N 4 0 + 141216 = N 4 0 + 141408 = N 1 0 + 141408 = N 4 0 + 141600 = N 2 0 + 141600 = N 4 0 + 141792 = N 4 0 + 141984 = N 4 0 + 142176 = N 1 0 + 142176 = N 4 0 + 142368 = N 4 0 + 142560 = N 3 0 + 142560 = N 0 0 + 142752 = N 4 0 + 142944 = N 1 0 + 142944 = N 4 0 + 143136 = N 4 0 + 143328 = N 4 0 + 143520 = N 4 0 + 143712 = N 1 0 + 143712 = N 4 0 + 143904 = N 4 0 + 144096 = N 4 0 + 144288 = N 4 0 + 144480 = N 1 0 + 144480 = N 4 0 + 144672 = N 4 0 + 144864 = N 4 0 + 145056 = N 4 0 + 145248 = N 1 0 + 145248 = N 4 0 + 145440 = N 4 0 + 145632 = N 3 0 + 145632 = N 0 0 + 145824 = N 4 0 + 146016 = N 1 0 + 146016 = N 4 0 + 146208 = N 4 0 + 146400 = N 4 0 + 146592 = N 4 0 + 146784 = N 1 0 + 146784 = N 4 0 + 146976 = N 4 0 + 147168 = N 4 0 + 147360 = N 4 0 + 147552 = N 1 0 + 147552 = N 4 0 + 147744 = N 2 0 + 147744 = N 4 0 + 147936 = N 4 0 + 148128 = N 4 0 + 148320 = N 1 0 + 148320 = N 4 0 + 148512 = N 4 0 + 148704 = N 3 0 + 148704 = N 0 0 + 148896 = N 4 0 + 149088 = N 1 0 + 149088 = N 4 0 + 149280 = N 4 0 + 149472 = N 4 0 + 149664 = N 4 0 + 149856 = N 1 0 + 149856 = N 4 0 + 150048 = N 4 0 + 150240 = N 4 0 + 150432 = N 4 0 + 150624 = N 1 0 + 150624 = N 4 0 + 150816 = N 4 0 + 151008 = N 4 0 + 151200 = N 4 0 + 151392 = N 1 0 + 151584 = N 4 0 + 151680 = N 4 0 +} diff --git a/songs/Stevie-Wonder-Contusion/notes.chart b/songs/Stevie-Wonder-Contusion/notes.chart new file mode 100644 index 0000000..cd84cc9 --- /dev/null +++ b/songs/Stevie-Wonder-Contusion/notes.chart @@ -0,0 +1,2914 @@ +[Song] +{ + Name = "Contusion" + Artist = "Stevie Wonder" + Charter = "GuitarZero132" + Album = "Songs in the Key of Life" + Year = ", 1976" + Offset = 0 + Resolution = 192 + Player2 = bass + Difficulty = 0 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "Jazz Fusion" + MediaType = "cd" + MusicStream = "song.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 115000 + 1536 = B 122000 + 2688 = B 124000 + 5760 = B 125000 + 6528 = B 123000 + 8064 = B 124000 + 9216 = B 126000 + 9792 = B 125000 + 10752 = TS 4 + 10752 = B 124000 + 11520 = TS 5 + 12288 = B 125000 + 13056 = B 126000 + 13440 = TS 4 + 13440 = B 127000 + 16128 = B 130000 + 16512 = TS 6 + 16512 = B 129000 + 17664 = TS 4 + 17664 = B 131000 + 18432 = TS 6 + 18816 = B 134000 + 19200 = B 129000 + 19584 = TS 5 + 19584 = B 126000 + 20544 = B 129000 + 21504 = TS 4 + 21504 = B 130000 + 23040 = B 133000 + 23424 = B 130000 + 24576 = TS 6 + 25728 = TS 4 + 25728 = B 134000 + 26880 = B 138000 + 27264 = B 120000 + 28032 = B 129000 + 30144 = B 130000 + 33024 = B 129000 + 33600 = B 128000 + 34176 = B 126000 + 34944 = B 130000 + 40320 = TS 5 + 40320 = B 125000 + 41280 = B 127000 + 42240 = TS 4 + 42240 = B 129000 + 43776 = B 131000 + 44736 = B 129000 + 45312 = TS 6 + 46080 = B 135000 + 46464 = TS 4 + 46464 = B 130000 + 47232 = TS 6 + 47616 = B 137000 + 48000 = B 125000 + 48384 = TS 5 + 48384 = B 127000 + 50112 = B 130000 + 50304 = TS 4 + 51072 = B 130000 + 53376 = TS 6 + 54528 = TS 4 + 54528 = B 132000 + 56064 = B 123000 + 56832 = TS 4 + 56832 = B 128000 + 57600 = B 130000 + 59136 = B 130000 + 61632 = B 133000 + 62208 = B 130000 + 62976 = B 127000 + 63552 = B 129000 + 66816 = B 131000 + 67584 = B 128000 + 69120 = TS 5 + 69120 = B 127000 + 69504 = B 126000 + 70848 = B 132000 + 71040 = TS 4 + 72576 = B 136000 + 72960 = B 131000 + 74112 = TS 6 + 74112 = B 129000 + 74880 = B 135000 + 75264 = TS 4 + 75264 = B 133000 + 76032 = TS 6 + 76416 = B 141000 + 76800 = B 127000 + 77184 = TS 5 + 77184 = B 128000 + 78912 = B 132000 + 79104 = TS 4 + 79104 = B 131000 + 82176 = TS 6 + 82944 = B 134000 + 83328 = TS 4 + 84096 = TS 5 + 85056 = TS 4 + 85056 = B 132000 + 85824 = TS 5 + 86016 = B 138000 + 86784 = TS 4 + 86784 = B 128000 + 87360 = B 137000 + 87552 = TS 5 + 88128 = B 130000 + 88512 = TS 4 + 89088 = B 136000 + 89280 = TS 5 + 90240 = TS 4 + 90240 = B 133000 + 91008 = B 141000 + 91776 = B 136000 + 92160 = B 132000 + 93312 = B 125000 + 93696 = B 122000 +} +[Events] +{ + 1440 = E "section Intro" + 11328 = E "section Chorus 1A" + 19392 = E "section Chorus 1B" + 28032 = E "section Verse 1A" + 34176 = E "section Verse 1B" + 40128 = E "section Chorus 2A" + 48192 = E "section Chorus 2B" + 56832 = E "section Verse 2A" + 62976 = E "section Verse 2B" + 68928 = E "section Chorus 3A" + 76992 = E "section Chorus 3B" + 83328 = E "section Outro" + 91776 = E "section Ending" +} +[ExpertSingle] +{ + 1536 = N 3 0 + 1536 = N 4 0 + 1680 = N 2 0 + 1680 = N 3 0 + 2112 = N 1 0 + 2208 = N 1 0 + 2304 = N 1 0 + 2400 = N 1 0 + 2496 = N 1 0 + 2592 = N 1 0 + 2688 = N 1 0 + 2784 = N 1 0 + 2880 = N 1 0 + 3072 = N 3 0 + 3072 = N 4 0 + 3216 = N 2 0 + 3216 = N 3 0 + 3504 = N 1 0 + 3600 = N 1 0 + 3648 = N 1 0 + 3744 = N 1 0 + 3840 = N 1 0 + 3936 = N 1 0 + 4032 = N 1 0 + 4128 = N 1 0 + 4224 = N 1 0 + 4320 = N 1 0 + 4416 = N 1 0 + 4464 = N 2 112 + 4608 = N 2 0 + 4608 = N 4 0 + 4752 = N 1 0 + 4752 = N 3 0 + 5040 = N 1 0 + 5184 = N 1 0 + 5424 = N 1 0 + 5616 = N 1 0 + 5760 = N 1 0 + 5856 = N 1 0 + 5952 = N 1 0 + 6144 = N 2 0 + 6144 = N 4 0 + 6144 = S 2 1536 + 6288 = N 1 0 + 6288 = N 3 0 + 6624 = N 1 0 + 6720 = N 1 0 + 6768 = N 1 0 + 6912 = N 1 0 + 6960 = N 1 0 + 7056 = N 1 0 + 7200 = N 1 0 + 7248 = N 1 0 + 7392 = N 1 0 + 7488 = N 1 0 + 7536 = N 2 112 + 7680 = N 1 0 + 7680 = N 4 0 + 7824 = N 0 0 + 7824 = N 3 0 + 8064 = N 1 0 + 8160 = N 1 0 + 8256 = N 1 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8736 = N 1 0 + 8832 = N 1 0 + 8928 = N 1 0 + 9216 = N 2 0 + 9216 = N 4 0 + 9360 = N 1 0 + 9360 = N 3 0 + 9600 = N 1 0 + 9744 = N 1 0 + 9888 = N 1 0 + 10032 = N 1 0 + 10176 = N 1 0 + 10272 = N 1 0 + 10368 = N 1 0 + 10464 = N 1 0 + 10560 = N 1 0 + 10608 = N 2 624 + 11328 = N 0 0 + 11376 = N 1 0 + 11424 = N 2 0 + 11472 = N 1 0 + 11520 = N 3 160 + 11712 = N 1 0 + 11808 = N 1 0 + 11856 = N 2 400 + 12288 = N 1 0 + 12336 = N 2 0 + 12384 = N 3 0 + 12432 = N 2 0 + 12480 = N 4 160 + 12672 = N 2 0 + 12768 = N 2 0 + 12816 = N 3 288 + 13248 = N 0 0 + 13296 = N 1 0 + 13344 = N 2 0 + 13392 = N 3 0 + 13440 = N 3 0 + 13488 = N 4 2032 + 15360 = S 2 768 + 15600 = N 2 0 + 15600 = N 3 0 + 15744 = N 0 0 + 15840 = N 1 0 + 15888 = N 2 0 + 15984 = N 2 0 + 15984 = N 3 0 + 16128 = N 0 0 + 16128 = N 1 0 + 16224 = N 0 0 + 16224 = N 2 0 + 16320 = N 0 0 + 16320 = N 1 0 + 16416 = N 0 0 + 16416 = N 2 0 + 16512 = N 0 0 + 16608 = N 0 0 + 16656 = N 0 0 + 16704 = N 0 0 + 16704 = N 1 0 + 16800 = N 0 0 + 16800 = N 2 0 + 16896 = N 0 0 + 16896 = N 1 0 + 16992 = N 0 0 + 16992 = N 2 0 + 17088 = N 0 0 + 17136 = N 0 0 + 17184 = N 0 0 + 17232 = N 0 0 + 17280 = N 0 0 + 17280 = N 1 0 + 17376 = N 0 0 + 17376 = N 2 0 + 17472 = N 0 0 + 17472 = N 1 0 + 17568 = N 0 0 + 17568 = N 2 0 + 17664 = N 3 0 + 17664 = N 4 0 + 17808 = N 3 0 + 17808 = N 4 0 + 17952 = N 2 0 + 17952 = N 4 0 + 18096 = N 2 0 + 18096 = N 4 0 + 18240 = N 2 0 + 18240 = N 3 0 + 18384 = N 2 0 + 18384 = N 3 0 + 18528 = N 1 0 + 18528 = N 3 0 + 18672 = N 1 0 + 18672 = N 3 0 + 18816 = N 2 0 + 18816 = N 4 0 + 19008 = N 2 0 + 19008 = N 3 0 + 19200 = N 0 160 + 19200 = N 3 160 + 19392 = N 0 0 + 19440 = N 1 0 + 19488 = N 2 0 + 19536 = N 1 0 + 19584 = N 3 160 + 19776 = N 1 0 + 19872 = N 1 0 + 19920 = N 2 400 + 20352 = N 1 0 + 20400 = N 2 0 + 20448 = N 3 0 + 20496 = N 2 0 + 20544 = N 4 160 + 20736 = N 2 0 + 20832 = N 2 0 + 20880 = N 3 288 + 21312 = N 0 0 + 21360 = N 1 0 + 21408 = N 2 0 + 21456 = N 3 0 + 21504 = N 3 0 + 21552 = N 4 1488 + 23664 = N 2 0 + 23664 = N 3 0 + 23856 = N 2 0 + 23856 = N 3 0 + 23904 = N 2 0 + 23904 = N 5 0 + 23952 = N 2 0 + 23952 = N 3 0 + 24000 = N 2 0 + 24000 = N 5 0 + 24048 = N 2 0 + 24096 = N 2 0 + 24096 = N 3 0 + 24192 = N 0 0 + 24192 = N 1 0 + 24288 = N 0 0 + 24288 = N 2 0 + 24384 = N 0 0 + 24384 = N 1 0 + 24480 = N 0 0 + 24480 = N 2 0 + 24576 = N 0 0 + 24672 = N 0 0 + 24720 = N 0 0 + 24768 = N 0 0 + 24768 = N 1 0 + 24864 = N 0 0 + 24864 = N 2 0 + 24960 = N 0 0 + 24960 = N 1 0 + 25056 = N 0 0 + 25056 = N 2 0 + 25152 = N 0 0 + 25200 = N 0 0 + 25248 = N 0 0 + 25296 = N 0 0 + 25344 = N 0 0 + 25344 = N 1 0 + 25440 = N 0 0 + 25440 = N 2 0 + 25536 = N 0 0 + 25536 = N 1 0 + 25632 = N 0 0 + 25632 = N 2 0 + 25728 = N 3 0 + 25728 = N 4 0 + 25728 = S 2 1920 + 25872 = N 3 0 + 25872 = N 4 0 + 26016 = N 2 0 + 26016 = N 4 0 + 26160 = N 2 0 + 26160 = N 4 0 + 26304 = N 2 0 + 26304 = N 3 0 + 26448 = N 2 0 + 26448 = N 3 0 + 26592 = N 1 0 + 26592 = N 3 0 + 26688 = N 1 0 + 26688 = N 3 0 + 26880 = N 2 0 + 26880 = N 4 0 + 27072 = N 2 0 + 27072 = N 3 0 + 27264 = N 0 576 + 27264 = N 3 576 + 28032 = N 4 0 + 28080 = N 3 0 + 28128 = N 2 0 + 28176 = N 1 0 + 28224 = N 0 0 + 28272 = N 2 0 + 28320 = N 1 0 + 28368 = N 0 0 + 28416 = N 3 0 + 28464 = N 2 0 + 28512 = N 4 0 + 28560 = N 3 0 + 28608 = N 2 0 + 28656 = N 1 0 + 28704 = N 2 0 + 28752 = N 1 0 + 28800 = N 0 0 + 28848 = N 2 0 + 28896 = N 1 0 + 28944 = N 3 0 + 28992 = N 2 0 + 29040 = N 4 0 + 29088 = N 0 0 + 29136 = N 2 0 + 29184 = N 1 0 + 29232 = N 3 0 + 29280 = N 2 0 + 29328 = N 4 96 + 29568 = N 4 0 + 29616 = N 1 0 + 29664 = N 2 0 + 29712 = N 4 0 + 29760 = N 3 0 + 29808 = N 2 0 + 29856 = N 1 0 + 29904 = N 0 112 + 30048 = N 1 0 + 30096 = N 4 0 + 30144 = N 3 0 + 30192 = N 1 0 + 30240 = N 0 0 + 30288 = N 1 0 + 30336 = N 2 576 + 31104 = N 3 0 + 31136 = N 4 0 + 31168 = N 3 0 + 31200 = N 2 0 + 31248 = N 1 0 + 31296 = N 3 0 + 31344 = N 2 0 + 31392 = N 1 0 + 31440 = N 0 0 + 31488 = N 1 0 + 31536 = N 0 0 + 31584 = N 4 0 + 31632 = N 3 0 + 31680 = N 2 0 + 31728 = N 1 0 + 31776 = N 3 0 + 31824 = N 1 0 + 31872 = N 2 0 + 31920 = N 1 0 + 31968 = N 0 0 + 32016 = N 1 0 + 32064 = N 3 0 + 32112 = N 2 0 + 32160 = N 4 0 + 32208 = N 2 0 + 32256 = N 3 0 + 32304 = N 1 0 + 32352 = N 0 0 + 32400 = N 2 0 + 32640 = N 0 0 + 32688 = N 1 0 + 32736 = N 2 0 + 32784 = N 3 0 + 32832 = N 4 0 + 32880 = N 3 0 + 32928 = N 2 0 + 32976 = N 1 0 + 33024 = N 3 0 + 33072 = N 1 0 + 33120 = N 2 0 + 33168 = N 1 0 + 33216 = N 0 0 + 33264 = N 1 0 + 33312 = N 2 0 + 33360 = N 3 624 + 34176 = N 4 0 + 34224 = N 3 0 + 34272 = N 2 0 + 34320 = N 1 0 + 34368 = N 0 0 + 34416 = N 2 0 + 34464 = N 1 0 + 34512 = N 0 0 + 34560 = N 3 0 + 34608 = N 2 0 + 34656 = N 4 0 + 34704 = N 3 0 + 34752 = N 2 0 + 34800 = N 1 0 + 34848 = N 2 0 + 34896 = N 1 0 + 34944 = N 0 0 + 34992 = N 2 0 + 35040 = N 1 0 + 35088 = N 3 0 + 35136 = N 2 0 + 35184 = N 4 0 + 35232 = N 0 0 + 35280 = N 2 0 + 35328 = N 1 0 + 35376 = N 3 0 + 35424 = N 2 0 + 35472 = N 4 144 + 35712 = N 4 0 + 35760 = N 1 0 + 35808 = N 2 0 + 35856 = N 4 0 + 35904 = N 3 0 + 35952 = N 3 0 + 36000 = N 1 0 + 36048 = N 0 112 + 36192 = N 1 0 + 36240 = N 4 0 + 36288 = N 3 0 + 36336 = N 1 0 + 36384 = N 0 0 + 36432 = N 1 0 + 36480 = N 2 576 + 37248 = N 3 0 + 37248 = S 2 768 + 37280 = N 4 0 + 37312 = N 3 0 + 37344 = N 2 0 + 37392 = N 1 0 + 37440 = N 3 0 + 37488 = N 2 0 + 37536 = N 1 0 + 37584 = N 0 0 + 37632 = N 1 0 + 37680 = N 0 0 + 37728 = N 4 0 + 37776 = N 3 0 + 37824 = N 2 0 + 37872 = N 1 0 + 37920 = N 3 0 + 37968 = N 2 0 + 38016 = N 2 0 + 38064 = N 1 0 + 38112 = N 0 0 + 38160 = N 1 0 + 38208 = N 3 0 + 38256 = N 2 0 + 38304 = N 4 0 + 38352 = N 2 0 + 38400 = N 3 0 + 38448 = N 1 0 + 38496 = N 0 0 + 38544 = N 2 0 + 38784 = N 0 0 + 38832 = N 1 0 + 38880 = N 2 0 + 38928 = N 3 0 + 38976 = N 4 0 + 39024 = N 3 0 + 39072 = N 2 0 + 39120 = N 1 0 + 39168 = N 3 0 + 39216 = N 1 0 + 39264 = N 2 0 + 39312 = N 1 0 + 39360 = N 0 0 + 39408 = N 1 0 + 39456 = N 2 0 + 39504 = N 3 592 + 40128 = N 0 0 + 40176 = N 1 0 + 40224 = N 2 0 + 40272 = N 1 0 + 40320 = N 3 160 + 40512 = N 1 0 + 40608 = N 1 0 + 40656 = N 2 400 + 41088 = N 1 0 + 41136 = N 2 0 + 41184 = N 3 0 + 41232 = N 2 0 + 41280 = N 4 160 + 41472 = N 2 0 + 41568 = N 2 0 + 41616 = N 3 288 + 42048 = N 0 0 + 42096 = N 1 0 + 42144 = N 2 0 + 42192 = N 3 0 + 42240 = N 3 0 + 42288 = N 4 1488 + 44160 = N 2 0 + 44256 = N 2 0 + 44256 = N 3 0 + 44352 = N 2 0 + 44352 = N 3 0 + 44400 = N 2 0 + 44400 = N 3 0 + 44640 = N 2 0 + 44640 = N 3 0 + 44688 = N 2 0 + 44688 = N 3 0 + 44784 = N 2 0 + 44784 = N 3 0 + 44832 = N 2 0 + 44832 = N 3 0 + 44928 = N 0 0 + 44928 = N 1 0 + 45024 = N 2 0 + 45072 = N 2 0 + 45120 = N 1 0 + 45216 = N 2 0 + 45312 = N 2 0 + 45360 = N 2 0 + 45504 = N 0 0 + 45504 = N 1 0 + 45600 = N 0 0 + 45600 = N 2 0 + 45696 = N 0 0 + 45696 = N 1 0 + 45792 = N 0 0 + 45792 = N 2 0 + 45888 = N 0 0 + 45936 = N 0 0 + 45984 = N 0 0 + 46032 = N 0 0 + 46080 = N 0 0 + 46080 = N 1 0 + 46176 = N 0 0 + 46176 = N 2 0 + 46272 = N 0 0 + 46320 = N 0 0 + 46320 = N 1 0 + 46368 = N 0 0 + 46368 = N 5 0 + 46464 = N 3 0 + 46464 = N 4 0 + 46608 = N 3 0 + 46608 = N 4 0 + 46752 = N 2 0 + 46752 = N 4 0 + 46896 = N 2 0 + 46896 = N 4 0 + 47040 = N 2 0 + 47040 = N 3 0 + 47184 = N 2 0 + 47184 = N 3 0 + 47328 = N 1 0 + 47328 = N 3 0 + 47472 = N 1 0 + 47472 = N 3 0 + 47616 = N 2 0 + 47616 = N 4 0 + 47808 = N 2 0 + 47808 = N 3 0 + 48000 = N 0 160 + 48000 = N 3 160 + 48192 = N 0 0 + 48192 = S 2 1728 + 48240 = N 1 0 + 48288 = N 2 0 + 48336 = N 1 0 + 48384 = N 3 160 + 48576 = N 1 0 + 48672 = N 1 0 + 48720 = N 2 400 + 49152 = N 1 0 + 49200 = N 2 0 + 49248 = N 3 0 + 49296 = N 2 0 + 49344 = N 4 160 + 49536 = N 2 0 + 49632 = N 2 0 + 49680 = N 3 288 + 50112 = N 0 0 + 50160 = N 1 0 + 50208 = N 2 0 + 50256 = N 3 0 + 50304 = N 3 0 + 50352 = N 4 1488 + 52272 = N 1 0 + 52320 = N 2 0 + 52368 = N 3 0 + 52416 = N 2 0 + 52464 = N 4 0 + 52512 = N 3 0 + 52560 = N 2 0 + 52608 = N 4 0 + 52656 = N 3 0 + 52704 = N 2 0 + 52752 = N 1 0 + 52800 = N 0 0 + 52848 = N 1 0 + 52896 = N 2 0 + 52944 = N 1 0 + 52992 = N 3 0 + 53040 = N 2 0 + 53088 = N 1 0 + 53136 = N 0 0 + 53184 = N 1 0 + 53232 = N 0 0 + 53280 = N 2 0 + 53328 = N 3 0 + 53376 = N 2 0 + 53424 = N 4 0 + 53472 = N 3 0 + 53520 = N 2 0 + 53568 = N 3 0 + 53616 = N 2 0 + 53664 = N 1 0 + 53712 = N 0 0 + 53760 = N 1 0 + 53808 = N 2 0 + 53856 = N 3 0 + 53904 = N 4 0 + 53952 = N 3 0 + 54000 = N 2 0 + 54048 = N 1 0 + 54096 = N 0 0 + 54144 = N 3 0 + 54192 = N 4 112 + 54336 = N 2 0 + 54384 = N 1 0 + 54432 = N 2 0 + 54480 = N 2 0 + 54528 = N 3 0 + 54528 = N 4 0 + 54672 = N 3 0 + 54672 = N 4 0 + 54816 = N 2 0 + 54816 = N 4 0 + 54960 = N 2 0 + 54960 = N 4 0 + 55104 = N 2 0 + 55104 = N 3 0 + 55248 = N 2 0 + 55248 = N 3 0 + 55392 = N 1 0 + 55392 = N 3 0 + 55536 = N 1 0 + 55536 = N 3 0 + 55680 = N 2 0 + 55680 = N 4 0 + 55872 = N 2 0 + 55872 = N 3 0 + 56064 = N 0 576 + 56064 = N 3 576 + 56832 = N 4 0 + 56880 = N 3 0 + 56928 = N 2 0 + 56976 = N 1 0 + 57024 = N 0 0 + 57072 = N 2 0 + 57120 = N 1 0 + 57168 = N 0 0 + 57216 = N 3 0 + 57264 = N 2 0 + 57312 = N 4 0 + 57360 = N 3 0 + 57408 = N 2 0 + 57456 = N 1 0 + 57504 = N 2 0 + 57552 = N 1 0 + 57600 = N 0 0 + 57648 = N 2 0 + 57696 = N 1 0 + 57744 = N 3 0 + 57792 = N 2 0 + 57840 = N 4 0 + 57888 = N 0 0 + 57936 = N 2 0 + 57984 = N 1 0 + 58032 = N 3 0 + 58080 = N 2 0 + 58128 = N 4 144 + 58368 = N 4 0 + 58368 = S 2 1152 + 58416 = N 1 0 + 58464 = N 2 0 + 58512 = N 4 0 + 58560 = N 3 0 + 58608 = N 2 0 + 58656 = N 1 0 + 58704 = N 0 112 + 58848 = N 1 0 + 58896 = N 4 0 + 58944 = N 3 0 + 58992 = N 1 0 + 59040 = N 0 0 + 59088 = N 1 0 + 59136 = N 2 576 + 59904 = N 3 0 + 59936 = N 4 0 + 59968 = N 3 0 + 60000 = N 2 0 + 60048 = N 1 0 + 60096 = N 3 0 + 60144 = N 2 0 + 60192 = N 1 0 + 60240 = N 0 0 + 60288 = N 1 0 + 60336 = N 0 0 + 60384 = N 4 0 + 60432 = N 3 0 + 60480 = N 2 0 + 60528 = N 1 0 + 60576 = N 3 0 + 60624 = N 2 0 + 60672 = N 2 0 + 60720 = N 1 0 + 60768 = N 0 0 + 60816 = N 1 0 + 60864 = N 3 0 + 60912 = N 2 0 + 60960 = N 4 0 + 61008 = N 2 0 + 61056 = N 3 0 + 61104 = N 1 0 + 61152 = N 0 0 + 61200 = N 2 0 + 61440 = N 0 0 + 61488 = N 1 0 + 61536 = N 2 0 + 61584 = N 3 0 + 61632 = N 4 0 + 61680 = N 3 0 + 61728 = N 2 0 + 61776 = N 1 0 + 61824 = N 3 0 + 61872 = N 1 0 + 61920 = N 2 0 + 61968 = N 1 0 + 62016 = N 0 0 + 62064 = N 1 0 + 62112 = N 2 0 + 62160 = N 3 624 + 62976 = N 4 0 + 63024 = N 3 0 + 63072 = N 2 0 + 63120 = N 1 0 + 63168 = N 0 0 + 63216 = N 2 0 + 63264 = N 1 0 + 63312 = N 0 0 + 63360 = N 3 0 + 63408 = N 2 0 + 63456 = N 4 0 + 63504 = N 3 0 + 63552 = N 2 0 + 63600 = N 1 0 + 63648 = N 2 0 + 63696 = N 1 0 + 63744 = N 0 0 + 63792 = N 2 0 + 63840 = N 1 0 + 63888 = N 3 0 + 63936 = N 2 0 + 63984 = N 4 0 + 64032 = N 0 0 + 64080 = N 2 0 + 64128 = N 1 0 + 64176 = N 3 0 + 64224 = N 2 0 + 64272 = N 4 144 + 64512 = N 4 0 + 64560 = N 1 0 + 64608 = N 2 0 + 64656 = N 4 0 + 64704 = N 3 0 + 64752 = N 2 0 + 64800 = N 1 0 + 64848 = N 0 112 + 64992 = N 1 0 + 65040 = N 4 0 + 65088 = N 3 0 + 65136 = N 1 0 + 65184 = N 0 0 + 65232 = N 1 0 + 65280 = N 2 576 + 66048 = N 3 0 + 66080 = N 4 0 + 66112 = N 3 0 + 66144 = N 2 0 + 66192 = N 1 0 + 66240 = N 3 0 + 66288 = N 2 0 + 66336 = N 1 0 + 66384 = N 0 0 + 66432 = N 1 0 + 66480 = N 0 0 + 66528 = N 4 0 + 66576 = N 3 0 + 66624 = N 2 0 + 66672 = N 1 0 + 66720 = N 3 0 + 66768 = N 1 0 + 66816 = N 2 0 + 66864 = N 1 0 + 66912 = N 0 0 + 66960 = N 1 0 + 67008 = N 3 0 + 67056 = N 2 0 + 67104 = N 4 0 + 67152 = N 2 0 + 67200 = N 3 0 + 67248 = N 1 0 + 67296 = N 0 0 + 67344 = N 2 0 + 67584 = N 0 0 + 67632 = N 1 0 + 67680 = N 2 0 + 67728 = N 3 0 + 67776 = N 4 0 + 67824 = N 3 0 + 67872 = N 2 0 + 67920 = N 1 0 + 67968 = N 3 0 + 68016 = N 1 0 + 68064 = N 2 0 + 68112 = N 1 0 + 68160 = N 0 0 + 68208 = N 1 0 + 68256 = N 2 0 + 68304 = N 3 592 + 68928 = N 0 0 + 68928 = S 2 1536 + 68976 = N 1 0 + 69024 = N 2 0 + 69072 = N 1 0 + 69120 = N 3 160 + 69312 = N 1 0 + 69408 = N 1 0 + 69456 = N 2 400 + 69888 = N 1 0 + 69936 = N 2 0 + 69984 = N 3 0 + 70032 = N 2 0 + 70080 = N 4 160 + 70272 = N 2 0 + 70368 = N 2 0 + 70416 = N 3 288 + 70848 = N 0 0 + 70896 = N 1 0 + 70944 = N 2 0 + 70992 = N 3 0 + 71040 = N 3 0 + 71088 = N 4 1488 + 73152 = N 0 0 + 73184 = N 1 0 + 73216 = N 2 0 + 73248 = N 1 0 + 73280 = N 2 0 + 73312 = N 3 0 + 73344 = N 4 0 + 73376 = N 3 0 + 73408 = N 2 0 + 73440 = N 3 0 + 73472 = N 2 0 + 73504 = N 1 0 + 73536 = N 0 0 + 73568 = N 1 0 + 73600 = N 2 0 + 73632 = N 1 0 + 73664 = N 2 0 + 73696 = N 3 0 + 73728 = N 4 0 + 73760 = N 3 0 + 73792 = N 2 0 + 73824 = N 3 0 + 73856 = N 2 0 + 73888 = N 1 0 + 73920 = N 0 0 + 73968 = N 2 0 + 74016 = N 3 304 + 74352 = N 2 0 + 74400 = N 3 288 + 74784 = N 3 0 + 74832 = N 4 400 + 75264 = N 3 0 + 75264 = N 4 0 + 75408 = N 3 0 + 75408 = N 4 0 + 75552 = N 2 0 + 75552 = N 4 0 + 75696 = N 2 0 + 75696 = N 4 0 + 75840 = N 2 0 + 75840 = N 3 0 + 75984 = N 2 0 + 75984 = N 3 0 + 76128 = N 1 0 + 76128 = N 3 0 + 76272 = N 1 0 + 76272 = N 3 0 + 76416 = N 2 0 + 76416 = N 4 0 + 76608 = N 2 0 + 76608 = N 3 0 + 76800 = N 0 160 + 76800 = N 3 160 + 76992 = N 0 0 + 77040 = N 1 0 + 77088 = N 2 0 + 77136 = N 1 0 + 77184 = N 3 160 + 77376 = N 1 0 + 77472 = N 1 0 + 77520 = N 2 400 + 77952 = N 1 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78096 = N 2 0 + 78144 = N 4 160 + 78336 = N 2 0 + 78432 = N 2 0 + 78480 = N 3 288 + 78912 = N 0 0 + 78912 = S 2 1152 + 79040 = N 1 0 + 79168 = N 2 0 + 79296 = N 3 0 + 79488 = N 3 0 + 79536 = N 4 1296 + 81360 = N 0 0 + 81504 = N 1 0 + 81552 = N 2 0 + 81600 = N 3 0 + 81648 = N 3 0 + 81696 = N 2 0 + 81792 = N 3 0 + 81824 = N 2 0 + 81856 = N 1 0 + 81888 = N 2 0 + 81936 = N 1 0 + 81984 = N 0 0 + 82032 = N 3 0 + 82080 = N 4 0 + 82128 = N 3 0 + 82176 = N 2 0 + 82224 = N 2 0 + 82272 = N 3 0 + 82320 = N 3 0 + 82368 = N 4 0 + 82416 = N 3 0 + 82464 = N 2 0 + 82512 = N 1 0 + 82560 = N 0 0 + 82608 = N 3 0 + 82656 = N 2 0 + 82704 = N 1 0 + 82752 = N 2 0 + 82800 = N 1 0 + 82848 = N 0 0 + 82896 = N 2 0 + 82944 = N 2 0 + 83040 = N 1 0 + 83088 = N 2 0 + 83136 = N 2 0 + 83232 = N 2 0 + 83328 = N 2 0 + 83424 = N 3 0 + 83472 = N 4 0 + 83568 = N 3 0 + 83616 = N 1 0 + 83712 = N 2 0 + 83760 = N 4 0 + 83856 = N 2 0 + 83904 = N 1 0 + 84000 = N 2 0 + 84048 = N 3 0 + 84144 = N 2 0 + 84192 = N 0 0 + 84288 = N 1 0 + 84336 = N 2 0 + 84480 = N 2 160 + 84480 = N 4 160 + 84672 = N 2 160 + 84672 = N 3 160 + 84864 = N 0 0 + 85056 = N 2 0 + 85152 = N 3 0 + 85200 = N 4 0 + 85296 = N 3 0 + 85344 = N 1 0 + 85440 = N 2 0 + 85488 = N 4 0 + 85584 = N 2 0 + 85632 = N 1 0 + 85728 = N 2 0 + 85776 = N 3 0 + 85872 = N 2 0 + 85920 = N 0 0 + 86016 = N 1 0 + 86064 = N 2 0 + 86208 = N 2 0 + 86208 = N 4 0 + 86400 = N 2 0 + 86400 = N 3 0 + 86592 = N 0 0 + 86688 = N 0 0 + 86736 = N 0 0 + 86784 = N 2 0 + 86880 = N 3 0 + 86928 = N 4 0 + 87024 = N 3 0 + 87072 = N 1 0 + 87168 = N 2 0 + 87216 = N 4 0 + 87312 = N 2 0 + 87360 = N 1 0 + 87456 = N 2 0 + 87504 = N 3 0 + 87600 = N 2 0 + 87648 = N 0 0 + 87744 = N 1 0 + 87792 = N 2 0 + 87936 = N 1 0 + 87984 = N 2 0 + 88032 = N 3 0 + 88128 = N 0 0 + 88176 = N 1 0 + 88224 = N 2 0 + 88320 = N 0 0 + 88416 = N 0 0 + 88464 = N 0 0 + 88512 = N 2 0 + 88608 = N 3 0 + 88656 = N 4 0 + 88752 = N 3 0 + 88800 = N 1 0 + 88896 = N 2 0 + 88944 = N 4 0 + 89040 = N 2 0 + 89088 = N 1 0 + 89184 = N 2 0 + 89232 = N 3 0 + 89328 = N 2 0 + 89376 = N 0 0 + 89472 = N 1 0 + 89520 = N 2 0 + 89664 = N 1 0 + 89712 = N 2 0 + 89760 = N 3 0 + 89856 = N 0 0 + 89904 = N 1 0 + 89952 = N 2 0 + 90048 = N 0 0 + 90144 = N 0 0 + 90192 = N 0 0 + 90240 = N 2 0 + 90336 = N 3 0 + 90384 = N 4 0 + 90480 = N 3 0 + 90528 = N 1 0 + 90624 = N 2 0 + 90672 = N 4 0 + 90768 = N 2 0 + 90816 = N 1 0 + 90912 = N 2 0 + 90960 = N 3 0 + 91056 = N 2 0 + 91104 = N 0 0 + 91200 = N 1 0 + 91248 = N 2 0 + 91392 = N 1 0 + 91440 = N 2 0 + 91488 = N 3 0 + 91584 = N 0 0 + 91632 = N 1 0 + 91680 = N 2 0 + 91776 = N 0 544 + 92352 = N 3 0 + 92352 = N 6 0 + 92400 = N 4 496 + 92400 = N 6 0 + 92928 = N 3 352 + 92928 = N 6 0 + 93312 = N 2 352 + 93312 = N 6 0 + 93696 = N 1 352 + 93696 = N 6 0 + 94080 = N 0 0 + 94080 = N 6 0 +} +[HardSingle] +{ + 1536 = N 3 0 + 1536 = N 4 0 + 1680 = N 2 0 + 1680 = N 3 0 + 2112 = N 1 0 + 2208 = N 1 0 + 2304 = N 1 0 + 2400 = N 1 0 + 2496 = N 1 0 + 2592 = N 1 0 + 2688 = N 1 0 + 2784 = N 1 0 + 2880 = N 1 0 + 3072 = N 3 0 + 3072 = N 4 0 + 3216 = N 2 0 + 3216 = N 3 0 + 3504 = N 1 0 + 3648 = N 1 0 + 3744 = N 1 0 + 3840 = N 1 0 + 3936 = N 1 0 + 4032 = N 1 0 + 4128 = N 1 0 + 4224 = N 1 0 + 4320 = N 1 0 + 4416 = N 1 0 + 4464 = N 2 0 + 4608 = N 2 0 + 4608 = N 4 0 + 4752 = N 1 0 + 4752 = N 3 0 + 5040 = N 1 0 + 5184 = N 1 0 + 5424 = N 1 0 + 5616 = N 1 0 + 5760 = N 1 0 + 5856 = N 1 0 + 5952 = N 1 0 + 6144 = N 2 0 + 6144 = N 4 0 + 6144 = S 2 1536 + 6288 = N 1 0 + 6288 = N 3 0 + 6624 = N 1 0 + 6720 = N 1 0 + 6912 = N 1 0 + 7056 = N 1 0 + 7200 = N 1 0 + 7392 = N 1 0 + 7488 = N 1 0 + 7536 = N 2 0 + 7680 = N 2 0 + 7680 = N 4 0 + 7824 = N 1 0 + 7824 = N 3 0 + 8064 = N 1 0 + 8160 = N 1 0 + 8256 = N 1 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8736 = N 1 0 + 8832 = N 1 0 + 8928 = N 1 0 + 9216 = N 2 0 + 9216 = N 4 0 + 9360 = N 1 0 + 9360 = N 3 0 + 9600 = N 1 0 + 9744 = N 1 0 + 9888 = N 1 0 + 10032 = N 1 0 + 10176 = N 1 0 + 10272 = N 1 0 + 10368 = N 1 0 + 10464 = N 1 0 + 10560 = N 1 0 + 10608 = N 2 624 + 11328 = N 0 0 + 11376 = N 1 0 + 11424 = N 2 0 + 11520 = N 3 160 + 11712 = N 1 0 + 11808 = N 2 448 + 12288 = N 1 0 + 12336 = N 2 0 + 12384 = N 3 0 + 12480 = N 4 160 + 12672 = N 2 0 + 12768 = N 3 336 + 13248 = N 0 0 + 13296 = N 1 0 + 13344 = N 2 0 + 13440 = N 3 0 + 13488 = N 4 2032 + 15360 = S 2 768 + 15600 = N 2 0 + 15600 = N 3 0 + 15744 = N 0 0 + 15888 = N 1 0 + 15984 = N 2 0 + 15984 = N 3 0 + 16128 = N 0 0 + 16128 = N 1 0 + 16224 = N 0 0 + 16224 = N 2 0 + 16320 = N 0 0 + 16320 = N 1 0 + 16416 = N 0 0 + 16416 = N 2 0 + 16704 = N 0 0 + 16704 = N 1 0 + 16800 = N 0 0 + 16800 = N 2 0 + 16896 = N 0 0 + 16896 = N 1 0 + 16992 = N 0 0 + 16992 = N 2 0 + 17280 = N 0 0 + 17280 = N 1 0 + 17376 = N 0 0 + 17376 = N 2 0 + 17472 = N 0 0 + 17472 = N 1 0 + 17568 = N 0 0 + 17568 = N 2 0 + 17664 = N 3 0 + 17664 = N 4 0 + 17808 = N 3 0 + 17808 = N 4 0 + 17952 = N 2 0 + 17952 = N 4 0 + 18096 = N 2 0 + 18096 = N 4 0 + 18240 = N 2 0 + 18240 = N 3 0 + 18384 = N 2 0 + 18384 = N 3 0 + 18528 = N 1 0 + 18528 = N 3 0 + 18672 = N 1 0 + 18672 = N 3 0 + 18816 = N 2 0 + 18816 = N 4 0 + 19008 = N 2 0 + 19008 = N 3 0 + 19200 = N 0 160 + 19200 = N 3 160 + 19392 = N 0 0 + 19440 = N 1 0 + 19488 = N 2 0 + 19584 = N 3 160 + 19776 = N 1 0 + 19872 = N 2 448 + 20352 = N 1 0 + 20400 = N 2 0 + 20448 = N 3 0 + 20544 = N 4 160 + 20736 = N 2 0 + 20832 = N 3 384 + 21312 = N 0 0 + 21360 = N 1 0 + 21408 = N 2 0 + 21504 = N 3 0 + 21552 = N 4 1488 + 23664 = N 2 0 + 23664 = N 3 0 + 23856 = N 2 0 + 23856 = N 3 0 + 23952 = N 2 0 + 23952 = N 3 0 + 24096 = N 2 0 + 24096 = N 3 0 + 24192 = N 0 0 + 24192 = N 1 0 + 24288 = N 0 0 + 24288 = N 2 0 + 24384 = N 0 0 + 24384 = N 1 0 + 24480 = N 0 0 + 24480 = N 2 0 + 24768 = N 0 0 + 24768 = N 1 0 + 24864 = N 0 0 + 24864 = N 2 0 + 24960 = N 0 0 + 24960 = N 1 0 + 25056 = N 0 0 + 25056 = N 2 0 + 25344 = N 0 0 + 25344 = N 1 0 + 25440 = N 0 0 + 25440 = N 2 0 + 25536 = N 0 0 + 25536 = N 1 0 + 25632 = N 0 0 + 25632 = N 2 0 + 25728 = N 3 0 + 25728 = N 4 0 + 25728 = S 2 1920 + 25872 = N 3 0 + 25872 = N 4 0 + 26016 = N 2 0 + 26016 = N 4 0 + 26160 = N 2 0 + 26160 = N 4 0 + 26304 = N 2 0 + 26304 = N 3 0 + 26448 = N 2 0 + 26448 = N 3 0 + 26592 = N 1 0 + 26592 = N 3 0 + 26688 = N 1 0 + 26688 = N 3 0 + 26880 = N 2 0 + 26880 = N 4 0 + 27072 = N 2 0 + 27072 = N 3 0 + 27264 = N 0 576 + 27264 = N 3 576 + 28032 = N 4 0 + 28080 = N 3 0 + 28128 = N 2 0 + 28176 = N 1 0 + 28224 = N 0 0 + 28272 = N 1 0 + 28320 = N 0 0 + 28416 = N 3 0 + 28464 = N 2 0 + 28512 = N 4 0 + 28560 = N 3 0 + 28608 = N 2 0 + 28656 = N 1 0 + 28704 = N 0 0 + 28800 = N 0 0 + 28896 = N 1 0 + 28992 = N 2 0 + 29088 = N 0 0 + 29184 = N 1 0 + 29280 = N 2 0 + 29328 = N 3 144 + 29568 = N 4 0 + 29664 = N 2 0 + 29712 = N 4 0 + 29760 = N 3 0 + 29856 = N 1 0 + 29904 = N 0 112 + 30048 = N 1 0 + 30096 = N 2 0 + 30144 = N 1 0 + 30240 = N 0 0 + 30288 = N 1 0 + 30336 = N 2 576 + 31104 = N 3 0 + 31152 = N 2 0 + 31200 = N 1 0 + 31296 = N 2 0 + 31344 = N 1 0 + 31392 = N 0 0 + 31488 = N 1 0 + 31584 = N 4 0 + 31632 = N 3 0 + 31680 = N 2 0 + 31776 = N 3 0 + 31872 = N 2 0 + 31920 = N 1 0 + 31968 = N 0 0 + 32064 = N 2 0 + 32160 = N 3 0 + 32256 = N 2 0 + 32352 = N 0 0 + 32400 = N 1 0 + 32640 = N 1 0 + 32688 = N 2 0 + 32736 = N 3 0 + 32832 = N 4 0 + 32880 = N 3 0 + 32928 = N 2 0 + 33024 = N 3 0 + 33120 = N 2 0 + 33216 = N 1 0 + 33312 = N 2 0 + 33360 = N 3 624 + 34176 = N 4 0 + 34224 = N 3 0 + 34272 = N 2 0 + 34320 = N 1 0 + 34368 = N 0 0 + 34416 = N 1 0 + 34464 = N 0 0 + 34560 = N 3 0 + 34608 = N 2 0 + 34656 = N 4 0 + 34704 = N 3 0 + 34752 = N 2 0 + 34800 = N 1 0 + 34848 = N 0 0 + 34944 = N 0 0 + 35040 = N 1 0 + 35136 = N 2 0 + 35232 = N 0 0 + 35328 = N 1 0 + 35424 = N 2 0 + 35472 = N 3 144 + 35712 = N 4 0 + 35808 = N 2 0 + 35856 = N 4 0 + 35904 = N 3 0 + 36000 = N 1 0 + 36048 = N 0 112 + 36192 = N 1 0 + 36240 = N 2 0 + 36288 = N 1 0 + 36384 = N 0 0 + 36432 = N 1 0 + 36480 = N 2 576 + 37248 = N 3 0 + 37248 = S 2 768 + 37296 = N 2 0 + 37344 = N 1 0 + 37440 = N 2 0 + 37488 = N 1 0 + 37536 = N 0 0 + 37632 = N 1 0 + 37728 = N 4 0 + 37776 = N 3 0 + 37824 = N 2 0 + 37920 = N 3 0 + 38016 = N 2 0 + 38064 = N 1 0 + 38112 = N 0 0 + 38208 = N 2 0 + 38304 = N 3 0 + 38400 = N 2 0 + 38496 = N 0 0 + 38544 = N 1 0 + 38784 = N 1 0 + 38832 = N 2 0 + 38880 = N 3 0 + 38976 = N 4 0 + 39024 = N 3 0 + 39072 = N 2 0 + 39168 = N 3 0 + 39264 = N 2 0 + 39360 = N 1 0 + 39456 = N 2 0 + 39504 = N 3 592 + 40128 = N 0 0 + 40176 = N 1 0 + 40224 = N 2 0 + 40320 = N 3 160 + 40512 = N 1 0 + 40608 = N 2 448 + 41088 = N 1 0 + 41136 = N 2 0 + 41184 = N 3 0 + 41280 = N 4 160 + 41472 = N 2 0 + 41568 = N 3 336 + 42048 = N 0 0 + 42096 = N 1 0 + 42144 = N 2 0 + 42240 = N 3 0 + 42288 = N 4 1488 + 44256 = N 2 0 + 44256 = N 3 0 + 44352 = N 2 0 + 44352 = N 3 0 + 44640 = N 2 0 + 44640 = N 3 0 + 44784 = N 2 0 + 44784 = N 3 0 + 44928 = N 0 0 + 44928 = N 1 0 + 45024 = N 2 0 + 45120 = N 1 0 + 45216 = N 2 0 + 45312 = N 2 0 + 45360 = N 2 0 + 45504 = N 0 0 + 45504 = N 1 0 + 45600 = N 0 0 + 45600 = N 2 0 + 45696 = N 0 0 + 45696 = N 1 0 + 45792 = N 0 0 + 45792 = N 2 0 + 46080 = N 0 0 + 46080 = N 1 0 + 46176 = N 0 0 + 46176 = N 2 0 + 46320 = N 0 0 + 46320 = N 1 0 + 46464 = N 3 0 + 46464 = N 4 0 + 46608 = N 3 0 + 46608 = N 4 0 + 46752 = N 2 0 + 46752 = N 4 0 + 46896 = N 2 0 + 46896 = N 4 0 + 47040 = N 2 0 + 47040 = N 3 0 + 47184 = N 2 0 + 47184 = N 3 0 + 47328 = N 1 0 + 47328 = N 3 0 + 47472 = N 1 0 + 47472 = N 3 0 + 47616 = N 2 0 + 47616 = N 4 0 + 47808 = N 2 0 + 47808 = N 3 0 + 48000 = N 0 160 + 48000 = N 3 160 + 48192 = N 0 0 + 48192 = S 2 1728 + 48240 = N 1 0 + 48288 = N 2 0 + 48384 = N 3 160 + 48576 = N 1 0 + 48672 = N 2 448 + 49152 = N 1 0 + 49200 = N 2 0 + 49248 = N 3 0 + 49344 = N 4 160 + 49536 = N 2 0 + 49632 = N 3 336 + 50112 = N 0 0 + 50160 = N 1 0 + 50208 = N 2 0 + 50304 = N 3 0 + 50352 = N 4 1488 + 52272 = N 0 0 + 52320 = N 1 0 + 52416 = N 2 0 + 52512 = N 3 0 + 52608 = N 2 0 + 52656 = N 1 0 + 52704 = N 0 0 + 52800 = N 0 0 + 52848 = N 1 0 + 52896 = N 2 0 + 52992 = N 3 0 + 53088 = N 2 0 + 53184 = N 1 0 + 53280 = N 1 0 + 53328 = N 2 0 + 53376 = N 3 0 + 53472 = N 4 0 + 53568 = N 3 0 + 53664 = N 2 0 + 53760 = N 1 0 + 53808 = N 2 0 + 53856 = N 3 0 + 53952 = N 2 0 + 54048 = N 1 0 + 54144 = N 4 160 + 54336 = N 2 0 + 54384 = N 1 0 + 54432 = N 2 0 + 54528 = N 3 0 + 54528 = N 4 0 + 54672 = N 3 0 + 54672 = N 4 0 + 54816 = N 2 0 + 54816 = N 4 0 + 54960 = N 2 0 + 54960 = N 4 0 + 55104 = N 2 0 + 55104 = N 3 0 + 55248 = N 2 0 + 55248 = N 3 0 + 55392 = N 1 0 + 55392 = N 3 0 + 55536 = N 1 0 + 55536 = N 3 0 + 55680 = N 2 0 + 55680 = N 4 0 + 55872 = N 2 0 + 55872 = N 3 0 + 56064 = N 0 576 + 56064 = N 3 576 + 56832 = N 4 0 + 56880 = N 3 0 + 56928 = N 2 0 + 56976 = N 1 0 + 57024 = N 0 0 + 57072 = N 1 0 + 57120 = N 0 0 + 57216 = N 3 0 + 57264 = N 2 0 + 57312 = N 4 0 + 57360 = N 3 0 + 57408 = N 2 0 + 57456 = N 1 0 + 57504 = N 0 0 + 57600 = N 0 0 + 57696 = N 1 0 + 57792 = N 2 0 + 57888 = N 0 0 + 57984 = N 1 0 + 58080 = N 2 0 + 58128 = N 3 144 + 58368 = N 4 0 + 58368 = S 2 1152 + 58464 = N 2 0 + 58512 = N 4 0 + 58560 = N 3 0 + 58656 = N 1 0 + 58704 = N 0 112 + 58848 = N 1 0 + 58896 = N 2 0 + 58944 = N 1 0 + 59040 = N 0 0 + 59088 = N 1 0 + 59136 = N 2 576 + 59904 = N 3 0 + 59952 = N 2 0 + 60000 = N 1 0 + 60096 = N 2 0 + 60144 = N 1 0 + 60192 = N 0 0 + 60288 = N 1 0 + 60384 = N 4 0 + 60432 = N 3 0 + 60480 = N 2 0 + 60576 = N 3 0 + 60672 = N 2 0 + 60720 = N 1 0 + 60768 = N 0 0 + 60864 = N 2 0 + 60960 = N 3 0 + 61056 = N 2 0 + 61152 = N 0 0 + 61200 = N 1 0 + 61440 = N 1 0 + 61488 = N 2 0 + 61536 = N 3 0 + 61632 = N 4 0 + 61680 = N 3 0 + 61728 = N 2 0 + 61824 = N 3 0 + 61920 = N 2 0 + 62016 = N 1 0 + 62112 = N 2 0 + 62160 = N 3 624 + 62976 = N 4 0 + 63024 = N 3 0 + 63072 = N 2 0 + 63120 = N 1 0 + 63168 = N 0 0 + 63216 = N 1 0 + 63264 = N 0 0 + 63360 = N 3 0 + 63408 = N 2 0 + 63456 = N 4 0 + 63504 = N 3 0 + 63552 = N 2 0 + 63600 = N 1 0 + 63648 = N 0 0 + 63744 = N 0 0 + 63840 = N 1 0 + 63936 = N 2 0 + 64032 = N 0 0 + 64128 = N 1 0 + 64224 = N 2 0 + 64272 = N 3 144 + 64512 = N 4 0 + 64608 = N 2 0 + 64656 = N 4 0 + 64704 = N 3 0 + 64800 = N 1 0 + 64848 = N 0 112 + 64992 = N 1 0 + 65040 = N 2 0 + 65088 = N 1 0 + 65184 = N 0 0 + 65232 = N 1 0 + 65280 = N 2 576 + 66048 = N 3 0 + 66096 = N 2 0 + 66144 = N 1 0 + 66240 = N 2 0 + 66288 = N 1 0 + 66336 = N 0 0 + 66432 = N 1 0 + 66528 = N 4 0 + 66576 = N 3 0 + 66624 = N 2 0 + 66720 = N 3 0 + 66816 = N 2 0 + 66864 = N 1 0 + 66912 = N 0 0 + 67008 = N 2 0 + 67104 = N 3 0 + 67200 = N 2 0 + 67296 = N 0 0 + 67344 = N 1 0 + 67584 = N 1 0 + 67632 = N 2 0 + 67680 = N 3 0 + 67776 = N 4 0 + 67824 = N 3 0 + 67872 = N 2 0 + 67968 = N 3 0 + 68064 = N 2 0 + 68160 = N 1 0 + 68256 = N 2 0 + 68304 = N 3 592 + 68928 = N 0 0 + 68928 = S 2 1536 + 68976 = N 1 0 + 69024 = N 2 0 + 69120 = N 3 160 + 69312 = N 1 0 + 69408 = N 2 448 + 69888 = N 1 0 + 69936 = N 2 0 + 69984 = N 3 0 + 70080 = N 4 160 + 70272 = N 2 0 + 70368 = N 3 336 + 70848 = N 0 0 + 70896 = N 1 0 + 70944 = N 2 0 + 71040 = N 3 0 + 71088 = N 4 1488 + 73152 = N 0 0 + 73200 = N 1 0 + 73248 = N 2 0 + 73296 = N 3 0 + 73344 = N 4 0 + 73392 = N 3 0 + 73440 = N 2 0 + 73488 = N 1 0 + 73536 = N 0 0 + 73584 = N 1 0 + 73632 = N 2 0 + 73680 = N 3 0 + 73728 = N 4 0 + 73776 = N 3 0 + 73824 = N 2 0 + 73872 = N 1 0 + 73920 = N 0 0 + 73968 = N 3 352 + 74352 = N 3 336 + 74784 = N 4 448 + 75264 = N 3 0 + 75264 = N 4 0 + 75408 = N 3 0 + 75408 = N 4 0 + 75552 = N 2 0 + 75552 = N 4 0 + 75696 = N 2 0 + 75696 = N 4 0 + 75840 = N 2 0 + 75840 = N 3 0 + 75984 = N 2 0 + 75984 = N 3 0 + 76128 = N 1 0 + 76128 = N 3 0 + 76272 = N 1 0 + 76272 = N 3 0 + 76416 = N 2 0 + 76416 = N 4 0 + 76608 = N 2 0 + 76608 = N 3 0 + 76800 = N 0 160 + 76800 = N 3 160 + 76992 = N 0 0 + 77040 = N 1 0 + 77088 = N 2 0 + 77184 = N 3 160 + 77376 = N 1 0 + 77472 = N 2 448 + 77952 = N 1 0 + 78000 = N 2 0 + 78048 = N 3 0 + 78144 = N 4 160 + 78336 = N 2 0 + 78432 = N 3 336 + 78912 = N 0 0 + 78912 = S 2 1152 + 79040 = N 1 0 + 79168 = N 2 0 + 79296 = N 3 0 + 79488 = N 4 1344 + 81360 = N 0 0 + 81504 = N 1 0 + 81552 = N 2 0 + 81600 = N 3 0 + 81696 = N 2 0 + 81792 = N 3 0 + 81888 = N 2 0 + 81936 = N 1 0 + 81984 = N 0 0 + 82032 = N 3 112 + 82176 = N 2 0 + 82272 = N 3 0 + 82368 = N 2 0 + 82416 = N 1 0 + 82464 = N 0 0 + 82608 = N 3 0 + 82656 = N 2 0 + 82704 = N 1 0 + 82752 = N 2 0 + 82800 = N 1 0 + 82848 = N 0 0 + 82944 = N 2 0 + 83040 = N 1 0 + 83136 = N 2 0 + 83232 = N 2 0 + 83328 = N 2 0 + 83424 = N 3 0 + 83472 = N 4 0 + 83616 = N 1 0 + 83712 = N 2 0 + 83760 = N 4 0 + 83904 = N 1 0 + 84000 = N 2 0 + 84048 = N 3 0 + 84192 = N 0 0 + 84288 = N 1 0 + 84336 = N 2 0 + 84480 = N 2 160 + 84480 = N 4 160 + 84672 = N 2 160 + 84672 = N 3 160 + 84864 = N 0 160 + 85056 = N 2 0 + 85152 = N 3 0 + 85200 = N 4 0 + 85344 = N 1 0 + 85440 = N 2 0 + 85488 = N 4 0 + 85632 = N 1 0 + 85728 = N 2 0 + 85776 = N 3 0 + 85920 = N 0 0 + 86016 = N 1 0 + 86064 = N 2 0 + 86208 = N 2 0 + 86208 = N 4 0 + 86400 = N 2 0 + 86400 = N 3 0 + 86592 = N 0 0 + 86688 = N 0 0 + 86784 = N 2 0 + 86880 = N 3 0 + 86928 = N 4 0 + 87072 = N 1 0 + 87168 = N 2 0 + 87216 = N 4 0 + 87360 = N 1 0 + 87456 = N 2 0 + 87504 = N 3 0 + 87648 = N 0 0 + 87744 = N 1 0 + 87792 = N 2 0 + 87936 = N 1 0 + 87984 = N 2 0 + 88032 = N 3 0 + 88128 = N 0 0 + 88176 = N 1 0 + 88224 = N 2 0 + 88512 = N 2 0 + 88608 = N 3 0 + 88656 = N 4 0 + 88800 = N 1 0 + 88896 = N 2 0 + 88944 = N 4 0 + 89088 = N 1 0 + 89184 = N 2 0 + 89232 = N 3 0 + 89376 = N 0 0 + 89472 = N 1 0 + 89520 = N 2 0 + 89664 = N 1 0 + 89712 = N 2 0 + 89760 = N 3 0 + 89856 = N 0 0 + 89904 = N 1 0 + 89952 = N 2 0 + 90240 = N 2 0 + 90336 = N 3 0 + 90384 = N 4 0 + 90528 = N 1 0 + 90624 = N 2 0 + 90672 = N 4 0 + 90816 = N 1 0 + 90912 = N 2 0 + 90960 = N 3 0 + 91104 = N 0 0 + 91200 = N 1 0 + 91248 = N 2 0 + 91392 = N 1 0 + 91440 = N 2 0 + 91488 = N 3 0 + 91584 = N 0 0 + 91632 = N 1 0 + 91680 = N 2 0 + 91776 = N 0 544 + 92352 = N 4 544 + 92352 = N 6 0 + 92928 = N 3 352 + 92928 = N 6 0 + 93312 = N 2 352 + 93312 = N 6 0 + 93696 = N 1 352 + 93696 = N 6 0 + 94080 = N 0 0 + 94080 = N 6 0 +} +[MediumSingle] +{ + 1536 = N 3 0 + 1680 = N 2 0 + 2112 = N 1 0 + 2208 = N 1 0 + 2304 = N 1 0 + 2400 = N 1 0 + 2496 = N 1 0 + 2592 = N 1 0 + 2688 = N 1 0 + 2784 = N 1 0 + 2880 = N 1 0 + 3072 = N 3 0 + 3216 = N 2 0 + 3504 = N 1 0 + 3648 = N 1 0 + 3840 = N 1 0 + 3936 = N 1 0 + 4032 = N 1 0 + 4128 = N 1 0 + 4224 = N 1 0 + 4320 = N 1 0 + 4416 = N 1 0 + 4608 = N 3 0 + 4752 = N 2 0 + 5040 = N 1 0 + 5184 = N 1 0 + 5424 = N 1 0 + 5616 = N 1 0 + 5760 = N 1 0 + 5952 = N 1 0 + 6144 = N 3 0 + 6144 = S 2 1536 + 6288 = N 2 0 + 6624 = N 1 0 + 6720 = N 1 0 + 6912 = N 1 0 + 7056 = N 1 0 + 7200 = N 1 0 + 7392 = N 1 0 + 7488 = N 1 0 + 7680 = N 3 0 + 7824 = N 2 0 + 8064 = N 1 0 + 8256 = N 1 0 + 8448 = N 1 0 + 8544 = N 1 0 + 8640 = N 1 0 + 8736 = N 1 0 + 8832 = N 1 0 + 8928 = N 1 0 + 9216 = N 3 0 + 9360 = N 2 0 + 9600 = N 1 0 + 9744 = N 1 0 + 9888 = N 1 0 + 10032 = N 1 0 + 10176 = N 1 0 + 10368 = N 1 0 + 10464 = N 1 0 + 10560 = N 2 736 + 11328 = N 0 0 + 11424 = N 1 0 + 11520 = N 2 160 + 11712 = N 0 0 + 11808 = N 1 448 + 12288 = N 1 0 + 12384 = N 2 0 + 12480 = N 3 160 + 12672 = N 1 0 + 12768 = N 2 336 + 13248 = N 1 0 + 13344 = N 2 0 + 13440 = N 3 2064 + 15360 = S 2 768 + 15600 = N 2 0 + 15744 = N 0 0 + 15888 = N 1 0 + 15984 = N 2 0 + 16128 = N 0 0 + 16224 = N 1 0 + 16320 = N 0 0 + 16416 = N 1 0 + 16704 = N 0 0 + 16800 = N 1 0 + 16896 = N 0 0 + 16992 = N 1 0 + 17280 = N 0 0 + 17376 = N 1 0 + 17472 = N 0 0 + 17664 = N 3 0 + 17808 = N 3 0 + 17952 = N 2 0 + 18096 = N 2 0 + 18240 = N 1 0 + 18384 = N 1 0 + 18528 = N 0 0 + 18672 = N 0 0 + 18816 = N 2 0 + 18816 = N 3 0 + 19008 = N 1 0 + 19008 = N 2 0 + 19200 = N 0 0 + 19200 = N 1 0 + 19392 = N 0 0 + 19488 = N 1 0 + 19584 = N 2 160 + 19776 = N 0 0 + 19872 = N 1 448 + 20352 = N 1 0 + 20448 = N 2 0 + 20544 = N 3 160 + 20736 = N 1 0 + 20832 = N 2 336 + 21312 = N 1 0 + 21408 = N 2 0 + 21504 = N 3 1536 + 23664 = N 2 0 + 23856 = N 2 0 + 23952 = N 2 0 + 24096 = N 2 0 + 24192 = N 0 0 + 24288 = N 1 0 + 24384 = N 0 0 + 24480 = N 1 0 + 24768 = N 0 0 + 24864 = N 1 0 + 24960 = N 0 0 + 25056 = N 1 0 + 25344 = N 0 0 + 25440 = N 1 0 + 25536 = N 0 0 + 25728 = N 3 0 + 25728 = S 2 1920 + 25872 = N 3 0 + 26016 = N 2 0 + 26160 = N 2 0 + 26304 = N 1 0 + 26448 = N 1 0 + 26592 = N 0 0 + 26688 = N 0 0 + 26880 = N 2 0 + 26880 = N 3 0 + 27072 = N 1 0 + 27072 = N 2 0 + 27264 = N 0 576 + 27264 = N 1 576 + 28032 = N 3 0 + 28128 = N 2 0 + 28224 = N 1 0 + 28320 = N 3 0 + 28416 = N 2 0 + 28512 = N 3 0 + 28608 = N 2 0 + 28704 = N 1 0 + 28800 = N 0 0 + 28896 = N 1 0 + 28992 = N 2 0 + 29088 = N 0 0 + 29184 = N 1 0 + 29328 = N 2 144 + 29568 = N 3 0 + 29664 = N 1 0 + 29760 = N 2 0 + 29904 = N 0 112 + 30048 = N 1 0 + 30144 = N 1 0 + 30288 = N 2 624 + 31104 = N 2 0 + 31200 = N 3 0 + 31296 = N 2 0 + 31392 = N 1 0 + 31488 = N 0 0 + 31584 = N 3 0 + 31680 = N 2 0 + 31776 = N 1 0 + 31872 = N 2 0 + 31968 = N 1 0 + 32064 = N 2 0 + 32160 = N 3 0 + 32256 = N 2 0 + 32400 = N 0 0 + 32640 = N 1 0 + 32736 = N 2 0 + 32832 = N 3 0 + 32928 = N 2 0 + 33024 = N 3 0 + 33120 = N 2 0 + 33216 = N 0 0 + 33360 = N 1 624 + 34176 = N 3 0 + 34272 = N 2 0 + 34368 = N 1 0 + 34464 = N 3 0 + 34560 = N 2 0 + 34656 = N 3 0 + 34752 = N 2 0 + 34848 = N 1 0 + 34944 = N 0 0 + 35040 = N 1 0 + 35136 = N 2 0 + 35232 = N 0 0 + 35328 = N 1 0 + 35472 = N 2 144 + 35712 = N 3 0 + 35808 = N 1 0 + 35904 = N 2 0 + 36048 = N 0 112 + 36192 = N 1 0 + 36288 = N 1 0 + 36432 = N 2 624 + 37248 = N 2 0 + 37248 = S 2 768 + 37344 = N 3 0 + 37440 = N 2 0 + 37536 = N 1 0 + 37632 = N 0 0 + 37728 = N 3 0 + 37824 = N 2 0 + 37920 = N 1 0 + 38016 = N 2 0 + 38112 = N 1 0 + 38208 = N 2 0 + 38304 = N 3 0 + 38400 = N 2 0 + 38544 = N 0 0 + 38784 = N 1 0 + 38880 = N 2 0 + 38976 = N 3 0 + 39072 = N 2 0 + 39168 = N 3 0 + 39264 = N 2 0 + 39360 = N 0 0 + 39504 = N 1 592 + 40128 = N 0 0 + 40224 = N 1 0 + 40320 = N 2 160 + 40512 = N 0 0 + 40608 = N 1 448 + 41088 = N 1 0 + 41184 = N 2 0 + 41280 = N 3 160 + 41472 = N 1 0 + 41568 = N 2 336 + 42048 = N 1 0 + 42144 = N 2 0 + 42240 = N 3 1536 + 44256 = N 2 0 + 44352 = N 2 0 + 44640 = N 2 0 + 44784 = N 2 0 + 44928 = N 0 0 + 45024 = N 1 0 + 45120 = N 0 0 + 45216 = N 1 0 + 45312 = N 1 0 + 45504 = N 0 0 + 45600 = N 1 0 + 45696 = N 0 0 + 45792 = N 1 0 + 46080 = N 0 0 + 46176 = N 1 0 + 46320 = N 0 0 + 46464 = N 3 0 + 46608 = N 3 0 + 46752 = N 2 0 + 46896 = N 2 0 + 47040 = N 1 0 + 47184 = N 1 0 + 47328 = N 0 0 + 47472 = N 0 0 + 47616 = N 2 0 + 47616 = N 3 0 + 47808 = N 1 0 + 47808 = N 2 0 + 48000 = N 0 160 + 48000 = N 1 160 + 48192 = N 0 0 + 48192 = S 2 1728 + 48288 = N 1 0 + 48384 = N 2 160 + 48576 = N 0 0 + 48672 = N 1 448 + 49152 = N 1 0 + 49248 = N 2 0 + 49344 = N 3 160 + 49536 = N 1 0 + 49632 = N 2 336 + 50112 = N 1 0 + 50208 = N 2 0 + 50304 = N 3 1536 + 52320 = N 1 0 + 52416 = N 2 0 + 52512 = N 3 0 + 52608 = N 2 0 + 52704 = N 1 0 + 52800 = N 0 0 + 52896 = N 1 0 + 52992 = N 2 0 + 53088 = N 1 0 + 53184 = N 0 0 + 53280 = N 1 0 + 53376 = N 2 0 + 53472 = N 3 0 + 53568 = N 2 0 + 53664 = N 1 0 + 53760 = N 0 0 + 53856 = N 1 0 + 53952 = N 2 0 + 54048 = N 1 0 + 54144 = N 3 160 + 54336 = N 2 0 + 54432 = N 2 0 + 54528 = N 3 0 + 54672 = N 3 0 + 54816 = N 2 0 + 54960 = N 2 0 + 55104 = N 1 0 + 55248 = N 1 0 + 55392 = N 0 0 + 55536 = N 0 0 + 55680 = N 2 0 + 55680 = N 3 0 + 55872 = N 1 0 + 55872 = N 2 0 + 56064 = N 0 576 + 56064 = N 1 576 + 56832 = N 3 0 + 56928 = N 2 0 + 57024 = N 1 0 + 57120 = N 3 0 + 57216 = N 2 0 + 57312 = N 3 0 + 57408 = N 2 0 + 57504 = N 1 0 + 57600 = N 0 0 + 57696 = N 1 0 + 57792 = N 2 0 + 57888 = N 0 0 + 57984 = N 1 0 + 58128 = N 2 144 + 58368 = N 3 0 + 58368 = S 2 1152 + 58464 = N 1 0 + 58560 = N 2 0 + 58704 = N 0 112 + 58848 = N 1 0 + 58944 = N 1 0 + 59088 = N 2 624 + 59904 = N 2 0 + 60000 = N 3 0 + 60096 = N 2 0 + 60192 = N 1 0 + 60288 = N 0 0 + 60384 = N 3 0 + 60480 = N 2 0 + 60576 = N 1 0 + 60672 = N 2 0 + 60768 = N 1 0 + 60864 = N 2 0 + 60960 = N 3 0 + 61056 = N 2 0 + 61200 = N 0 0 + 61440 = N 1 0 + 61536 = N 2 0 + 61632 = N 3 0 + 61728 = N 2 0 + 61824 = N 3 0 + 61920 = N 2 0 + 62016 = N 0 0 + 62160 = N 1 624 + 62976 = N 3 0 + 63072 = N 2 0 + 63168 = N 1 0 + 63264 = N 3 0 + 63360 = N 2 0 + 63456 = N 3 0 + 63552 = N 2 0 + 63648 = N 1 0 + 63744 = N 0 0 + 63840 = N 1 0 + 63936 = N 2 0 + 64032 = N 0 0 + 64128 = N 1 0 + 64272 = N 2 144 + 64512 = N 3 0 + 64608 = N 1 0 + 64704 = N 2 0 + 64848 = N 0 112 + 64992 = N 1 0 + 65088 = N 1 0 + 65232 = N 2 624 + 66048 = N 2 0 + 66144 = N 3 0 + 66240 = N 2 0 + 66336 = N 1 0 + 66432 = N 0 0 + 66528 = N 3 0 + 66624 = N 2 0 + 66720 = N 1 0 + 66816 = N 2 0 + 66912 = N 1 0 + 67008 = N 2 0 + 67104 = N 3 0 + 67200 = N 2 0 + 67344 = N 0 0 + 67584 = N 1 0 + 67680 = N 2 0 + 67776 = N 3 0 + 67872 = N 2 0 + 67968 = N 3 0 + 68064 = N 2 0 + 68160 = N 0 0 + 68304 = N 1 592 + 68928 = N 0 0 + 68928 = S 2 1536 + 69024 = N 1 0 + 69120 = N 2 160 + 69312 = N 0 0 + 69408 = N 1 448 + 69888 = N 1 0 + 69984 = N 2 0 + 70080 = N 3 160 + 70272 = N 1 0 + 70368 = N 2 336 + 70848 = N 1 0 + 70944 = N 2 0 + 71040 = N 3 1536 + 73152 = N 0 0 + 73248 = N 1 0 + 73344 = N 2 0 + 73440 = N 1 0 + 73536 = N 0 0 + 73632 = N 1 0 + 73728 = N 2 0 + 73824 = N 1 0 + 73968 = N 2 352 + 74352 = N 2 336 + 74784 = N 3 448 + 75264 = N 3 0 + 75408 = N 3 0 + 75552 = N 2 0 + 75696 = N 2 0 + 75840 = N 1 0 + 75984 = N 1 0 + 76128 = N 0 0 + 76272 = N 0 0 + 76416 = N 2 0 + 76416 = N 3 0 + 76608 = N 1 0 + 76608 = N 2 0 + 76800 = N 0 160 + 76800 = N 1 160 + 76992 = N 0 0 + 77088 = N 1 0 + 77184 = N 2 160 + 77376 = N 0 0 + 77472 = N 1 448 + 77952 = N 1 0 + 78048 = N 2 0 + 78144 = N 3 160 + 78336 = N 1 0 + 78432 = N 2 336 + 78912 = N 0 0 + 78912 = S 2 1152 + 79040 = N 1 0 + 79168 = N 2 0 + 79296 = N 3 0 + 79488 = N 3 1344 + 81360 = N 0 0 + 81504 = N 1 0 + 81600 = N 2 0 + 81696 = N 1 0 + 81792 = N 2 0 + 81888 = N 1 0 + 82032 = N 3 112 + 82176 = N 1 0 + 82272 = N 2 0 + 82368 = N 1 0 + 82464 = N 0 0 + 82656 = N 2 0 + 82752 = N 1 0 + 82848 = N 0 0 + 82944 = N 2 0 + 83040 = N 1 0 + 83136 = N 2 0 + 83232 = N 2 0 + 83328 = N 2 0 + 83472 = N 3 0 + 83616 = N 1 0 + 83760 = N 3 0 + 83904 = N 1 0 + 84048 = N 2 0 + 84192 = N 0 0 + 84336 = N 1 0 + 84480 = N 2 0 + 84480 = N 3 0 + 84672 = N 1 0 + 84672 = N 2 0 + 84864 = N 0 0 + 85056 = N 2 0 + 85200 = N 3 0 + 85344 = N 1 0 + 85488 = N 3 0 + 85632 = N 1 0 + 85776 = N 2 0 + 85920 = N 0 0 + 86064 = N 1 0 + 86208 = N 2 0 + 86208 = N 3 0 + 86400 = N 1 0 + 86400 = N 2 0 + 86592 = N 0 0 + 86784 = N 2 0 + 86928 = N 3 0 + 87072 = N 1 0 + 87216 = N 3 0 + 87360 = N 1 0 + 87504 = N 2 0 + 87648 = N 0 0 + 87792 = N 1 0 + 87936 = N 1 0 + 88032 = N 2 0 + 88128 = N 0 0 + 88224 = N 1 0 + 88512 = N 2 0 + 88656 = N 3 0 + 88800 = N 1 0 + 88944 = N 3 0 + 89088 = N 1 0 + 89232 = N 2 0 + 89376 = N 0 0 + 89520 = N 1 0 + 89664 = N 1 0 + 89760 = N 2 0 + 89856 = N 0 0 + 89952 = N 1 0 + 90240 = N 2 0 + 90384 = N 3 0 + 90528 = N 1 0 + 90672 = N 3 0 + 90816 = N 1 0 + 90960 = N 2 0 + 91104 = N 0 0 + 91248 = N 1 0 + 91392 = N 1 0 + 91488 = N 2 0 + 91584 = N 0 0 + 91680 = N 1 0 + 91776 = N 0 544 + 92352 = N 3 544 + 92352 = N 6 0 + 92928 = N 2 352 + 92928 = N 6 0 + 93312 = N 1 352 + 93312 = N 6 0 + 93696 = N 0 352 + 93696 = N 6 0 +} +[EasySingle] +{ + 1536 = N 2 0 + 1680 = N 1 0 + 2112 = N 0 0 + 2304 = N 0 0 + 2496 = N 0 0 + 2688 = N 0 0 + 2880 = N 0 0 + 3072 = N 2 0 + 3216 = N 1 0 + 3504 = N 0 0 + 3648 = N 0 0 + 3840 = N 0 0 + 4032 = N 0 0 + 4224 = N 0 0 + 4416 = N 0 0 + 4608 = N 2 0 + 4752 = N 1 0 + 5040 = N 0 0 + 5424 = N 0 0 + 5760 = N 0 0 + 5952 = N 0 0 + 6144 = N 2 0 + 6144 = S 2 1536 + 6288 = N 1 0 + 6624 = N 0 0 + 6720 = N 0 0 + 6912 = N 0 0 + 7200 = N 0 0 + 7488 = N 0 0 + 7680 = N 2 0 + 7824 = N 1 0 + 8064 = N 0 0 + 8256 = N 0 0 + 8448 = N 0 0 + 8640 = N 0 0 + 8832 = N 0 0 + 9216 = N 2 0 + 9360 = N 1 0 + 9600 = N 0 0 + 9888 = N 0 0 + 10176 = N 0 0 + 10368 = N 0 0 + 10560 = N 1 736 + 11328 = N 0 0 + 11520 = N 1 160 + 11808 = N 0 448 + 12288 = N 1 0 + 12480 = N 2 160 + 12768 = N 1 336 + 13248 = N 1 0 + 13440 = N 2 2064 + 15360 = S 2 768 + 15600 = N 2 0 + 15984 = N 2 0 + 16128 = N 0 0 + 16320 = N 0 0 + 16704 = N 0 0 + 16896 = N 0 0 + 17280 = N 0 0 + 17472 = N 0 0 + 17664 = N 2 0 + 17952 = N 1 0 + 18240 = N 2 0 + 18528 = N 0 0 + 18816 = N 2 0 + 19008 = N 1 0 + 19200 = N 0 0 + 19392 = N 0 0 + 19584 = N 1 160 + 19872 = N 0 448 + 20352 = N 1 0 + 20544 = N 2 160 + 20832 = N 1 336 + 21312 = N 1 0 + 21504 = N 2 1536 + 23664 = N 2 0 + 23856 = N 2 0 + 24192 = N 0 0 + 24384 = N 0 0 + 24768 = N 0 0 + 24960 = N 0 0 + 25344 = N 0 0 + 25536 = N 0 0 + 25728 = N 2 0 + 25728 = S 2 1920 + 26016 = N 1 0 + 26304 = N 2 0 + 26592 = N 0 0 + 26880 = N 2 0 + 27072 = N 1 0 + 27264 = N 0 576 + 28032 = N 2 0 + 28224 = N 1 0 + 28416 = N 0 0 + 28608 = N 1 0 + 28800 = N 0 0 + 28992 = N 1 0 + 29184 = N 0 0 + 29328 = N 1 144 + 29568 = N 2 0 + 29760 = N 1 0 + 29904 = N 0 112 + 30144 = N 1 0 + 30288 = N 2 624 + 31104 = N 1 0 + 31296 = N 1 0 + 31488 = N 0 0 + 31680 = N 2 0 + 31872 = N 1 0 + 32064 = N 1 0 + 32256 = N 1 0 + 32400 = N 0 0 + 32640 = N 1 0 + 32832 = N 2 0 + 33024 = N 2 0 + 33216 = N 0 0 + 33360 = N 1 624 + 34176 = N 2 0 + 34368 = N 1 0 + 34560 = N 0 0 + 34752 = N 1 0 + 34944 = N 0 0 + 35136 = N 1 0 + 35328 = N 0 0 + 35472 = N 1 144 + 35712 = N 2 0 + 35904 = N 1 0 + 36048 = N 0 112 + 36288 = N 1 0 + 36432 = N 2 624 + 37248 = N 1 0 + 37248 = S 2 768 + 37440 = N 1 0 + 37632 = N 0 0 + 37824 = N 2 0 + 38016 = N 1 0 + 38208 = N 1 0 + 38400 = N 1 0 + 38544 = N 0 0 + 38784 = N 1 0 + 38976 = N 2 0 + 39168 = N 2 0 + 39360 = N 0 0 + 39504 = N 1 592 + 40128 = N 0 0 + 40320 = N 1 160 + 40608 = N 0 448 + 41088 = N 1 0 + 41280 = N 2 160 + 41568 = N 1 336 + 42048 = N 1 0 + 42240 = N 2 1536 + 44352 = N 2 0 + 44640 = N 2 0 + 44928 = N 0 0 + 45120 = N 0 0 + 45504 = N 0 0 + 45696 = N 0 0 + 46080 = N 0 0 + 46320 = N 0 0 + 46464 = N 2 0 + 46752 = N 1 0 + 47040 = N 2 0 + 47328 = N 0 0 + 47616 = N 2 0 + 47808 = N 1 0 + 48000 = N 0 160 + 48192 = N 0 0 + 48192 = S 2 1728 + 48384 = N 1 160 + 48672 = N 0 448 + 49152 = N 1 0 + 49344 = N 2 160 + 49632 = N 1 336 + 50112 = N 1 0 + 50304 = N 2 1536 + 52416 = N 2 0 + 52608 = N 1 0 + 52800 = N 0 0 + 52992 = N 2 0 + 53184 = N 1 0 + 53376 = N 2 0 + 53568 = N 1 0 + 53760 = N 0 0 + 53952 = N 1 0 + 54144 = N 2 160 + 54336 = N 1 0 + 54528 = N 2 0 + 54816 = N 1 0 + 55104 = N 2 0 + 55392 = N 0 0 + 55680 = N 2 0 + 55872 = N 1 0 + 56064 = N 0 576 + 56832 = N 2 0 + 57024 = N 1 0 + 57216 = N 0 0 + 57408 = N 1 0 + 57600 = N 0 0 + 57792 = N 1 0 + 57984 = N 0 0 + 58128 = N 1 144 + 58368 = N 2 0 + 58368 = S 2 1152 + 58560 = N 1 0 + 58704 = N 0 112 + 58944 = N 1 0 + 59088 = N 2 624 + 59904 = N 1 0 + 60096 = N 1 0 + 60288 = N 0 0 + 60480 = N 2 0 + 60672 = N 1 0 + 60864 = N 1 0 + 61056 = N 1 0 + 61200 = N 0 0 + 61440 = N 1 0 + 61632 = N 2 0 + 61824 = N 2 0 + 62016 = N 0 0 + 62160 = N 1 624 + 62976 = N 2 0 + 63168 = N 1 0 + 63360 = N 0 0 + 63552 = N 1 0 + 63744 = N 0 0 + 63936 = N 1 0 + 64128 = N 0 0 + 64272 = N 1 144 + 64512 = N 2 0 + 64704 = N 1 0 + 64848 = N 0 112 + 65088 = N 1 0 + 65232 = N 2 624 + 66048 = N 1 0 + 66240 = N 1 0 + 66432 = N 0 0 + 66624 = N 2 0 + 66816 = N 1 0 + 67008 = N 1 0 + 67200 = N 1 0 + 67344 = N 0 0 + 67584 = N 1 0 + 67776 = N 2 0 + 67968 = N 2 0 + 68160 = N 0 0 + 68304 = N 1 592 + 68928 = N 0 0 + 68928 = S 2 1536 + 69120 = N 1 160 + 69408 = N 0 448 + 69888 = N 1 0 + 70080 = N 2 160 + 70368 = N 1 336 + 70848 = N 1 0 + 71040 = N 2 1536 + 73152 = N 0 0 + 73344 = N 1 0 + 73536 = N 0 0 + 73728 = N 1 0 + 73968 = N 1 352 + 74352 = N 1 336 + 74784 = N 2 448 + 75264 = N 2 0 + 75552 = N 1 0 + 75840 = N 2 0 + 76128 = N 0 0 + 76416 = N 2 0 + 76608 = N 1 0 + 76800 = N 0 160 + 76992 = N 0 0 + 77184 = N 1 160 + 77472 = N 0 448 + 77952 = N 1 0 + 78144 = N 2 160 + 78432 = N 1 336 + 78912 = N 0 0 + 78912 = S 2 1152 + 79168 = N 1 0 + 79488 = N 2 1344 + 81360 = N 0 0 + 81600 = N 1 0 + 81792 = N 1 0 + 82032 = N 2 112 + 82176 = N 1 0 + 82368 = N 1 0 + 82560 = N 0 0 + 82752 = N 0 0 + 82944 = N 1 0 + 83136 = N 1 0 + 83328 = N 2 0 + 83616 = N 1 0 + 83904 = N 2 0 + 84192 = N 0 0 + 84480 = N 2 0 + 84672 = N 1 0 + 84864 = N 0 0 + 85056 = N 2 0 + 85344 = N 1 0 + 85632 = N 2 0 + 85920 = N 0 0 + 86208 = N 2 0 + 86400 = N 1 0 + 86592 = N 0 0 + 86784 = N 2 0 + 87072 = N 1 0 + 87360 = N 2 0 + 87648 = N 0 0 + 87936 = N 2 0 + 88128 = N 1 0 + 88320 = N 0 0 + 88512 = N 2 0 + 88800 = N 1 0 + 89088 = N 2 0 + 89376 = N 0 0 + 89664 = N 2 0 + 89856 = N 1 0 + 90048 = N 0 0 + 90240 = N 2 0 + 90528 = N 1 0 + 90816 = N 2 0 + 91104 = N 0 0 + 91392 = N 2 0 + 91584 = N 1 0 + 91776 = N 0 544 + 92352 = N 2 544 + 92352 = N 6 0 + 92928 = N 1 352 + 92928 = N 6 0 + 93312 = N 0 768 + 93312 = N 6 0 +} diff --git a/songs/Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)/notes.chart b/songs/Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)/notes.chart new file mode 100644 index 0000000..2a8d08e --- /dev/null +++ b/songs/Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)/notes.chart @@ -0,0 +1,5141 @@ +[Song] +{ + Offset = 0 + Name = "A Chick from Corea (Live)" + Artist = "Victor Wooten and Steve Bailey" + Album = "A Chick from Corea (Live) (Single)" + Year = ", 1993" + Charter = "GuitarZero132" + Genre = "Jazz Fusion" + Resolution = 192 + Player2 = bass + Difficulty = 0 + PreviewStart = 0 + PreviewEnd = 0 + Genre = "rock" + MediaType = "cd" + MusicStream = "song.ogg" +} +[SyncTrack] +{ + 0 = TS 4 + 0 = B 124000 + 1536 = B 130000 + 2112 = B 135000 + 3072 = B 126000 + 3456 = B 136000 + 3840 = B 124000 + 4608 = B 126000 + 5760 = B 134000 + 6144 = B 130000 + 6912 = B 133000 + 8448 = B 130000 + 9216 = B 131000 + 10560 = B 134000 + 11520 = B 131000 + 12288 = B 130000 + 13056 = B 132000 + 13824 = B 133000 + 15552 = B 129000 + 16128 = B 132000 + 16896 = B 131000 + 17472 = B 131000 + 18432 = B 126000 + 20352 = B 128000 + 22848 = B 128000 + 23808 = B 128000 + 24576 = B 131000 + 27456 = B 131000 + 28800 = B 133000 + 29760 = B 131000 + 30144 = B 129000 + 30720 = B 132000 + 31104 = B 135000 + 32256 = B 133000 + 33408 = B 137000 + 34560 = B 135000 + 35328 = B 135000 + 37248 = B 137000 + 38400 = B 135000 + 39168 = B 135000 + 40704 = B 135000 + 41856 = B 136000 + 42624 = B 134000 + 44544 = B 136000 + 45312 = B 135000 + 46080 = B 135000 + 46848 = B 136000 + 49152 = B 132000 + 50304 = B 134000 + 51840 = B 133000 + 52992 = B 135000 + 55296 = B 129000 + 56448 = B 131000 + 57600 = B 130000 + 59136 = B 130000 + 61056 = B 127000 + 61632 = B 129000 + 62784 = B 130000 + 65280 = B 131000 + 67584 = B 128000 + 69120 = B 129000 + 71808 = B 128000 + 73152 = B 129000 + 74496 = B 129000 + 75840 = B 130000 + 76800 = B 130000 + 77952 = B 131000 + 79104 = B 131000 + 79872 = B 129000 + 81024 = B 128000 + 82944 = B 130000 + 83904 = B 128000 + 84480 = B 129000 + 86016 = B 130000 + 87552 = B 134000 + 88320 = B 127000 + 89856 = B 132000 + 91776 = B 134000 + 92928 = B 133000 + 94464 = B 127000 + 95232 = B 129000 + 96000 = B 134000 + 96576 = B 131000 + 97536 = B 131000 + 98688 = B 133000 + 99840 = B 132000 + 100800 = B 126000 + 101376 = B 130000 + 102720 = B 132000 + 103872 = B 133000 + 105600 = B 130000 + 107520 = B 132000 + 108096 = B 134000 + 109824 = B 131000 + 110592 = B 133000 + 112320 = B 135000 + 113088 = B 128000 + 113664 = B 126000 + 114432 = B 128000 + 119808 = B 130000 + 121152 = B 132000 + 122112 = B 130000 + 122880 = B 131000 + 123840 = B 136000 + 124416 = B 132000 + 125184 = B 130000 + 125952 = B 133000 + 127296 = B 131000 +} +[Events] +{ + 1536 = E "section Intro" + 6144 = E "section Chorus 1" + 12288 = E "section Chorus 2" + 18432 = E "section Verse 1" + 24576 = E "section Chorus 3" + 30720 = E "section Victor Solo A" + 36864 = E "section Victor Solo B" + 43008 = E "section Victor Solo C" + 49152 = E "section Victor Solo D" + 55296 = E "section Verse 2" + 61440 = E "section Steve Solo A" + 67584 = E "section Steve Solo B" + 73728 = E "section Steve Solo C" + 79872 = E "section Steve Solo D" + 86016 = E "section Bridge A" + 89088 = E "section Bridge B" + 95232 = E "section Bridge C" + 101376 = E "section Bridge D" + 107520 = E "section Chorus 4" + 113664 = E "section Verse 3" + 119808 = E "section Chorus 5" + 125904 = E "section Ending" +} +[ExpertSingle] +{ + 1536 = N 7 0 + 1584 = N 0 0 + 1584 = N 5 0 + 1680 = N 1 0 + 1776 = N 2 0 + 1872 = N 3 0 + 1920 = N 4 0 + 1968 = N 3 0 + 2016 = N 2 0 + 2064 = N 4 0 + 2112 = N 3 112 + 2256 = N 2 0 + 2352 = N 0 0 + 2448 = N 1 0 + 2544 = N 2 0 + 2592 = N 3 0 + 2640 = N 2 0 + 2688 = N 1 0 + 2736 = N 3 0 + 2784 = N 2 112 + 2928 = N 1 0 + 3072 = N 4 0 + 3072 = S 2 768 + 3104 = N 4 0 + 3136 = N 3 0 + 3168 = N 2 0 + 3200 = N 3 0 + 3232 = N 2 0 + 3264 = N 1 0 + 3296 = N 0 0 + 3328 = N 0 0 + 3360 = N 3 0 + 3392 = N 2 0 + 3424 = N 1 0 + 3456 = N 0 192 + 3840 = N 4 0 + 3936 = N 3 0 + 4032 = N 2 0 + 4128 = N 1 0 + 4224 = N 0 352 + 4608 = N 1 640 + 5280 = N 2 0 + 5328 = N 3 0 + 5376 = N 2 0 + 5472 = N 2 0 + 5520 = N 3 0 + 5568 = N 2 384 + 6144 = N 7 0 + 6192 = N 0 0 + 6192 = N 5 0 + 6288 = N 1 0 + 6384 = N 2 0 + 6480 = N 3 0 + 6528 = N 4 0 + 6576 = N 3 0 + 6624 = N 2 0 + 6672 = N 4 0 + 6720 = N 3 112 + 6864 = N 2 0 + 6960 = N 0 0 + 7056 = N 1 0 + 7152 = N 2 0 + 7200 = N 3 0 + 7248 = N 2 0 + 7296 = N 1 0 + 7344 = N 3 0 + 7392 = N 2 112 + 7536 = N 1 0 + 7728 = N 4 0 + 7824 = N 3 0 + 7872 = N 2 0 + 7920 = N 1 0 + 8016 = N 3 0 + 8112 = N 2 0 + 8160 = N 1 0 + 8208 = N 0 96 + 8448 = N 3 0 + 8480 = N 4 0 + 8512 = N 3 0 + 8544 = N 2 0 + 8576 = N 3 0 + 8608 = N 2 0 + 8640 = N 1 0 + 8672 = N 2 0 + 8704 = N 1 0 + 8736 = N 0 0 + 9216 = N 7 0 + 9264 = N 0 0 + 9264 = N 5 0 + 9360 = N 1 0 + 9456 = N 2 0 + 9552 = N 3 0 + 9600 = N 4 0 + 9648 = N 3 0 + 9696 = N 2 0 + 9744 = N 4 0 + 9792 = N 3 112 + 9936 = N 4 0 + 9984 = S 2 768 + 10032 = N 0 0 + 10128 = N 1 0 + 10224 = N 2 0 + 10272 = N 3 0 + 10320 = N 2 0 + 10368 = N 1 0 + 10416 = N 3 0 + 10464 = N 2 0 + 10560 = N 3 0 + 10560 = N 5 0 + 10608 = N 4 0 + 10800 = N 3 0 + 10848 = N 4 0 + 10896 = N 3 0 + 10944 = N 2 0 + 10992 = N 1 0 + 11088 = N 2 0 + 11184 = N 3 0 + 11232 = N 2 0 + 11280 = N 0 0 + 11328 = N 1 0 + 11376 = N 0 0 + 11472 = N 4 0 + 11520 = N 4 0 + 11568 = N 3 0 + 11616 = N 2 0 + 11664 = N 1 0 + 11712 = N 3 0 + 11760 = N 2 0 + 11808 = N 1 256 + 12096 = N 0 0 + 12096 = N 5 0 + 12192 = N 1 0 + 12192 = N 5 0 + 12240 = N 2 0 + 12288 = N 7 0 + 12288 = N 5 0 + 12336 = N 0 0 + 12336 = N 5 0 + 12432 = N 1 0 + 12528 = N 2 0 + 12624 = N 3 0 + 12672 = N 4 0 + 12720 = N 3 0 + 12768 = N 2 0 + 12816 = N 4 0 + 12864 = N 3 112 + 13008 = N 2 0 + 13104 = N 0 0 + 13200 = N 1 0 + 13296 = N 2 0 + 13344 = N 3 0 + 13392 = N 2 0 + 13440 = N 1 0 + 13488 = N 3 0 + 13536 = N 2 0 + 13680 = N 1 0 + 13872 = N 4 0 + 13968 = N 3 0 + 14016 = N 2 0 + 14064 = N 1 0 + 14160 = N 3 0 + 14256 = N 2 0 + 14304 = N 1 0 + 14352 = N 0 0 + 14544 = N 7 0 + 14592 = N 3 0 + 14624 = N 4 0 + 14656 = N 3 0 + 14688 = N 2 0 + 14720 = N 3 0 + 14752 = N 2 0 + 14784 = N 1 0 + 14816 = N 2 0 + 14848 = N 1 0 + 14880 = N 0 0 + 15360 = N 7 0 + 15408 = N 0 0 + 15408 = N 5 0 + 15504 = N 1 0 + 15600 = N 2 0 + 15696 = N 3 0 + 15744 = N 4 0 + 15792 = N 3 0 + 15840 = N 2 0 + 15888 = N 4 0 + 15936 = N 3 112 + 16080 = N 4 0 + 16176 = N 0 0 + 16272 = N 1 0 + 16368 = N 2 0 + 16416 = N 3 0 + 16464 = N 2 0 + 16512 = N 1 0 + 16560 = N 3 0 + 16608 = N 2 112 + 16752 = N 4 0 + 16896 = S 2 1152 + 16944 = N 3 0 + 16992 = N 4 0 + 17040 = N 3 0 + 17088 = N 2 0 + 17136 = N 1 0 + 17232 = N 2 0 + 17328 = N 3 0 + 17376 = N 2 0 + 17424 = N 0 0 + 17472 = N 1 0 + 17520 = N 0 0 + 17616 = N 4 0 + 17664 = N 3 0 + 17712 = N 2 0 + 17760 = N 1 0 + 17808 = N 0 0 + 17856 = N 1 0 + 17904 = N 3 0 + 17952 = N 0 0 + 18144 = N 1 0 + 18144 = N 6 0 + 18192 = N 2 0 + 18192 = N 6 0 + 18240 = N 3 160 + 18240 = N 6 0 + 18432 = N 0 0 + 18480 = N 1 0 + 18528 = N 2 0 + 18576 = N 1 0 + 18624 = N 2 0 + 18720 = N 2 0 + 18768 = N 2 0 + 18816 = N 3 0 + 18864 = N 1 240 + 19200 = N 3 0 + 19248 = N 4 0 + 19296 = N 3 0 + 19392 = N 2 0 + 19488 = N 0 0 + 19536 = N 1 400 + 19968 = N 0 0 + 20016 = N 1 0 + 20064 = N 2 0 + 20160 = N 1 0 + 20256 = N 2 0 + 20352 = N 3 0 + 20400 = N 1 240 + 20832 = N 2 0 + 20880 = N 3 0 + 20928 = N 4 0 + 20976 = N 1 0 + 21024 = N 2 0 + 21072 = N 2 0 + 21120 = N 3 0 + 21168 = N 0 240 + 21504 = N 0 0 + 21552 = N 1 0 + 21600 = N 2 0 + 21648 = N 1 0 + 21696 = N 2 0 + 21792 = N 2 0 + 21840 = N 2 0 + 21888 = N 3 0 + 21936 = N 1 144 + 22176 = N 7 0 + 22272 = N 1 0 + 22320 = N 2 0 + 22368 = N 3 0 + 22416 = N 2 0 + 22464 = N 3 0 + 22560 = N 3 0 + 22608 = N 4 240 + 23040 = N 0 0 + 23088 = N 1 0 + 23136 = N 2 0 + 23184 = N 1 0 + 23232 = N 2 0 + 23280 = N 3 0 + 23328 = N 0 0 + 23376 = N 2 0 + 23424 = N 3 0 + 23472 = N 0 0 + 23520 = N 1 0 + 23568 = N 4 0 + 23616 = N 0 0 + 23664 = N 2 0 + 23712 = N 4 0 + 23760 = N 1 0 + 23808 = N 2 0 + 23856 = N 4 0 + 23904 = N 1 0 + 23952 = N 2 0 + 24000 = N 3 0 + 24096 = N 4 0 + 24144 = N 3 240 + 24144 = N 4 240 + 24576 = N 7 0 + 24576 = S 2 768 + 24624 = N 0 0 + 24624 = N 5 0 + 24720 = N 1 0 + 24816 = N 2 0 + 24912 = N 3 0 + 24960 = N 4 0 + 25008 = N 3 0 + 25056 = N 2 0 + 25104 = N 4 0 + 25152 = N 3 112 + 25296 = N 2 0 + 25392 = N 0 0 + 25488 = N 1 0 + 25584 = N 2 0 + 25632 = N 3 0 + 25680 = N 2 0 + 25728 = N 1 0 + 25776 = N 3 0 + 25824 = N 2 112 + 25968 = N 1 0 + 26160 = N 3 0 + 26208 = N 4 0 + 26256 = N 3 0 + 26304 = N 2 0 + 26352 = N 1 0 + 26448 = N 3 0 + 26544 = N 2 0 + 26592 = N 1 0 + 26640 = N 0 96 + 26832 = N 7 0 + 26880 = N 3 0 + 26912 = N 4 0 + 26944 = N 3 0 + 26976 = N 2 0 + 27008 = N 3 0 + 27040 = N 2 0 + 27072 = N 1 0 + 27104 = N 2 0 + 27136 = N 1 0 + 27168 = N 0 0 + 27648 = N 7 0 + 27696 = N 0 0 + 27696 = N 5 0 + 27792 = N 1 0 + 27888 = N 2 0 + 27984 = N 3 0 + 28032 = N 4 0 + 28080 = N 3 0 + 28128 = N 2 0 + 28176 = N 4 0 + 28224 = N 3 112 + 28368 = N 4 0 + 28464 = N 0 0 + 28560 = N 1 0 + 28656 = N 2 0 + 28704 = N 3 0 + 28752 = N 2 0 + 28800 = N 1 0 + 28848 = N 3 0 + 28896 = N 2 112 + 29040 = N 4 0 + 29232 = N 3 0 + 29280 = N 4 0 + 29328 = N 3 0 + 29376 = N 2 0 + 29424 = N 1 0 + 29520 = N 2 0 + 29616 = N 3 0 + 29664 = N 2 0 + 29712 = N 0 0 + 29760 = N 1 0 + 29808 = N 0 0 + 29904 = N 4 0 + 29952 = N 3 0 + 30000 = N 2 0 + 30048 = N 1 0 + 30096 = N 0 0 + 30144 = N 1 0 + 30192 = N 3 0 + 30240 = N 0 0 + 30384 = N 1 0 + 30384 = E solo + 30480 = N 2 0 + 30576 = N 0 0 + 30672 = N 1 0 + 30775 = N 3 0 + 30775 = N 6 0 + 30802 = N 4 0 + 30802 = N 6 0 + 30830 = N 3 0 + 30830 = N 6 0 + 30857 = N 4 0 + 30857 = N 6 0 + 30885 = N 3 0 + 30885 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 30939 = N 4 0 + 30939 = N 6 0 + 30967 = N 2 0 + 30967 = N 6 0 + 30994 = N 4 0 + 30994 = N 6 0 + 31022 = N 2 0 + 31022 = N 6 0 + 31049 = N 1 0 + 31049 = N 6 0 + 31077 = N 3 0 + 31077 = N 6 0 + 31104 = N 1 0 + 31104 = N 6 0 + 31131 = N 3 0 + 31131 = N 6 0 + 31159 = N 1 0 + 31159 = N 6 0 + 31186 = N 0 0 + 31186 = N 6 0 + 31214 = N 2 0 + 31214 = N 6 0 + 31241 = N 0 0 + 31241 = N 6 0 + 31269 = N 2 0 + 31269 = N 6 0 + 31296 = N 0 0 + 31296 = N 6 0 + 31344 = N 1 0 + 31344 = N 6 0 + 31440 = N 1 0 + 31488 = N 2 0 + 31488 = S 2 576 + 31536 = N 3 0 + 31584 = N 4 0 + 31632 = N 3 0 + 31680 = N 2 0 + 31728 = N 1 0 + 31776 = N 0 0 + 31824 = N 2 0 + 31872 = N 1 0 + 31920 = N 0 0 + 31968 = N 2 0 + 32112 = N 2 0 + 32160 = N 0 0 + 32208 = N 1 0 + 32256 = N 0 0 + 32304 = N 2 0 + 32352 = N 4 0 + 32400 = N 4 0 + 32448 = N 3 0 + 32496 = N 1 0 + 32544 = N 2 0 + 32592 = N 0 0 + 32640 = N 1 0 + 32688 = N 2 0 + 32736 = N 3 0 + 32784 = N 4 0 + 32832 = N 3 0 + 32880 = N 1 0 + 32928 = N 2 0 + 32976 = N 0 0 + 33024 = N 2 0 + 33072 = N 0 0 + 33120 = N 1 0 + 33168 = N 2 0 + 33216 = N 1 0 + 33264 = N 2 0 + 33312 = N 3 0 + 33360 = N 4 0 + 33408 = N 3 0 + 33456 = N 1 0 + 33504 = N 2 0 + 33552 = N 3 0 + 33576 = N 4 0 + 33648 = N 3 0 + 33696 = N 2 0 + 33744 = N 1 0 + 33792 = N 0 0 + 33840 = N 3 0 + 33888 = N 2 0 + 33936 = N 1 0 + 33984 = N 0 0 + 34032 = N 3 0 + 34080 = N 2 0 + 34128 = N 0 0 + 34176 = N 1 0 + 34224 = N 2 0 + 34320 = N 4 0 + 34368 = N 1 0 + 34400 = N 2 0 + 34432 = N 3 0 + 34464 = N 2 0 + 34512 = N 4 0 + 34560 = N 3 0 + 34608 = N 0 0 + 34656 = N 1 0 + 34704 = N 3 0 + 34752 = N 2 0 + 34800 = N 1 0 + 34848 = N 0 0 + 34896 = N 2 0 + 34944 = N 3 0 + 34992 = N 1 0 + 35040 = N 2 0 + 35088 = N 3 0 + 35232 = N 2 0 + 35280 = N 3 0 + 35360 = N 2 0 + 35424 = N 3 0 + 35488 = N 4 0 + 35568 = N 2 0 + 35592 = N 3 0 + 35664 = N 2 0 + 35712 = N 1 0 + 35760 = N 0 0 + 35856 = N 1 0 + 35904 = N 2 0 + 35952 = N 4 0 + 36048 = N 3 0 + 36144 = N 2 0 + 36224 = N 0 0 + 36288 = N 1 0 + 36352 = N 2 0 + 36416 = N 3 0 + 36480 = N 4 0 + 36544 = N 3 0 + 36608 = N 2 0 + 36704 = N 1 0 + 36768 = N 0 0 + 36864 = N 4 0 + 36916 = N 3 0 + 36969 = N 2 0 + 37021 = N 1 0 + 37073 = N 2 0 + 37126 = N 0 0 + 37178 = N 1 0 + 37231 = N 3 0 + 37283 = N 2 0 + 37335 = N 1 0 + 37388 = N 0 0 + 37440 = N 3 0 + 37488 = N 1 0 + 37536 = N 2 0 + 37584 = N 0 0 + 37632 = N 1 0 + 37680 = N 2 0 + 37728 = N 2 0 + 37776 = N 2 0 + 37824 = N 3 0 + 37872 = N 4 0 + 37920 = N 3 0 + 37968 = N 0 0 + 38016 = N 1 0 + 38064 = N 2 0 + 38160 = N 3 0 + 38208 = N 4 0 + 38304 = N 4 0 + 38352 = N 3 0 + 38400 = S 2 1536 + 38448 = N 3 0 + 38496 = N 2 0 + 38592 = N 2 0 + 38640 = N 0 0 + 38664 = N 1 0 + 38736 = N 1 0 + 38784 = N 0 0 + 38880 = N 0 0 + 38928 = N 4 0 + 39024 = N 4 0 + 39072 = N 3 0 + 39168 = N 3 0 + 39216 = N 2 0 + 39312 = N 2 0 + 39360 = N 3 0 + 39408 = N 1 0 + 39456 = N 2 0 + 39552 = N 1 0 + 40320 = N 0 0 + 40368 = N 1 0 + 40416 = N 2 0 + 40464 = N 1 0 + 40512 = N 2 0 + 40560 = N 3 0 + 40608 = N 1 0 + 40656 = N 2 0 + 40704 = N 3 0 + 40752 = N 4 0 + 40800 = N 0 0 + 40848 = N 1 0 + 40896 = N 1 0 + 40944 = N 1 0 + 40992 = N 2 0 + 41040 = N 3 0 + 41088 = N 4 0 + 41136 = N 2 0 + 41184 = N 3 0 + 41232 = N 1 0 + 41280 = N 2 0 + 41328 = N 0 0 + 41376 = N 1 0 + 41424 = N 2 0 + 41472 = N 3 0 + 41520 = N 4 0 + 41568 = N 3 0 + 41616 = N 1 0 + 41664 = N 2 0 + 41712 = N 3 0 + 41760 = N 2 0 + 41808 = N 0 0 + 41856 = N 1 0 + 41904 = N 3 0 + 41952 = N 2 0 + 42000 = N 0 0 + 42048 = N 1 0 + 42096 = N 2 0 + 42144 = N 3 0 + 42192 = N 4 0 + 42240 = N 1 0 + 42240 = N 5 0 + 42288 = N 1 0 + 42336 = N 1 0 + 42384 = N 1 0 + 42432 = N 2 0 + 42432 = N 5 0 + 42480 = N 2 0 + 42528 = N 2 0 + 42576 = N 2 0 + 42624 = N 3 0 + 42624 = N 5 0 + 42672 = N 3 0 + 42720 = N 3 0 + 42768 = N 3 0 + 42816 = N 4 0 + 42816 = N 5 0 + 42898 = N 3 0 + 42953 = N 2 0 + 43008 = N 1 0 + 43104 = N 0 0 + 43152 = N 3 0 + 43248 = N 2 0 + 43344 = N 1 0 + 43440 = N 4 0 + 43536 = N 3 0 + 43584 = N 2 0 + 43680 = N 1 0 + 43728 = N 0 0 + 43808 = N 3 0 + 43968 = N 1 0 + 44040 = N 2 0 + 44112 = N 4 0 + 44192 = N 3 0 + 44304 = N 0 0 + 44352 = N 1 0 + 44403 = N 2 0 + 44454 = N 3 0 + 44544 = N 2 0 + 44592 = N 3 0 + 44672 = N 4 0 + 44736 = N 3 0 + 44784 = N 2 0 + 44832 = N 1 0 + 44880 = N 0 0 + 44928 = N 4 0 + 44976 = N 2 0 + 45024 = N 3 0 + 45056 = N 4 0 + 45088 = N 3 0 + 45120 = N 2 0 + 45168 = N 1 0 + 45216 = N 0 0 + 45264 = N 4 0 + 45312 = N 0 0 + 45360 = N 1 0 + 45408 = N 3 0 + 45456 = N 0 0 + 45504 = N 1 0 + 45552 = N 2 0 + 45648 = N 3 0 + 45696 = N 1 0 + 45744 = N 2 0 + 45792 = N 4 0 + 45840 = N 1 0 + 45888 = N 3 0 + 45952 = N 1 0 + 45995 = N 2 0 + 46037 = N 0 0 + 46080 = N 2 0 + 46080 = S 2 1248 + 46128 = N 0 0 + 46176 = N 1 0 + 46224 = N 3 0 + 46272 = N 1 0 + 46320 = N 0 0 + 46368 = N 2 0 + 46416 = N 0 0 + 46464 = N 1 0 + 46512 = N 3 0 + 46560 = N 1 0 + 46608 = N 2 0 + 46656 = N 4 0 + 46704 = N 2 0 + 46800 = N 4 0 + 46848 = N 2 0 + 46896 = N 1 0 + 46944 = N 3 0 + 46992 = N 1 0 + 47040 = N 2 0 + 47088 = N 4 0 + 47136 = N 2 0 + 47184 = N 3 0 + 47232 = N 4 0 + 47280 = N 3 0 + 47376 = N 4 0 + 47424 = N 4 0 + 47520 = N 4 0 + 47568 = N 4 0 + 47664 = N 3 0 + 47712 = N 2 0 + 47760 = N 4 0 + 47808 = N 3 0 + 47856 = N 2 0 + 47904 = N 1 0 + 47952 = N 0 0 + 48000 = N 4 0 + 48048 = N 3 0 + 48096 = N 2 0 + 48144 = N 1 0 + 48192 = N 2 0 + 48240 = N 0 0 + 48288 = N 1 0 + 48336 = N 0 0 + 48384 = N 1 0 + 48480 = N 3 0 + 48528 = N 3 0 + 48576 = N 4 0 + 48960 = N 2 0 + 48960 = N 3 0 + 49056 = N 2 0 + 49056 = N 4 0 + 49152 = N 1 0 + 49200 = N 1 0 + 49248 = N 1 0 + 49296 = N 0 0 + 49392 = N 3 0 + 49392 = N 4 0 + 49488 = N 2 0 + 49488 = N 4 0 + 49584 = N 2 0 + 49584 = N 4 0 + 49728 = N 1 0 + 49728 = N 4 0 + 49824 = N 2 0 + 49824 = N 4 0 + 49920 = N 2 0 + 49920 = N 4 0 + 49968 = N 2 0 + 49968 = N 4 0 + 50064 = N 1 0 + 50064 = N 4 0 + 50160 = N 1 0 + 50160 = N 4 0 + 50256 = N 0 0 + 50256 = N 2 0 + 50352 = N 0 0 + 50352 = N 2 0 + 50448 = N 3 0 + 50496 = N 2 0 + 50592 = N 1 0 + 50640 = N 0 0 + 50736 = N 2 0 + 50832 = N 1 0 + 50928 = N 3 0 + 51024 = N 2 0 + 51072 = N 4 0 + 51120 = N 3 0 + 51168 = N 2 0 + 51216 = N 0 0 + 51264 = N 2 0 + 51312 = N 0 0 + 51360 = N 1 0 + 51408 = N 2 0 + 51456 = N 3 0 + 51504 = N 1 0 + 51552 = N 2 0 + 51600 = N 4 0 + 51648 = N 3 0 + 51744 = N 2 0 + 51792 = N 0 0 + 51840 = N 1 0 + 51936 = N 3 0 + 51968 = N 4 0 + 52032 = N 3 0 + 52032 = N 5 0 + 52064 = N 2 0 + 52096 = N 1 0 + 52128 = N 0 0 + 52176 = N 3 0 + 52224 = N 2 0 + 52320 = N 3 0 + 52368 = N 2 0 + 52416 = N 1 0 + 52480 = N 0 0 + 52544 = N 1 0 + 52632 = N 2 0 + 52688 = N 3 0 + 52744 = N 2 0 + 52800 = N 3 0 + 52864 = N 2 0 + 52928 = N 3 0 + 52992 = N 2 0 + 53056 = N 1 0 + 53120 = N 2 0 + 53184 = N 3 0 + 53248 = N 2 0 + 53312 = N 3 0 + 53376 = N 4 0 + 53440 = N 3 0 + 53504 = N 4 0 + 53568 = N 2 0 + 53632 = N 1 0 + 53696 = N 2 0 + 53760 = N 3 0 + 53824 = N 2 0 + 53888 = N 3 0 + 53952 = N 4 0 + 54016 = N 3 0 + 54080 = N 4 0 + 54192 = N 3 0 + 54240 = N 4 0 + 54288 = N 2 0 + 54336 = N 3 0 + 54432 = S 2 768 + 54480 = N 4 0 + 54528 = N 3 0 + 54576 = N 2 0 + 54624 = N 1 0 + 54672 = N 0 0 + 54720 = N 1 0 + 54768 = N 3 0 + 54816 = N 0 0 + 55008 = N 1 0 + 55008 = N 6 0 + 55056 = N 2 0 + 55056 = N 6 0 + 55104 = N 3 160 + 55104 = N 6 0 + 55200 = E soloend + 55296 = N 0 0 + 55344 = N 1 0 + 55392 = N 2 0 + 55440 = N 1 0 + 55488 = N 2 0 + 55584 = N 2 0 + 55632 = N 2 0 + 55680 = N 3 0 + 55728 = N 1 240 + 56064 = N 3 0 + 56112 = N 4 0 + 56160 = N 3 0 + 56256 = N 2 0 + 56352 = N 0 0 + 56400 = N 1 336 + 56832 = N 0 0 + 56880 = N 1 0 + 56928 = N 2 0 + 57024 = N 2 0 + 57120 = N 2 0 + 57168 = N 2 0 + 57216 = N 3 192 + 57600 = N 4 0 + 57648 = N 3 0 + 57696 = N 2 0 + 57744 = N 1 0 + 57792 = N 2 0 + 57840 = N 3 0 + 57888 = N 1 0 + 57936 = N 2 0 + 57984 = N 1 0 + 57984 = N 2 0 + 57984 = N 5 0 + 58032 = N 0 240 + 58032 = N 1 240 + 58032 = N 5 0 + 58464 = N 0 0 + 58512 = N 1 0 + 58560 = N 2 0 + 58608 = N 1 0 + 58656 = N 2 0 + 58704 = N 2 0 + 58752 = N 3 0 + 58800 = N 1 144 + 59040 = N 1 0 + 59088 = N 2 0 + 59136 = N 3 0 + 59184 = N 2 0 + 59232 = N 3 0 + 59328 = N 4 0 + 59424 = N 3 0 + 59472 = N 1 0 + 59520 = N 2 0 + 59568 = N 1 0 + 59616 = N 2 0 + 59904 = N 4 0 + 59952 = N 4 0 + 60000 = N 4 0 + 60048 = N 3 0 + 60096 = N 2 0 + 60144 = N 0 0 + 60192 = N 1 0 + 60240 = N 3 0 + 60288 = N 2 0 + 60384 = N 2 0 + 60432 = N 0 0 + 60480 = N 1 0 + 60528 = N 0 0 + 60576 = N 4 0 + 60624 = N 2 0 + 60672 = N 3 0 + 60720 = N 1 0 + 60768 = N 2 0 + 60816 = N 1 0 + 60864 = N 0 0 + 60912 = N 1 0 + 60960 = N 2 0 + 61008 = N 1 0 + 61056 = N 2 0 + 61104 = N 4 0 + 61152 = N 3 0 + 61200 = N 1 0 + 61248 = N 2 0 + 61296 = N 0 0 + 61344 = N 1 0 + 61440 = N 3 0 + 61440 = S 2 1536 + 61440 = E solo + 61464 = N 4 0 + 61536 = N 4 0 + 61632 = N 3 0 + 61680 = N 2 0 + 61728 = N 2 0 + 61776 = N 1 0 + 61824 = N 2 144 + 62016 = N 0 0 + 62112 = N 1 0 + 62208 = N 1 0 + 62304 = N 1 0 + 62400 = N 2 0 + 62496 = N 0 0 + 62544 = N 1 0 + 62568 = N 2 0 + 62640 = N 3 0 + 62688 = N 2 0 + 62784 = N 3 0 + 62880 = N 4 0 + 63168 = N 4 0 + 63216 = N 3 0 + 63264 = N 2 0 + 63312 = N 1 0 + 63360 = N 2 0 + 63408 = N 0 192 + 63840 = N 0 0 + 63936 = N 2 0 + 63984 = N 0 0 + 64032 = N 2 0 + 64080 = N 3 0 + 64176 = N 4 0 + 64224 = N 4 0 + 64272 = N 3 0 + 64320 = N 2 0 + 64368 = N 3 0 + 64416 = N 2 0 + 64448 = N 1 0 + 64480 = N 0 0 + 64512 = N 1 0 + 64560 = N 0 0 + 64608 = N 1 0 + 64656 = N 4 0 + 64704 = N 3 0 + 64752 = N 1 0 + 64800 = N 2 0 + 64848 = N 0 0 + 64896 = N 4 0 + 64944 = N 2 0 + 64992 = N 4 0 + 65040 = N 3 0 + 65088 = N 2 0 + 65136 = N 0 0 + 65184 = N 1 0 + 65232 = N 0 0 + 65280 = N 1 0 + 65328 = N 2 0 + 65376 = N 3 0 + 65424 = N 4 0 + 65472 = N 0 0 + 65520 = N 1 0 + 65568 = N 2 0 + 65616 = N 3 0 + 65712 = N 4 0 + 65808 = N 7 0 + 65856 = N 3 0 + 65904 = N 1 0 + 65952 = N 2 0 + 66000 = N 0 0 + 66048 = N 4 0 + 66096 = N 2 0 + 66144 = N 3 0 + 66192 = N 1 0 + 66240 = N 2 0 + 66288 = N 0 0 + 66336 = N 4 0 + 66384 = N 2 0 + 66432 = N 3 0 + 66480 = N 1 208 + 66720 = N 0 0 + 66816 = N 0 0 + 66816 = N 2 0 + 66912 = N 0 0 + 66912 = N 2 0 + 66960 = N 1 0 + 66960 = N 2 0 + 66960 = N 5 0 + 67008 = N 1 0 + 67008 = N 2 0 + 67104 = N 1 0 + 67104 = N 3 0 + 67136 = N 1 0 + 67136 = N 3 0 + 67168 = N 1 0 + 67168 = N 3 0 + 67200 = N 1 0 + 67200 = N 3 0 + 67296 = N 2 0 + 67296 = N 3 0 + 67328 = N 2 0 + 67328 = N 3 0 + 67360 = N 2 0 + 67360 = N 3 0 + 67392 = N 2 0 + 67392 = N 3 0 + 67488 = N 2 0 + 67536 = N 3 0 + 67584 = N 4 0 + 67680 = N 3 0 + 67728 = N 2 0 + 67776 = N 2 0 + 67808 = N 1 0 + 67840 = N 0 0 + 67872 = N 1 0 + 67968 = N 0 160 + 68160 = N 2 0 + 68160 = N 4 0 + 68256 = N 1 0 + 68352 = N 0 0 + 68448 = N 2 0 + 68448 = N 3 0 + 68544 = N 0 0 + 68640 = N 2 0 + 68640 = N 4 0 + 68736 = N 1 0 + 68832 = N 3 160 + 69024 = N 4 0 + 69216 = N 4 0 + 69248 = N 3 0 + 69280 = N 2 0 + 69312 = N 3 112 + 69456 = N 2 0 + 69504 = N 1 160 + 69696 = N 2 0 + 69696 = N 4 0 + 69792 = N 1 0 + 69888 = N 0 0 + 69888 = S 2 768 + 69984 = N 2 0 + 69984 = N 3 0 + 70080 = N 0 160 + 70176 = N 2 0 + 70272 = N 1 160 + 70368 = N 3 0 + 70464 = N 2 160 + 70560 = N 3 0 + 70656 = N 4 0 + 70688 = N 4 0 + 70720 = N 3 0 + 70752 = N 2 0 + 70784 = N 1 0 + 70816 = N 2 0 + 70848 = N 1 160 + 71040 = N 4 0 + 71072 = N 4 0 + 71104 = N 2 0 + 71136 = N 1 0 + 71168 = N 2 0 + 71200 = N 1 0 + 71232 = N 0 160 + 71424 = N 3 0 + 71456 = N 3 0 + 71488 = N 2 0 + 71520 = N 1 0 + 71552 = N 2 0 + 71584 = N 1 0 + 71616 = N 0 160 + 71808 = N 4 0 + 71904 = N 3 0 + 71936 = N 2 0 + 71968 = N 1 0 + 72000 = N 0 160 + 72192 = N 1 256 + 72288 = N 3 0 + 72288 = N 4 0 + 72480 = N 0 160 + 72672 = N 2 0 + 72672 = N 3 0 + 72864 = N 1 352 + 73056 = N 3 0 + 73056 = N 4 0 + 73248 = N 2 0 + 73344 = N 2 160 + 73536 = N 3 0 + 73536 = N 5 0 + 73728 = N 4 0 + 73760 = N 3 0 + 73792 = N 2 0 + 73824 = N 3 0 + 73856 = N 2 0 + 73888 = N 1 0 + 73920 = N 2 0 + 73952 = N 1 0 + 73984 = N 0 0 + 74016 = N 3 0 + 74048 = N 2 0 + 74080 = N 1 0 + 74112 = N 0 0 + 74160 = N 0 0 + 74208 = N 0 0 + 74256 = N 1 0 + 74304 = N 2 0 + 74400 = N 3 0 + 74496 = N 2 0 + 74592 = N 3 0 + 74688 = N 4 0 + 74784 = N 2 0 + 74880 = N 3 0 + 74928 = N 4 0 + 74976 = N 3 0 + 75024 = N 4 0 + 75072 = N 3 0 + 75264 = N 4 0 + 75296 = N 3 0 + 75328 = N 2 0 + 75360 = N 3 0 + 75392 = N 2 0 + 75424 = N 1 0 + 75456 = N 3 0 + 75488 = N 2 0 + 75520 = N 1 0 + 75552 = N 0 0 + 75600 = N 4 0 + 75648 = N 3 0 + 75696 = N 2 0 + 75744 = N 3 0 + 75776 = N 2 0 + 75808 = N 2 0 + 75840 = N 1 0 + 75872 = N 0 0 + 75936 = N 1 160 + 75936 = N 5 0 + 76128 = N 0 0 + 76224 = N 1 0 + 76320 = N 2 0 + 76416 = N 3 0 + 76448 = N 4 128 + 76608 = N 3 256 + 76896 = N 2 0 + 76928 = N 4 0 + 76960 = N 2 0 + 76992 = N 2 0 + 77040 = N 3 0 + 77088 = N 4 0 + 77136 = N 2 0 + 77184 = N 3 0 + 77232 = N 2 0 + 77280 = N 1 0 + 77328 = N 0 0 + 77376 = N 1 0 + 77424 = N 2 0 + 77472 = N 1 0 + 77520 = N 0 0 + 77568 = N 3 0 + 77568 = S 2 768 + 77616 = N 4 0 + 77664 = N 3 0 + 77712 = N 2 0 + 77760 = N 3 0 + 77808 = N 1 0 + 77856 = N 3 0 + 77904 = N 2 0 + 77952 = N 3 0 + 77984 = N 2 0 + 78016 = N 3 0 + 78048 = N 2 0 + 78096 = N 2 0 + 78144 = N 2 160 + 78336 = N 1 0 + 78368 = N 1 0 + 78400 = N 1 0 + 78432 = N 1 0 + 78464 = N 1 0 + 78496 = N 1 0 + 78528 = N 0 0 + 78528 = N 5 0 + 78560 = N 0 0 + 78592 = N 0 0 + 78624 = N 0 0 + 78656 = N 0 0 + 78688 = N 0 0 + 78720 = N 1 0 + 78720 = N 5 0 + 78752 = N 1 0 + 78784 = N 1 0 + 78816 = N 1 0 + 78848 = N 1 0 + 78880 = N 1 0 + 78912 = N 2 0 + 78912 = N 5 0 + 78944 = N 2 0 + 78976 = N 2 0 + 79008 = N 2 0 + 79040 = N 2 0 + 79072 = N 2 0 + 79104 = N 3 0 + 79104 = N 5 0 + 79136 = N 3 0 + 79168 = N 3 0 + 79200 = N 3 0 + 79232 = N 3 0 + 79264 = N 3 0 + 79296 = N 2 0 + 79296 = N 5 0 + 79328 = N 2 0 + 79360 = N 2 0 + 79392 = N 2 0 + 79424 = N 2 0 + 79456 = N 2 0 + 79488 = N 3 0 + 79488 = N 5 0 + 79523 = N 3 0 + 79584 = N 3 0 + 79872 = N 4 0 + 79920 = N 3 0 + 79968 = N 0 0 + 80016 = N 3 0 + 80064 = N 1 0 + 80112 = N 3 0 + 80160 = N 2 0 + 80208 = N 0 0 + 80256 = N 4 0 + 80304 = N 1 0 + 80352 = N 3 0 + 80400 = N 2 0 + 80448 = N 0 0 + 80496 = N 3 0 + 80544 = N 0 0 + 80592 = N 1 0 + 80640 = N 2 0 + 80688 = N 0 0 + 80736 = N 1 0 + 80784 = N 0 0 + 80832 = N 3 0 + 80880 = N 1 0 + 80928 = N 2 0 + 80976 = N 1 0 + 81024 = N 2 0 + 81120 = N 3 0 + 81216 = N 4 0 + 81312 = N 2 0 + 81408 = N 2 0 + 81456 = N 3 112 + 81600 = N 2 0 + 81648 = N 1 0 + 81696 = N 0 0 + 81744 = N 1 0 + 81792 = N 4 160 + 81984 = N 3 0 + 82032 = N 2 0 + 82080 = N 1 0 + 82128 = N 0 0 + 82176 = N 1 0 + 82224 = N 2 112 + 82368 = N 3 0 + 82416 = N 2 0 + 82464 = N 1 0 + 82512 = N 0 0 + 82560 = N 2 0 + 82608 = N 3 112 + 82752 = N 4 0 + 82800 = N 2 0 + 82848 = N 1 0 + 82896 = N 0 0 + 82944 = N 3 0 + 82992 = N 4 112 + 83136 = N 3 0 + 83184 = N 2 0 + 83232 = N 1 0 + 83280 = N 0 0 + 83328 = N 2 0 + 83376 = N 3 112 + 83520 = N 4 0 + 83568 = N 3 0 + 83616 = N 2 0 + 83664 = N 0 0 + 83712 = N 1 0 + 83760 = N 2 112 + 83904 = N 4 0 + 83952 = N 3 0 + 84000 = N 2 0 + 84048 = N 1 0 + 84096 = N 3 0 + 84144 = N 4 0 + 84192 = N 3 0 + 84240 = N 4 0 + 84288 = N 3 0 + 84384 = N 7 0 + 84480 = N 3 0 + 84480 = N 4 0 + 84576 = N 2 0 + 84576 = N 4 0 + 84576 = N 5 0 + 84672 = N 2 0 + 84672 = N 4 0 + 84768 = N 2 0 + 84768 = N 3 0 + 84768 = N 5 0 + 84864 = N 2 0 + 84864 = N 3 0 + 84960 = N 1 0 + 84960 = N 3 0 + 84960 = N 5 0 + 85056 = N 1 0 + 85056 = N 3 0 + 85152 = N 1 0 + 85152 = N 2 0 + 85152 = N 5 0 + 85248 = N 1 0 + 85248 = N 2 0 + 85344 = N 0 0 + 85344 = N 2 0 + 85344 = N 5 0 + 85440 = N 0 160 + 85440 = N 2 160 + 85632 = N 2 0 + 85632 = N 3 0 + 85632 = N 5 0 + 85680 = N 3 0 + 85680 = N 4 0 + 85680 = N 5 0 + 85824 = E soloend + 86016 = N 1 0 + 86016 = S 2 1536 + 86112 = N 3 0 + 86208 = N 0 0 + 86304 = N 2 0 + 86304 = N 4 0 + 86400 = N 1 0 + 86496 = N 2 0 + 86496 = N 4 0 + 86592 = N 0 0 + 86688 = N 4 0 + 86784 = N 1 0 + 86880 = N 2 0 + 86880 = N 3 0 + 86976 = N 0 0 + 87072 = N 2 0 + 87072 = N 3 0 + 87168 = N 1 0 + 87264 = N 2 0 + 87264 = N 3 0 + 87360 = N 0 0 + 87456 = N 1 0 + 87456 = N 5 0 + 87552 = N 1 0 + 87648 = N 2 0 + 87648 = N 4 0 + 87744 = N 0 0 + 87840 = N 3 0 + 87936 = N 1 0 + 88032 = N 2 0 + 88032 = N 4 0 + 88320 = N 2 0 + 88320 = N 4 0 + 88512 = N 2 160 + 88512 = N 4 160 + 88704 = N 1 160 + 88896 = N 2 160 + 88896 = N 3 160 + 89088 = N 0 0 + 89232 = N 1 0 + 89280 = N 2 0 + 89328 = N 3 0 + 89376 = N 2 0 + 89472 = N 4 0 + 89520 = N 2 0 + 89568 = N 3 0 + 89664 = N 3 0 + 89712 = N 1 0 + 89760 = N 3 0 + 89808 = N 1 0 + 89856 = N 2 0 + 89904 = N 0 0 + 89952 = N 4 0 + 90000 = N 2 0 + 90048 = N 3 0 + 90096 = N 2 0 + 90144 = N 3 0 + 90192 = N 1 0 + 90240 = N 2 0 + 90288 = N 3 0 + 90336 = N 0 0 + 90384 = N 1 0 + 90432 = N 2 0 + 90480 = N 3 0 + 90576 = N 1 0 + 90624 = N 0 0 + 90672 = N 1 0 + 90720 = N 2 0 + 90768 = N 1 0 + 90816 = N 2 0 + 90864 = N 3 0 + 90912 = N 1 0 + 90960 = N 2 0 + 91008 = N 1 0 + 91056 = N 2 0 + 91104 = N 3 0 + 91152 = N 4 0 + 91200 = N 3 0 + 91248 = N 0 0 + 91296 = N 2 0 + 91344 = N 3 0 + 91392 = N 2 0 + 91440 = N 1 0 + 91488 = N 0 0 + 91536 = N 3 0 + 91584 = N 2 0 + 91632 = N 4 0 + 91680 = N 3 0 + 91728 = N 1 0 + 91776 = N 2 0 + 91824 = N 0 0 + 91872 = N 3 0 + 91920 = N 1 0 + 91968 = N 2 0 + 92016 = N 0 0 + 92112 = N 2 0 + 92208 = N 1 0 + 92304 = N 0 0 + 92352 = N 1 0 + 92400 = N 2 0 + 92448 = N 3 0 + 92496 = N 4 0 + 92544 = N 1 0 + 92592 = N 2 0 + 92640 = N 4 0 + 92688 = N 2 0 + 92736 = N 1 0 + 92784 = N 4 0 + 92832 = N 1 0 + 92928 = N 4 0 + 92976 = N 3 0 + 93072 = N 4 0 + 93120 = N 2 0 + 93264 = N 3 0 + 93360 = N 4 0 + 93408 = N 1 0 + 93504 = N 0 0 + 93552 = N 1 0 + 93600 = N 2 0 + 93648 = N 1 0 + 93696 = N 2 0 + 93696 = S 2 960 + 93792 = N 1 0 + 93840 = N 2 0 + 93888 = N 3 0 + 93984 = N 4 0 + 94080 = N 0 0 + 94176 = N 1 0 + 94224 = N 2 0 + 94272 = N 3 0 + 94368 = N 4 0 + 94464 = N 2 192 + 94992 = N 1 0 + 95040 = N 2 0 + 95088 = N 1 0 + 95136 = N 2 0 + 95184 = N 3 0 + 95232 = N 4 0 + 95280 = N 2 0 + 95328 = N 4 0 + 95376 = N 4 0 + 95424 = N 3 0 + 95472 = N 2 0 + 95520 = N 1 0 + 95568 = N 1 0 + 95616 = N 2 0 + 95664 = N 1 0 + 95712 = N 3 0 + 95760 = N 3 0 + 95808 = N 2 0 + 95856 = N 1 0 + 95904 = N 2 0 + 95952 = N 0 0 + 96000 = N 1 0 + 96096 = N 0 0 + 96144 = N 1 0 + 96192 = N 2 0 + 96240 = N 3 0 + 96288 = N 2 0 + 96384 = N 3 0 + 96672 = N 3 0 + 96720 = N 3 0 + 96768 = N 4 0 + 96816 = N 7 0 + 96864 = N 4 0 + 96912 = N 4 0 + 96960 = N 3 0 + 97008 = N 2 0 + 97056 = N 1 0 + 97104 = N 1 0 + 97152 = N 2 0 + 97200 = N 1 0 + 97248 = N 3 0 + 97296 = N 3 0 + 97344 = N 2 0 + 97392 = N 1 0 + 97440 = N 2 0 + 97488 = N 0 0 + 97536 = N 1 0 + 97632 = N 1 0 + 97680 = N 2 0 + 97728 = N 3 0 + 97776 = N 2 0 + 97824 = N 3 0 + 97920 = N 4 0 + 98160 = N 2 0 + 98208 = N 1 0 + 98256 = N 1 0 + 98304 = N 2 0 + 98352 = N 3 0 + 98400 = N 4 0 + 98496 = N 1 0 + 98544 = N 3 0 + 98592 = N 4 0 + 98640 = N 3 0 + 98688 = N 1 0 + 98736 = N 2 0 + 98784 = N 4 0 + 98832 = N 2 0 + 98880 = N 1 0 + 98928 = N 2 0 + 98976 = N 3 0 + 99072 = N 0 0 + 99120 = N 2 0 + 99168 = N 3 0 + 99216 = N 2 0 + 99264 = N 0 0 + 99312 = N 1 0 + 99360 = N 3 0 + 99408 = N 1 0 + 99456 = N 3 0 + 99504 = N 1 0 + 99552 = N 3 0 + 99648 = N 0 192 + 99888 = N 0 0 + 99936 = N 1 0 + 100032 = N 2 0 + 100128 = N 3 0 + 100224 = N 3 0 + 100320 = N 4 0 + 100320 = N 5 0 + 100416 = N 2 0 + 100512 = N 1 0 + 100608 = N 2 0 + 101376 = N 1 0 + 101376 = S 2 768 + 101424 = N 2 0 + 101472 = N 3 0 + 101520 = N 2 0 + 101568 = N 3 0 + 101616 = N 3 0 + 101664 = N 1 0 + 101712 = N 2 0 + 101760 = N 3 0 + 101808 = N 2 0 + 101856 = N 3 0 + 101904 = N 3 0 + 101952 = N 1 0 + 102000 = N 2 0 + 102048 = N 3 0 + 102096 = N 2 0 + 102144 = N 3 0 + 102192 = N 3 0 + 102240 = N 1 0 + 102288 = N 2 0 + 102336 = N 3 0 + 102384 = N 2 0 + 102432 = N 3 0 + 102480 = N 3 0 + 102528 = N 1 0 + 102576 = N 2 0 + 102624 = N 3 0 + 102672 = N 2 0 + 102720 = N 3 0 + 102768 = N 4 0 + 102816 = N 3 0 + 102864 = N 2 0 + 102912 = N 0 0 + 102960 = N 2 0 + 103008 = N 3 0 + 103056 = N 2 0 + 103104 = N 3 0 + 103152 = N 3 0 + 103200 = N 0 0 + 103248 = N 2 0 + 103296 = N 3 0 + 103344 = N 2 0 + 103392 = N 3 0 + 103440 = N 3 0 + 103488 = N 0 0 + 103536 = N 1 0 + 103584 = N 2 0 + 103632 = N 1 0 + 103680 = N 2 0 + 103728 = N 3 0 + 103776 = N 0 0 + 103824 = N 2 0 + 103872 = N 3 0 + 103920 = N 2 0 + 103968 = N 3 0 + 104016 = N 3 0 + 104064 = N 0 0 + 104112 = N 2 0 + 104160 = N 3 0 + 104208 = N 2 0 + 104256 = N 3 0 + 104304 = N 4 0 + 104352 = N 3 0 + 104400 = N 2 0 + 104448 = N 0 0 + 104496 = N 1 0 + 104544 = N 3 0 + 104592 = N 1 0 + 104640 = N 3 0 + 104688 = N 3 0 + 104736 = N 0 0 + 104784 = N 1 0 + 104832 = N 3 0 + 104880 = N 1 0 + 104928 = N 3 0 + 104976 = N 3 0 + 105024 = N 0 0 + 105072 = N 1 0 + 105120 = N 3 0 + 105168 = N 1 0 + 105216 = N 3 0 + 105264 = N 3 0 + 105312 = N 0 0 + 105360 = N 1 0 + 105408 = N 3 0 + 105456 = N 1 0 + 105504 = N 3 0 + 105552 = N 3 0 + 105600 = N 0 0 + 105648 = N 1 0 + 105696 = N 3 0 + 105744 = N 1 0 + 105792 = N 3 0 + 105840 = N 4 0 + 105888 = N 3 0 + 105936 = N 2 0 + 105984 = N 1 0 + 106032 = N 2 208 + 106272 = N 1 0 + 106272 = N 5 0 + 106368 = N 0 192 + 106368 = N 5 0 + 107520 = N 7 0 + 107568 = N 0 0 + 107568 = N 5 0 + 107664 = N 1 0 + 107760 = N 2 0 + 107856 = N 3 0 + 107904 = N 4 0 + 107952 = N 3 0 + 108000 = N 2 0 + 108048 = N 4 0 + 108096 = N 3 112 + 108240 = N 2 0 + 108288 = S 2 768 + 108336 = N 0 0 + 108432 = N 1 0 + 108528 = N 2 0 + 108624 = N 3 0 + 108672 = N 2 0 + 108720 = N 4 0 + 108768 = N 3 112 + 108912 = N 1 0 + 109104 = N 4 0 + 109200 = N 3 0 + 109248 = N 1 0 + 109296 = N 0 0 + 109392 = N 4 0 + 109488 = N 3 0 + 109536 = N 2 0 + 109584 = N 0 0 + 109680 = N 4 0 + 109776 = N 3 0 + 109824 = N 2 0 + 109872 = N 1 0 + 109968 = N 4 0 + 110016 = N 3 0 + 110064 = N 2 0 + 110112 = N 1 0 + 110160 = N 2 0 + 110208 = N 1 0 + 110256 = N 3 0 + 110304 = N 1 0 + 110640 = N 0 0 + 110736 = N 1 0 + 110832 = N 2 0 + 110928 = N 3 0 + 110976 = N 4 0 + 111024 = N 3 0 + 111072 = N 2 0 + 111120 = N 4 0 + 111168 = N 3 112 + 111312 = N 4 0 + 111408 = N 0 0 + 111504 = N 1 0 + 111600 = N 2 0 + 111648 = N 3 0 + 111696 = N 2 0 + 111744 = N 1 0 + 111792 = N 3 0 + 111840 = N 2 112 + 111984 = N 4 0 + 112176 = N 3 0 + 112224 = N 4 0 + 112272 = N 3 0 + 112320 = N 2 0 + 112368 = N 1 0 + 112464 = N 2 0 + 112560 = N 3 0 + 112608 = N 2 0 + 112656 = N 0 0 + 112704 = N 1 0 + 112752 = N 0 0 + 112848 = N 4 0 + 112896 = N 3 0 + 112944 = N 2 0 + 112992 = N 1 0 + 113040 = N 0 0 + 113088 = N 1 0 + 113136 = N 3 0 + 113184 = N 0 0 + 113424 = N 1 0 + 113424 = N 6 0 + 113472 = N 2 0 + 113472 = N 6 0 + 113664 = N 0 0 + 113712 = N 1 0 + 113760 = N 2 0 + 113856 = N 2 0 + 113952 = N 2 0 + 114000 = N 2 0 + 114048 = N 3 0 + 114096 = N 1 240 + 114432 = N 4 0 + 114528 = N 3 0 + 114624 = N 2 0 + 114720 = N 0 0 + 114768 = N 1 336 + 115200 = N 0 0 + 115248 = N 1 0 + 115296 = N 2 0 + 115344 = N 1 0 + 115392 = N 2 0 + 115488 = N 2 0 + 115584 = N 3 0 + 115632 = N 1 240 + 116016 = N 2 0 + 116112 = N 3 0 + 116160 = N 4 0 + 116256 = N 1 0 + 116320 = N 2 0 + 116384 = N 3 0 + 116448 = N 0 240 + 116736 = N 0 0 + 116736 = S 2 1536 + 116784 = N 1 0 + 116832 = N 2 0 + 116928 = N 2 0 + 117024 = N 2 0 + 117072 = N 2 0 + 117120 = N 3 0 + 117168 = N 1 144 + 117408 = N 7 0 + 117504 = N 1 0 + 117552 = N 2 0 + 117600 = N 3 0 + 117648 = N 2 0 + 117696 = N 3 0 + 117792 = N 3 0 + 117840 = N 4 192 + 118272 = N 0 0 + 118336 = N 1 0 + 118400 = N 2 0 + 118496 = N 1 0 + 118560 = N 2 0 + 118624 = N 3 0 + 118688 = N 0 0 + 118752 = N 2 0 + 118816 = N 3 0 + 118880 = N 0 0 + 118944 = N 1 0 + 118992 = N 4 0 + 119040 = N 1 0 + 119088 = N 2 0 + 119136 = N 3 0 + 119184 = N 1 0 + 119232 = N 2 0 + 119280 = N 3 0 + 119328 = N 2 0 + 119376 = N 4 240 + 119808 = N 7 0 + 119856 = N 0 0 + 119856 = N 5 0 + 119952 = N 1 0 + 120048 = N 2 0 + 120144 = N 3 0 + 120192 = N 4 0 + 120240 = N 3 0 + 120288 = N 2 0 + 120336 = N 4 0 + 120384 = N 3 112 + 120528 = N 2 0 + 120624 = N 0 0 + 120720 = N 1 0 + 120816 = N 2 0 + 120864 = N 3 0 + 120912 = N 2 0 + 120960 = N 1 0 + 121008 = N 3 0 + 121056 = N 2 112 + 121200 = N 1 0 + 121392 = N 4 0 + 121488 = N 3 0 + 121536 = N 2 0 + 121584 = N 1 0 + 121680 = N 3 0 + 121776 = N 2 0 + 121824 = N 1 0 + 121872 = N 0 0 + 122064 = N 2 0 + 122112 = N 3 0 + 122144 = N 4 0 + 122176 = N 3 0 + 122208 = N 2 0 + 122240 = N 3 0 + 122272 = N 2 0 + 122304 = N 1 0 + 122336 = N 2 0 + 122368 = N 1 0 + 122400 = N 0 0 + 122880 = N 7 0 + 122928 = N 0 0 + 122928 = N 5 0 + 123024 = N 1 0 + 123120 = N 2 0 + 123216 = N 3 0 + 123264 = N 4 0 + 123312 = N 3 0 + 123360 = N 2 0 + 123408 = N 4 0 + 123456 = N 3 112 + 123600 = N 4 0 + 123696 = N 0 0 + 123792 = N 1 0 + 123888 = N 2 0 + 123936 = N 3 0 + 123984 = N 2 0 + 124032 = N 1 0 + 124080 = N 3 0 + 124128 = N 2 112 + 124272 = N 4 0 + 124464 = N 3 0 + 124512 = N 4 0 + 124560 = N 3 0 + 124608 = N 2 0 + 124656 = N 1 0 + 124752 = N 2 0 + 124848 = N 3 0 + 124896 = N 2 0 + 124944 = N 0 0 + 124992 = N 1 0 + 125040 = N 0 0 + 125136 = N 4 0 + 125184 = N 3 0 + 125232 = N 2 0 + 125280 = N 1 0 + 125328 = N 0 0 + 125376 = N 1 0 + 125424 = N 3 0 + 125472 = N 0 0 + 125904 = N 4 0 + 125952 = N 3 0 + 126000 = N 2 0 + 126048 = N 1 0 + 126096 = N 0 0 + 126144 = N 1 0 + 126192 = N 3 0 + 126240 = N 0 0 + 126672 = N 3 0 + 126720 = N 2 0 + 126768 = N 1 0 + 126912 = N 2 0 + 126960 = N 3 0 + 127008 = N 0 0 + 127440 = N 4 0 + 127488 = N 3 0 + 127536 = N 2 0 + 127584 = N 1 0 + 127632 = N 0 0 + 127680 = N 1 0 + 127728 = N 3 0 + 127968 = N 4 1824 + 127968 = N 6 0 +} +[HardSingle] +{ + 1584 = N 0 0 + 1680 = N 1 0 + 1776 = N 2 0 + 1872 = N 3 0 + 1920 = N 4 0 + 1968 = N 3 0 + 2016 = N 2 0 + 2064 = N 4 0 + 2112 = N 3 112 + 2256 = N 2 0 + 2352 = N 0 0 + 2448 = N 1 0 + 2544 = N 2 0 + 2592 = N 3 0 + 2640 = N 2 0 + 2688 = N 1 0 + 2736 = N 3 0 + 2784 = N 2 112 + 2928 = N 1 0 + 3072 = N 4 0 + 3072 = S 2 768 + 3120 = N 3 0 + 3168 = N 2 0 + 3216 = N 3 0 + 3264 = N 2 0 + 3312 = N 1 0 + 3360 = N 2 0 + 3408 = N 1 0 + 3456 = N 0 192 + 3840 = N 4 0 + 3936 = N 3 0 + 4032 = N 2 0 + 4128 = N 1 0 + 4224 = N 0 352 + 4608 = N 1 640 + 5280 = N 2 0 + 5328 = N 3 0 + 5376 = N 2 0 + 5472 = N 2 0 + 5520 = N 3 0 + 5568 = N 2 384 + 6192 = N 0 0 + 6288 = N 1 0 + 6384 = N 2 0 + 6480 = N 3 0 + 6528 = N 4 0 + 6576 = N 3 0 + 6624 = N 2 0 + 6672 = N 4 0 + 6720 = N 3 112 + 6864 = N 2 0 + 6960 = N 0 0 + 7056 = N 1 0 + 7152 = N 2 0 + 7200 = N 3 0 + 7248 = N 2 0 + 7296 = N 1 0 + 7344 = N 3 0 + 7392 = N 2 112 + 7536 = N 1 0 + 7728 = N 4 0 + 7824 = N 3 0 + 7872 = N 2 0 + 7920 = N 1 0 + 8016 = N 3 0 + 8112 = N 2 0 + 8160 = N 1 0 + 8208 = N 0 96 + 8448 = N 4 0 + 8496 = N 3 0 + 8544 = N 2 0 + 8592 = N 3 0 + 8640 = N 2 0 + 8688 = N 1 0 + 8736 = N 0 0 + 9264 = N 0 0 + 9360 = N 1 0 + 9456 = N 2 0 + 9552 = N 3 0 + 9600 = N 4 0 + 9648 = N 3 0 + 9696 = N 2 0 + 9744 = N 4 0 + 9792 = N 3 112 + 9936 = N 4 0 + 9984 = S 2 768 + 10032 = N 0 0 + 10128 = N 1 0 + 10224 = N 2 0 + 10272 = N 3 0 + 10320 = N 2 0 + 10368 = N 1 0 + 10416 = N 3 0 + 10464 = N 2 112 + 10608 = N 4 0 + 10608 = N 5 0 + 10800 = N 3 0 + 10848 = N 4 0 + 10896 = N 3 0 + 10944 = N 2 0 + 11088 = N 1 0 + 11184 = N 2 0 + 11232 = N 1 0 + 11280 = N 0 0 + 11328 = N 1 0 + 11472 = N 4 0 + 11520 = N 4 0 + 11568 = N 3 0 + 11616 = N 2 0 + 11664 = N 1 0 + 11712 = N 3 0 + 11760 = N 2 0 + 11808 = N 1 256 + 12096 = N 0 160 + 12096 = N 5 0 + 12336 = N 0 0 + 12432 = N 1 0 + 12528 = N 2 0 + 12624 = N 3 0 + 12672 = N 4 0 + 12720 = N 3 0 + 12768 = N 2 0 + 12816 = N 4 0 + 12864 = N 3 112 + 13008 = N 2 0 + 13104 = N 0 0 + 13200 = N 1 0 + 13296 = N 2 0 + 13344 = N 3 0 + 13392 = N 2 0 + 13440 = N 1 0 + 13488 = N 3 0 + 13536 = N 2 0 + 13680 = N 1 0 + 13872 = N 4 0 + 13968 = N 3 0 + 14016 = N 2 0 + 14064 = N 1 0 + 14160 = N 3 0 + 14256 = N 2 0 + 14304 = N 1 0 + 14352 = N 0 0 + 14592 = N 4 0 + 14640 = N 3 0 + 14688 = N 2 0 + 14736 = N 3 0 + 14784 = N 2 0 + 14832 = N 1 0 + 14880 = N 0 0 + 15408 = N 0 0 + 15504 = N 1 0 + 15600 = N 2 0 + 15696 = N 3 0 + 15744 = N 4 0 + 15792 = N 3 0 + 15840 = N 2 0 + 15888 = N 4 0 + 15936 = N 3 112 + 16080 = N 4 0 + 16176 = N 0 0 + 16272 = N 1 0 + 16368 = N 2 0 + 16416 = N 3 0 + 16464 = N 2 0 + 16512 = N 1 0 + 16560 = N 3 0 + 16608 = N 2 112 + 16752 = N 4 0 + 16896 = S 2 1152 + 16944 = N 3 0 + 16992 = N 4 0 + 17040 = N 3 0 + 17088 = N 2 0 + 17232 = N 1 0 + 17328 = N 2 0 + 17376 = N 1 0 + 17424 = N 0 0 + 17472 = N 1 0 + 17616 = N 4 0 + 17664 = N 3 0 + 17712 = N 2 0 + 17760 = N 1 0 + 17856 = N 1 0 + 17904 = N 2 0 + 17952 = N 0 0 + 18432 = N 0 0 + 18480 = N 1 0 + 18528 = N 2 0 + 18624 = N 2 0 + 18720 = N 2 0 + 18816 = N 3 0 + 18864 = N 1 240 + 19200 = N 3 0 + 19248 = N 4 0 + 19296 = N 3 0 + 19392 = N 2 0 + 19488 = N 0 0 + 19536 = N 1 400 + 19968 = N 0 0 + 20016 = N 1 0 + 20064 = N 2 0 + 20160 = N 1 0 + 20256 = N 2 0 + 20352 = N 3 0 + 20400 = N 1 240 + 20832 = N 2 0 + 20880 = N 3 0 + 20928 = N 4 0 + 21024 = N 2 0 + 21120 = N 3 0 + 21168 = N 0 240 + 21504 = N 0 0 + 21552 = N 1 0 + 21600 = N 2 0 + 21696 = N 2 0 + 21792 = N 2 0 + 21888 = N 3 0 + 21936 = N 1 144 + 22272 = N 1 0 + 22320 = N 2 0 + 22368 = N 3 0 + 22464 = N 3 0 + 22560 = N 3 0 + 22608 = N 4 240 + 23040 = N 0 0 + 23136 = N 2 0 + 23184 = N 0 0 + 23280 = N 2 0 + 23328 = N 1 0 + 23424 = N 3 0 + 23472 = N 1 0 + 23568 = N 3 0 + 23616 = N 2 0 + 23712 = N 4 0 + 23760 = N 2 0 + 23856 = N 4 0 + 23904 = N 3 0 + 24000 = N 3 0 + 24096 = N 4 0 + 24144 = N 3 240 + 24144 = N 4 240 + 24576 = S 2 768 + 24624 = N 0 0 + 24720 = N 1 0 + 24816 = N 2 0 + 24912 = N 3 0 + 24960 = N 4 0 + 25008 = N 3 0 + 25056 = N 2 0 + 25104 = N 4 0 + 25152 = N 3 112 + 25296 = N 2 0 + 25392 = N 0 0 + 25488 = N 1 0 + 25584 = N 2 0 + 25632 = N 3 0 + 25680 = N 2 0 + 25728 = N 1 0 + 25776 = N 3 0 + 25824 = N 2 112 + 25968 = N 1 0 + 26160 = N 3 0 + 26208 = N 4 0 + 26256 = N 3 0 + 26304 = N 2 0 + 26352 = N 1 0 + 26448 = N 3 0 + 26544 = N 2 0 + 26592 = N 1 0 + 26640 = N 0 96 + 26880 = N 4 0 + 26928 = N 3 0 + 26976 = N 2 0 + 27024 = N 3 0 + 27072 = N 2 0 + 27120 = N 1 0 + 27168 = N 0 0 + 27696 = N 0 0 + 27792 = N 1 0 + 27888 = N 2 0 + 27984 = N 3 0 + 28032 = N 4 0 + 28080 = N 3 0 + 28128 = N 2 0 + 28176 = N 4 0 + 28224 = N 3 112 + 28368 = N 4 0 + 28464 = N 0 0 + 28560 = N 1 0 + 28656 = N 2 0 + 28704 = N 3 0 + 28752 = N 2 0 + 28800 = N 1 0 + 28848 = N 3 0 + 28896 = N 2 112 + 29040 = N 4 0 + 29232 = N 3 0 + 29280 = N 4 0 + 29328 = N 3 0 + 29376 = N 2 0 + 29520 = N 1 0 + 29616 = N 2 0 + 29664 = N 1 0 + 29712 = N 0 0 + 29760 = N 1 0 + 29904 = N 4 0 + 29952 = N 3 0 + 30000 = N 2 0 + 30048 = N 1 0 + 30144 = N 1 0 + 30192 = N 2 0 + 30240 = N 0 0 + 30384 = N 1 0 + 30384 = E solo + 30480 = N 2 0 + 30576 = N 0 0 + 30672 = N 1 0 + 30768 = N 3 0 + 30768 = N 6 0 + 30816 = N 4 0 + 30816 = N 6 0 + 30864 = N 3 0 + 30864 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 30960 = N 3 0 + 30960 = N 6 0 + 31008 = N 2 0 + 31008 = N 6 0 + 31056 = N 1 0 + 31056 = N 6 0 + 31104 = N 2 0 + 31104 = N 6 0 + 31152 = N 1 0 + 31152 = N 6 0 + 31200 = N 0 0 + 31200 = N 6 0 + 31248 = N 1 0 + 31248 = N 6 0 + 31296 = N 0 0 + 31296 = N 6 0 + 31440 = N 3 0 + 31488 = N 2 0 + 31488 = S 2 576 + 31536 = N 3 0 + 31584 = N 4 0 + 31632 = N 3 0 + 31680 = N 2 0 + 31728 = N 1 0 + 31776 = N 0 0 + 31872 = N 1 0 + 31920 = N 0 0 + 32160 = N 0 0 + 32208 = N 1 0 + 32256 = N 0 0 + 32352 = N 3 0 + 32400 = N 3 0 + 32448 = N 2 0 + 32544 = N 1 0 + 32640 = N 1 0 + 32688 = N 2 0 + 32736 = N 3 0 + 32784 = N 4 0 + 32832 = N 3 0 + 32880 = N 1 0 + 32928 = N 2 0 + 33024 = N 1 0 + 33120 = N 0 0 + 33168 = N 1 0 + 33216 = N 2 0 + 33264 = N 1 0 + 33312 = N 2 0 + 33360 = N 3 0 + 33408 = N 2 0 + 33504 = N 1 0 + 33552 = N 4 0 + 33648 = N 3 0 + 33696 = N 2 0 + 33744 = N 1 0 + 33792 = N 0 0 + 33840 = N 3 0 + 33888 = N 2 0 + 33936 = N 1 0 + 33984 = N 0 0 + 34032 = N 2 0 + 34080 = N 1 0 + 34128 = N 0 0 + 34176 = N 1 0 + 34224 = N 2 0 + 34320 = N 4 0 + 34368 = N 1 0 + 34416 = N 2 0 + 34464 = N 3 0 + 34512 = N 4 0 + 34560 = N 3 0 + 34656 = N 1 0 + 34704 = N 3 0 + 34752 = N 2 0 + 34800 = N 1 0 + 34896 = N 2 0 + 34944 = N 3 0 + 35040 = N 2 0 + 35088 = N 3 0 + 35232 = N 2 0 + 35280 = N 3 0 + 35360 = N 2 0 + 35424 = N 3 0 + 35488 = N 4 0 + 35664 = N 2 0 + 35712 = N 1 0 + 35904 = N 2 0 + 35952 = N 4 0 + 36048 = N 3 0 + 36144 = N 2 0 + 36224 = N 0 0 + 36288 = N 1 0 + 36352 = N 2 0 + 36416 = N 3 0 + 36480 = N 4 0 + 36544 = N 3 0 + 36608 = N 2 0 + 36704 = N 1 0 + 36768 = N 0 0 + 36864 = N 4 0 + 36928 = N 3 0 + 36992 = N 2 0 + 37056 = N 3 0 + 37120 = N 1 0 + 37184 = N 2 0 + 37248 = N 3 0 + 37312 = N 2 0 + 37376 = N 1 0 + 37440 = N 2 0 + 37488 = N 0 0 + 37536 = N 1 0 + 37632 = N 2 0 + 37728 = N 3 0 + 37824 = N 4 0 + 37920 = N 3 0 + 38016 = N 1 0 + 38064 = N 2 0 + 38160 = N 3 0 + 38208 = N 4 0 + 38304 = N 4 0 + 38352 = N 3 0 + 38400 = S 2 1536 + 38448 = N 3 0 + 38496 = N 2 0 + 38592 = N 2 0 + 38640 = N 1 0 + 38736 = N 1 0 + 38784 = N 0 0 + 38928 = N 4 0 + 39024 = N 4 0 + 39072 = N 3 0 + 39168 = N 3 0 + 39216 = N 2 0 + 39312 = N 2 0 + 39360 = N 3 0 + 39456 = N 2 0 + 39552 = N 1 0 + 40320 = N 0 0 + 40368 = N 1 0 + 40416 = N 2 0 + 40512 = N 1 0 + 40560 = N 2 0 + 40608 = N 3 0 + 40704 = N 2 0 + 40752 = N 3 0 + 40800 = N 4 0 + 40896 = N 1 0 + 40992 = N 2 0 + 41040 = N 3 0 + 41088 = N 4 0 + 41184 = N 3 0 + 41280 = N 2 0 + 41376 = N 1 0 + 41472 = N 3 0 + 41520 = N 4 0 + 41568 = N 3 0 + 41664 = N 2 0 + 41712 = N 3 0 + 41760 = N 2 0 + 41856 = N 1 0 + 41904 = N 3 0 + 41952 = N 2 0 + 42048 = N 1 0 + 42096 = N 2 0 + 42144 = N 3 0 + 42192 = N 4 0 + 42240 = N 1 0 + 42336 = N 1 0 + 42432 = N 2 0 + 42528 = N 2 0 + 42624 = N 3 0 + 42720 = N 3 0 + 42816 = N 4 0 + 42898 = N 3 0 + 42953 = N 2 0 + 43008 = N 1 0 + 43152 = N 3 0 + 43248 = N 2 0 + 43344 = N 1 0 + 43440 = N 4 0 + 43536 = N 3 0 + 43584 = N 2 0 + 43680 = N 1 0 + 43728 = N 0 0 + 43808 = N 3 0 + 43968 = N 1 0 + 44040 = N 2 0 + 44112 = N 4 0 + 44192 = N 3 0 + 44352 = N 1 0 + 44403 = N 2 0 + 44454 = N 3 0 + 44544 = N 2 0 + 44592 = N 3 0 + 44672 = N 4 0 + 44736 = N 3 0 + 44784 = N 2 0 + 44832 = N 1 0 + 44928 = N 4 0 + 44976 = N 3 0 + 45024 = N 4 0 + 45072 = N 3 0 + 45120 = N 2 0 + 45216 = N 1 0 + 45264 = N 2 0 + 45312 = N 0 0 + 45408 = N 2 0 + 45456 = N 0 0 + 45504 = N 1 0 + 45552 = N 2 0 + 45648 = N 3 0 + 45696 = N 1 0 + 45792 = N 3 0 + 45840 = N 2 0 + 45936 = N 4 0 + 45984 = N 3 0 + 46080 = N 1 0 + 46080 = S 2 1248 + 46176 = N 1 0 + 46224 = N 2 0 + 46272 = N 1 0 + 46368 = N 2 0 + 46464 = N 1 0 + 46512 = N 3 0 + 46608 = N 2 0 + 46656 = N 3 0 + 46704 = N 2 0 + 46800 = N 3 0 + 46848 = N 1 0 + 46944 = N 2 0 + 46992 = N 1 0 + 47088 = N 3 0 + 47136 = N 2 0 + 47232 = N 4 0 + 47280 = N 3 0 + 47376 = N 4 0 + 47520 = N 4 0 + 47664 = N 3 0 + 47712 = N 2 0 + 47760 = N 4 0 + 47808 = N 3 0 + 47856 = N 2 0 + 47904 = N 1 0 + 48000 = N 3 0 + 48048 = N 2 0 + 48096 = N 1 0 + 48192 = N 1 0 + 48288 = N 0 0 + 48384 = N 1 0 + 48480 = N 3 0 + 48528 = N 3 0 + 48576 = N 4 0 + 48960 = N 2 0 + 48960 = N 3 0 + 49056 = N 2 0 + 49056 = N 4 0 + 49152 = N 1 0 + 49296 = N 0 0 + 49392 = N 3 0 + 49392 = N 4 0 + 49488 = N 2 0 + 49488 = N 4 0 + 49584 = N 2 0 + 49584 = N 4 0 + 49728 = N 1 0 + 49728 = N 4 0 + 49824 = N 3 0 + 49824 = N 4 0 + 49920 = N 3 0 + 49920 = N 4 0 + 49968 = N 3 0 + 49968 = N 4 0 + 50064 = N 2 0 + 50064 = N 4 0 + 50160 = N 2 0 + 50160 = N 4 0 + 50256 = N 1 0 + 50256 = N 3 0 + 50352 = N 1 0 + 50352 = N 3 0 + 50496 = N 2 0 + 50640 = N 0 0 + 50736 = N 2 0 + 50832 = N 1 0 + 50928 = N 3 0 + 51024 = N 2 0 + 51072 = N 4 0 + 51120 = N 3 0 + 51168 = N 2 0 + 51264 = N 1 0 + 51360 = N 0 0 + 51408 = N 1 0 + 51456 = N 2 0 + 51552 = N 2 0 + 51648 = N 3 0 + 51744 = N 2 0 + 51840 = N 1 0 + 51936 = N 4 0 + 52032 = N 2 0 + 52080 = N 1 0 + 52128 = N 0 0 + 52176 = N 3 0 + 52224 = N 2 0 + 52320 = N 3 0 + 52368 = N 2 0 + 52416 = N 1 0 + 52480 = N 0 0 + 52544 = N 1 0 + 52632 = N 2 0 + 52688 = N 3 0 + 52744 = N 2 0 + 52800 = N 3 0 + 52864 = N 2 0 + 52928 = N 3 0 + 52992 = N 2 0 + 53056 = N 1 0 + 53120 = N 2 0 + 53184 = N 3 0 + 53248 = N 2 0 + 53312 = N 3 0 + 53376 = N 4 0 + 53440 = N 3 0 + 53504 = N 4 0 + 53568 = N 2 0 + 53632 = N 1 0 + 53696 = N 2 0 + 53760 = N 3 0 + 53824 = N 2 0 + 53888 = N 3 0 + 53952 = N 4 0 + 54016 = N 3 0 + 54080 = N 4 0 + 54192 = N 3 0 + 54240 = N 4 0 + 54336 = N 3 0 + 54432 = S 2 768 + 54480 = N 4 0 + 54528 = N 3 0 + 54576 = N 2 0 + 54624 = N 1 0 + 54720 = N 1 0 + 54768 = N 2 0 + 54816 = N 0 0 + 55200 = E soloend + 55296 = N 0 0 + 55344 = N 1 0 + 55392 = N 2 0 + 55488 = N 2 0 + 55584 = N 2 0 + 55680 = N 3 0 + 55728 = N 1 240 + 56064 = N 3 0 + 56112 = N 4 0 + 56160 = N 3 0 + 56256 = N 2 0 + 56352 = N 0 0 + 56400 = N 1 336 + 56832 = N 0 0 + 56880 = N 1 0 + 56928 = N 2 0 + 57024 = N 2 0 + 57120 = N 2 0 + 57216 = N 3 192 + 57600 = N 4 0 + 57648 = N 3 0 + 57696 = N 2 0 + 57744 = N 1 0 + 57792 = N 2 0 + 57840 = N 3 0 + 57888 = N 1 0 + 57936 = N 2 0 + 57984 = N 1 0 + 58032 = N 0 240 + 58464 = N 0 0 + 58512 = N 1 0 + 58560 = N 2 0 + 58656 = N 2 0 + 58752 = N 3 0 + 58800 = N 1 144 + 59040 = N 1 0 + 59088 = N 2 0 + 59136 = N 3 0 + 59232 = N 3 0 + 59328 = N 4 0 + 59424 = N 3 0 + 59472 = N 1 144 + 59904 = N 4 0 + 59952 = N 4 0 + 60000 = N 4 0 + 60048 = N 3 0 + 60096 = N 2 0 + 60192 = N 1 0 + 60240 = N 3 0 + 60384 = N 3 0 + 60432 = N 0 0 + 60480 = N 1 0 + 60576 = N 4 0 + 60672 = N 3 0 + 60768 = N 2 0 + 60864 = N 0 0 + 60912 = N 1 0 + 60960 = N 2 0 + 61056 = N 2 0 + 61152 = N 3 0 + 61248 = N 2 0 + 61344 = N 1 0 + 61440 = N 4 0 + 61440 = S 2 1536 + 61440 = E solo + 61536 = N 4 0 + 61632 = N 3 0 + 61728 = N 2 0 + 61776 = N 1 0 + 61824 = N 2 144 + 62016 = N 0 0 + 62112 = N 1 0 + 62208 = N 1 0 + 62304 = N 1 0 + 62400 = N 2 0 + 62496 = N 1 0 + 62544 = N 2 0 + 62640 = N 3 0 + 62688 = N 2 0 + 62784 = N 3 0 + 62880 = N 4 0 + 63168 = N 4 0 + 63216 = N 3 0 + 63264 = N 2 0 + 63360 = N 2 0 + 63456 = N 1 192 + 63840 = N 1 0 + 63936 = N 2 0 + 64032 = N 2 0 + 64080 = N 3 0 + 64176 = N 4 0 + 64224 = N 4 0 + 64272 = N 3 0 + 64320 = N 2 0 + 64368 = N 3 0 + 64416 = N 2 0 + 64512 = N 1 0 + 64560 = N 0 0 + 64608 = N 1 0 + 64656 = N 3 0 + 64704 = N 2 0 + 64800 = N 1 0 + 64896 = N 3 0 + 64992 = N 3 0 + 65088 = N 2 0 + 65184 = N 1 0 + 65280 = N 0 0 + 65328 = N 1 0 + 65376 = N 2 0 + 65472 = N 1 0 + 65520 = N 2 0 + 65568 = N 3 0 + 65712 = N 4 0 + 65856 = N 4 0 + 65952 = N 3 0 + 66048 = N 2 0 + 66144 = N 1 0 + 66240 = N 3 0 + 66336 = N 2 0 + 66432 = N 1 0 + 66480 = N 0 208 + 66720 = N 1 0 + 66816 = N 0 0 + 66912 = N 0 0 + 66960 = N 1 0 + 67008 = N 1 0 + 67104 = N 1 0 + 67136 = N 1 0 + 67168 = N 1 0 + 67200 = N 1 0 + 67296 = N 2 0 + 67328 = N 2 0 + 67360 = N 2 0 + 67392 = N 2 0 + 67488 = N 2 0 + 67536 = N 3 0 + 67584 = N 4 0 + 67680 = N 3 0 + 67776 = N 2 0 + 67824 = N 0 0 + 67872 = N 1 0 + 67968 = N 0 160 + 68160 = N 3 0 + 68256 = N 1 0 + 68352 = N 0 0 + 68448 = N 2 0 + 68544 = N 0 0 + 68640 = N 3 0 + 68736 = N 1 0 + 68832 = N 3 160 + 69024 = N 4 0 + 69216 = N 4 0 + 69264 = N 2 0 + 69312 = N 3 112 + 69456 = N 2 0 + 69504 = N 1 160 + 69696 = N 2 0 + 69792 = N 1 0 + 69888 = N 0 0 + 69888 = S 2 768 + 69984 = N 2 0 + 70080 = N 0 0 + 70176 = N 2 0 + 70272 = N 1 0 + 70368 = N 3 0 + 70464 = N 2 0 + 70560 = N 3 0 + 70656 = N 4 0 + 70704 = N 4 0 + 70752 = N 3 0 + 70800 = N 2 0 + 70848 = N 1 160 + 71040 = N 4 0 + 71088 = N 4 0 + 71136 = N 2 0 + 71184 = N 1 0 + 71232 = N 0 160 + 71424 = N 3 0 + 71472 = N 3 0 + 71520 = N 2 0 + 71568 = N 1 0 + 71616 = N 0 160 + 71808 = N 3 0 + 71904 = N 2 0 + 71952 = N 1 0 + 72000 = N 0 160 + 72192 = N 1 0 + 72288 = N 3 0 + 72288 = N 4 0 + 72480 = N 0 160 + 72672 = N 2 0 + 72672 = N 3 0 + 72864 = N 1 160 + 73056 = N 3 0 + 73056 = N 4 0 + 73248 = N 2 0 + 73344 = N 2 160 + 73536 = N 3 0 + 73536 = N 5 0 + 73728 = N 4 0 + 73776 = N 2 0 + 73824 = N 3 0 + 73872 = N 2 0 + 73920 = N 1 0 + 73968 = N 0 0 + 74016 = N 2 0 + 74064 = N 1 0 + 74112 = N 0 0 + 74160 = N 0 0 + 74208 = N 0 0 + 74256 = N 1 0 + 74304 = N 2 0 + 74400 = N 3 0 + 74496 = N 2 0 + 74592 = N 3 0 + 74688 = N 4 0 + 74784 = N 2 0 + 74880 = N 3 192 + 75264 = N 4 0 + 75312 = N 3 0 + 75360 = N 2 0 + 75408 = N 3 0 + 75456 = N 2 0 + 75504 = N 1 0 + 75552 = N 0 0 + 75600 = N 4 0 + 75648 = N 3 0 + 75696 = N 2 0 + 75744 = N 3 0 + 75792 = N 2 0 + 75840 = N 1 0 + 75936 = N 2 160 + 76128 = N 0 0 + 76224 = N 1 0 + 76320 = N 2 0 + 76416 = N 4 160 + 76608 = N 3 256 + 76896 = N 4 0 + 76992 = N 2 0 + 77040 = N 3 0 + 77088 = N 4 0 + 77184 = N 3 0 + 77280 = N 2 0 + 77328 = N 1 0 + 77376 = N 2 0 + 77424 = N 3 0 + 77472 = N 2 0 + 77520 = N 1 0 + 77568 = N 3 0 + 77568 = S 2 768 + 77616 = N 4 0 + 77664 = N 3 0 + 77712 = N 2 0 + 77760 = N 3 0 + 77856 = N 3 0 + 77904 = N 2 0 + 77952 = N 3 112 + 78096 = N 2 0 + 78144 = N 2 160 + 78336 = N 1 0 + 78384 = N 1 0 + 78432 = N 1 0 + 78480 = N 1 0 + 78528 = N 0 0 + 78528 = N 5 0 + 78576 = N 0 0 + 78624 = N 0 0 + 78672 = N 0 0 + 78720 = N 1 0 + 78720 = N 5 0 + 78768 = N 1 0 + 78816 = N 1 0 + 78864 = N 1 0 + 78912 = N 2 0 + 78912 = N 5 0 + 78960 = N 2 0 + 79008 = N 2 0 + 79056 = N 2 0 + 79104 = N 3 0 + 79104 = N 5 0 + 79152 = N 3 0 + 79200 = N 3 0 + 79248 = N 3 0 + 79296 = N 2 0 + 79296 = N 5 0 + 79344 = N 2 0 + 79392 = N 2 0 + 79440 = N 2 0 + 79488 = N 3 0 + 79488 = N 5 0 + 79584 = N 3 0 + 79872 = N 4 0 + 79920 = N 3 0 + 80016 = N 3 0 + 80064 = N 1 0 + 80160 = N 2 0 + 80256 = N 4 0 + 80352 = N 3 0 + 80400 = N 2 0 + 80496 = N 1 0 + 80592 = N 0 0 + 80640 = N 1 0 + 80736 = N 0 0 + 80832 = N 3 0 + 80928 = N 2 0 + 81024 = N 2 0 + 81120 = N 3 0 + 81216 = N 4 0 + 81312 = N 2 0 + 81408 = N 1 160 + 81600 = N 2 0 + 81648 = N 1 0 + 81696 = N 0 0 + 81792 = N 2 160 + 81984 = N 2 0 + 82032 = N 1 0 + 82080 = N 0 0 + 82176 = N 3 160 + 82368 = N 2 0 + 82416 = N 1 0 + 82464 = N 0 0 + 82560 = N 3 160 + 82752 = N 2 0 + 82800 = N 1 0 + 82848 = N 0 0 + 82944 = N 4 160 + 83136 = N 2 0 + 83184 = N 1 0 + 83232 = N 0 0 + 83328 = N 2 160 + 83520 = N 3 0 + 83568 = N 2 0 + 83616 = N 1 0 + 83712 = N 3 160 + 83904 = N 4 0 + 83952 = N 3 0 + 84000 = N 2 0 + 84096 = N 4 192 + 84480 = N 3 160 + 84480 = N 4 160 + 84672 = N 2 160 + 84672 = N 4 160 + 84864 = N 2 160 + 84864 = N 3 160 + 85056 = N 1 160 + 85056 = N 3 160 + 85248 = N 1 160 + 85248 = N 2 160 + 85440 = N 0 160 + 85440 = N 2 160 + 85632 = N 2 0 + 85632 = N 3 0 + 85632 = N 5 0 + 85824 = E soloend + 86016 = N 1 0 + 86016 = S 2 1536 + 86112 = N 3 0 + 86208 = N 0 0 + 86304 = N 4 0 + 86400 = N 1 0 + 86496 = N 4 0 + 86592 = N 0 0 + 86688 = N 4 0 + 86784 = N 1 0 + 86880 = N 3 0 + 86976 = N 0 0 + 87072 = N 3 0 + 87168 = N 1 0 + 87264 = N 3 0 + 87360 = N 0 160 + 87552 = N 1 0 + 87648 = N 4 0 + 87744 = N 0 0 + 87840 = N 3 0 + 87936 = N 1 0 + 88032 = N 4 0 + 88320 = N 2 0 + 88320 = N 4 0 + 88512 = N 2 160 + 88512 = N 4 160 + 88704 = N 1 160 + 88896 = N 2 160 + 88896 = N 3 160 + 89088 = N 0 0 + 89232 = N 1 0 + 89280 = N 2 0 + 89376 = N 3 0 + 89472 = N 4 0 + 89568 = N 3 0 + 89664 = N 3 0 + 89760 = N 3 0 + 89856 = N 2 0 + 89952 = N 1 0 + 90048 = N 0 0 + 90144 = N 0 0 + 90240 = N 1 0 + 90336 = N 0 0 + 90384 = N 1 0 + 90432 = N 2 0 + 90480 = N 3 0 + 90624 = N 0 0 + 90672 = N 1 0 + 90720 = N 2 0 + 90816 = N 0 0 + 90864 = N 1 0 + 90912 = N 2 0 + 91008 = N 1 0 + 91056 = N 2 0 + 91104 = N 3 0 + 91152 = N 4 0 + 91248 = N 1 0 + 91296 = N 2 0 + 91344 = N 3 0 + 91392 = N 2 0 + 91440 = N 1 0 + 91488 = N 0 0 + 91584 = N 2 0 + 91632 = N 4 0 + 91728 = N 2 0 + 91776 = N 3 0 + 91872 = N 1 0 + 91968 = N 0 0 + 92112 = N 2 0 + 92208 = N 1 0 + 92304 = N 0 0 + 92352 = N 1 0 + 92448 = N 2 0 + 92544 = N 2 0 + 92592 = N 3 0 + 92688 = N 3 0 + 92736 = N 2 0 + 92832 = N 2 0 + 92928 = N 4 0 + 92976 = N 3 0 + 93072 = N 4 0 + 93120 = N 2 0 + 93264 = N 3 0 + 93360 = N 4 0 + 93408 = N 1 0 + 93504 = N 0 0 + 93552 = N 1 0 + 93600 = N 2 0 + 93696 = N 2 0 + 93696 = S 2 960 + 93792 = N 1 0 + 93840 = N 2 0 + 93888 = N 3 0 + 93984 = N 4 0 + 94080 = N 0 0 + 94176 = N 1 0 + 94224 = N 2 0 + 94272 = N 3 0 + 94368 = N 4 0 + 94464 = N 2 192 + 94992 = N 1 0 + 95040 = N 2 0 + 95136 = N 2 0 + 95184 = N 3 0 + 95232 = N 4 0 + 95328 = N 4 0 + 95424 = N 3 0 + 95472 = N 2 0 + 95520 = N 1 0 + 95616 = N 2 0 + 95712 = N 3 0 + 95808 = N 2 0 + 95856 = N 1 0 + 95904 = N 0 0 + 96000 = N 1 0 + 96096 = N 0 0 + 96144 = N 1 0 + 96192 = N 2 0 + 96288 = N 3 0 + 96384 = N 4 0 + 96672 = N 3 0 + 96720 = N 3 0 + 96768 = N 4 0 + 96864 = N 4 0 + 96960 = N 3 0 + 97008 = N 2 0 + 97056 = N 1 0 + 97152 = N 2 0 + 97248 = N 3 0 + 97344 = N 2 0 + 97392 = N 1 0 + 97440 = N 0 0 + 97536 = N 0 0 + 97632 = N 0 0 + 97680 = N 1 0 + 97728 = N 2 0 + 97824 = N 3 0 + 97920 = N 4 0 + 98208 = N 1 0 + 98304 = N 2 0 + 98352 = N 3 0 + 98400 = N 4 0 + 98496 = N 1 0 + 98544 = N 3 0 + 98592 = N 4 0 + 98688 = N 1 0 + 98736 = N 2 0 + 98784 = N 4 0 + 98880 = N 1 0 + 98928 = N 2 0 + 98976 = N 3 0 + 99072 = N 0 0 + 99120 = N 2 0 + 99168 = N 3 0 + 99264 = N 0 0 + 99312 = N 1 0 + 99360 = N 3 0 + 99456 = N 3 0 + 99552 = N 3 0 + 99648 = N 0 192 + 99888 = N 0 0 + 99936 = N 1 0 + 100032 = N 2 0 + 100128 = N 3 0 + 100224 = N 4 160 + 100416 = N 2 0 + 100512 = N 1 0 + 100608 = N 2 0 + 101376 = N 1 0 + 101376 = S 2 768 + 101424 = N 2 0 + 101472 = N 3 0 + 101568 = N 3 0 + 101664 = N 1 0 + 101712 = N 2 0 + 101760 = N 3 0 + 101856 = N 3 0 + 101952 = N 1 0 + 102000 = N 2 0 + 102048 = N 3 0 + 102144 = N 3 0 + 102240 = N 1 0 + 102288 = N 2 0 + 102336 = N 3 0 + 102432 = N 3 0 + 102528 = N 1 0 + 102576 = N 2 0 + 102624 = N 3 0 + 102720 = N 3 0 + 102816 = N 3 0 + 102912 = N 0 0 + 102960 = N 2 0 + 103008 = N 3 0 + 103104 = N 3 0 + 103200 = N 0 0 + 103248 = N 2 0 + 103296 = N 3 0 + 103392 = N 3 0 + 103488 = N 0 0 + 103584 = N 2 0 + 103680 = N 2 0 + 103776 = N 0 0 + 103824 = N 2 0 + 103872 = N 3 0 + 103968 = N 3 0 + 104064 = N 0 0 + 104112 = N 2 0 + 104160 = N 3 0 + 104256 = N 3 0 + 104352 = N 3 0 + 104448 = N 0 0 + 104496 = N 1 0 + 104544 = N 3 0 + 104640 = N 3 0 + 104736 = N 0 0 + 104784 = N 1 0 + 104832 = N 3 0 + 104928 = N 3 0 + 105024 = N 0 0 + 105072 = N 1 0 + 105120 = N 3 0 + 105216 = N 3 0 + 105312 = N 0 0 + 105360 = N 1 0 + 105408 = N 3 0 + 105504 = N 3 0 + 105600 = N 0 0 + 105648 = N 1 0 + 105696 = N 3 0 + 105792 = N 3 0 + 105888 = N 3 0 + 105984 = N 2 256 + 106272 = N 1 0 + 106272 = N 5 0 + 106368 = N 0 192 + 106368 = N 5 0 + 107568 = N 0 0 + 107664 = N 1 0 + 107760 = N 2 0 + 107856 = N 3 0 + 107904 = N 4 0 + 107952 = N 3 0 + 108000 = N 2 0 + 108048 = N 4 0 + 108096 = N 3 112 + 108240 = N 2 0 + 108288 = S 2 768 + 108336 = N 0 0 + 108432 = N 1 0 + 108528 = N 2 0 + 108624 = N 3 0 + 108672 = N 2 0 + 108720 = N 4 0 + 108768 = N 3 112 + 108912 = N 1 0 + 109104 = N 4 0 + 109200 = N 3 0 + 109248 = N 2 0 + 109296 = N 1 0 + 109392 = N 4 0 + 109488 = N 3 0 + 109536 = N 2 0 + 109584 = N 1 0 + 109680 = N 4 0 + 109776 = N 3 0 + 109824 = N 2 0 + 109872 = N 1 0 + 109968 = N 4 0 + 110016 = N 3 0 + 110064 = N 2 0 + 110112 = N 1 192 + 110640 = N 0 0 + 110736 = N 1 0 + 110832 = N 2 0 + 110928 = N 3 0 + 110976 = N 4 0 + 111024 = N 3 0 + 111072 = N 2 0 + 111120 = N 4 0 + 111168 = N 3 112 + 111312 = N 4 0 + 111408 = N 0 0 + 111504 = N 1 0 + 111600 = N 2 0 + 111648 = N 3 0 + 111696 = N 2 0 + 111744 = N 1 0 + 111792 = N 3 0 + 111840 = N 2 112 + 111984 = N 4 0 + 112176 = N 3 0 + 112224 = N 4 0 + 112272 = N 3 0 + 112320 = N 2 0 + 112464 = N 1 0 + 112560 = N 2 0 + 112608 = N 1 0 + 112656 = N 0 0 + 112704 = N 1 0 + 112848 = N 4 0 + 112896 = N 3 0 + 112944 = N 2 0 + 112992 = N 1 0 + 113088 = N 1 0 + 113136 = N 2 0 + 113184 = N 0 0 + 113664 = N 0 0 + 113712 = N 1 0 + 113760 = N 2 0 + 113856 = N 2 0 + 113952 = N 2 0 + 114048 = N 3 0 + 114096 = N 1 240 + 114432 = N 4 0 + 114528 = N 3 0 + 114624 = N 2 0 + 114720 = N 0 0 + 114768 = N 1 336 + 115200 = N 0 0 + 115248 = N 1 0 + 115296 = N 2 0 + 115392 = N 2 0 + 115488 = N 2 0 + 115584 = N 3 0 + 115632 = N 1 240 + 116016 = N 2 0 + 116112 = N 3 0 + 116160 = N 4 0 + 116256 = N 1 0 + 116384 = N 2 0 + 116448 = N 0 240 + 116736 = N 0 0 + 116736 = S 2 1536 + 116784 = N 1 0 + 116832 = N 2 0 + 116928 = N 2 0 + 117024 = N 2 0 + 117120 = N 3 0 + 117168 = N 1 144 + 117504 = N 1 0 + 117552 = N 2 0 + 117600 = N 3 0 + 117696 = N 3 0 + 117792 = N 3 0 + 117840 = N 4 192 + 118272 = N 0 0 + 118336 = N 1 0 + 118400 = N 2 0 + 118496 = N 1 0 + 118560 = N 2 0 + 118624 = N 3 0 + 118688 = N 0 0 + 118752 = N 1 0 + 118816 = N 2 0 + 118880 = N 0 0 + 118944 = N 1 0 + 118992 = N 2 0 + 119040 = N 1 0 + 119136 = N 3 0 + 119184 = N 2 0 + 119280 = N 3 0 + 119376 = N 4 240 + 119856 = N 0 0 + 119952 = N 1 0 + 120048 = N 2 0 + 120144 = N 3 0 + 120192 = N 4 0 + 120240 = N 3 0 + 120288 = N 2 0 + 120336 = N 4 0 + 120384 = N 3 112 + 120528 = N 2 0 + 120624 = N 0 0 + 120720 = N 1 0 + 120816 = N 2 0 + 120864 = N 3 0 + 120912 = N 2 0 + 120960 = N 1 0 + 121008 = N 3 0 + 121056 = N 2 112 + 121200 = N 1 0 + 121392 = N 4 0 + 121488 = N 3 0 + 121536 = N 2 0 + 121584 = N 1 0 + 121680 = N 3 0 + 121776 = N 2 0 + 121824 = N 1 0 + 121872 = N 0 0 + 122112 = N 4 0 + 122160 = N 3 0 + 122208 = N 2 0 + 122256 = N 3 0 + 122304 = N 2 0 + 122352 = N 1 0 + 122400 = N 0 0 + 122928 = N 0 0 + 123024 = N 1 0 + 123120 = N 2 0 + 123216 = N 3 0 + 123264 = N 4 0 + 123312 = N 3 0 + 123360 = N 2 0 + 123408 = N 4 0 + 123456 = N 3 112 + 123600 = N 4 0 + 123696 = N 0 0 + 123792 = N 1 0 + 123888 = N 2 0 + 123936 = N 3 0 + 123984 = N 2 0 + 124032 = N 1 0 + 124080 = N 3 0 + 124128 = N 2 112 + 124272 = N 4 0 + 124464 = N 3 0 + 124512 = N 4 0 + 124560 = N 3 0 + 124608 = N 2 0 + 124752 = N 1 0 + 124848 = N 2 0 + 124896 = N 1 0 + 124944 = N 0 0 + 124992 = N 1 0 + 125136 = N 4 0 + 125184 = N 3 0 + 125232 = N 2 0 + 125280 = N 1 0 + 125376 = N 1 0 + 125424 = N 2 0 + 125472 = N 0 0 + 125904 = N 4 0 + 125952 = N 3 0 + 126000 = N 2 0 + 126048 = N 1 0 + 126144 = N 1 0 + 126192 = N 2 0 + 126240 = N 0 0 + 126672 = N 3 0 + 126720 = N 2 0 + 126768 = N 1 0 + 126912 = N 1 0 + 126960 = N 2 0 + 127008 = N 0 0 + 127440 = N 4 0 + 127488 = N 3 0 + 127536 = N 2 0 + 127584 = N 1 0 + 127680 = N 1 0 + 127728 = N 2 0 + 127968 = N 4 1824 + 127968 = N 6 0 +} +[MediumSingle] +{ + 1584 = N 0 0 + 1680 = N 1 0 + 1776 = N 2 0 + 1920 = N 3 0 + 2016 = N 2 0 + 2112 = N 3 112 + 2256 = N 2 0 + 2352 = N 0 0 + 2448 = N 1 0 + 2592 = N 2 0 + 2688 = N 1 0 + 2784 = N 2 112 + 2928 = N 1 0 + 3072 = N 3 0 + 3072 = S 2 768 + 3168 = N 2 0 + 3264 = N 1 0 + 3360 = N 1 0 + 3456 = N 0 192 + 3840 = N 3 0 + 3936 = N 2 0 + 4032 = N 1 0 + 4128 = N 1 0 + 4224 = N 0 352 + 4608 = N 1 640 + 5280 = N 2 0 + 5376 = N 2 0 + 5472 = N 2 0 + 5568 = N 2 384 + 6192 = N 0 0 + 6288 = N 1 0 + 6384 = N 2 0 + 6528 = N 3 0 + 6624 = N 2 0 + 6720 = N 3 112 + 6864 = N 2 0 + 6960 = N 0 0 + 7056 = N 1 0 + 7200 = N 2 0 + 7296 = N 1 0 + 7392 = N 2 112 + 7536 = N 1 0 + 7728 = N 3 0 + 7872 = N 2 0 + 8016 = N 1 0 + 8160 = N 0 0 + 8448 = N 3 0 + 8544 = N 2 0 + 8640 = N 1 0 + 8736 = N 0 0 + 9264 = N 0 0 + 9360 = N 1 0 + 9456 = N 2 0 + 9600 = N 3 0 + 9696 = N 2 0 + 9792 = N 2 112 + 9936 = N 3 0 + 9984 = S 2 768 + 10032 = N 0 0 + 10128 = N 1 0 + 10272 = N 2 0 + 10368 = N 1 0 + 10464 = N 2 112 + 10608 = N 3 0 + 10608 = N 5 0 + 10848 = N 3 0 + 10944 = N 2 0 + 11088 = N 1 0 + 11232 = N 0 0 + 11328 = N 0 0 + 11520 = N 3 0 + 11616 = N 2 0 + 11712 = N 1 0 + 11808 = N 1 256 + 12096 = N 0 160 + 12096 = N 5 0 + 12336 = N 0 0 + 12432 = N 1 0 + 12528 = N 2 0 + 12672 = N 3 0 + 12768 = N 2 0 + 12864 = N 3 112 + 13008 = N 2 0 + 13104 = N 0 0 + 13200 = N 1 0 + 13344 = N 2 0 + 13440 = N 1 0 + 13536 = N 2 0 + 13680 = N 1 0 + 13872 = N 3 0 + 14016 = N 2 0 + 14160 = N 1 0 + 14304 = N 0 0 + 14592 = N 3 0 + 14688 = N 2 0 + 14784 = N 1 0 + 14880 = N 0 0 + 15408 = N 0 0 + 15504 = N 1 0 + 15600 = N 2 0 + 15744 = N 3 0 + 15840 = N 2 0 + 15936 = N 2 112 + 16080 = N 3 0 + 16176 = N 0 0 + 16272 = N 1 0 + 16416 = N 2 0 + 16512 = N 1 0 + 16608 = N 2 112 + 16752 = N 3 0 + 16896 = S 2 1152 + 16992 = N 3 0 + 17088 = N 2 0 + 17232 = N 1 0 + 17376 = N 0 0 + 17472 = N 0 0 + 17664 = N 2 0 + 17760 = N 1 0 + 17856 = N 1 0 + 17952 = N 0 0 + 18432 = N 0 0 + 18528 = N 2 0 + 18624 = N 2 0 + 18720 = N 2 0 + 18864 = N 1 240 + 19200 = N 3 0 + 19296 = N 3 0 + 19392 = N 2 0 + 19536 = N 1 400 + 19968 = N 0 0 + 20064 = N 2 0 + 20160 = N 1 0 + 20256 = N 2 0 + 20400 = N 1 240 + 20832 = N 2 0 + 20928 = N 3 0 + 21024 = N 2 0 + 21168 = N 0 240 + 21504 = N 0 0 + 21600 = N 2 0 + 21696 = N 2 0 + 21792 = N 2 0 + 21936 = N 1 144 + 22272 = N 1 0 + 22368 = N 2 0 + 22464 = N 2 0 + 22608 = N 3 240 + 23040 = N 0 0 + 23184 = N 1 0 + 23328 = N 0 0 + 23472 = N 1 0 + 23616 = N 2 0 + 23760 = N 3 0 + 23904 = N 2 0 + 24000 = N 2 0 + 24144 = N 2 240 + 24144 = N 3 240 + 24576 = S 2 768 + 24624 = N 0 0 + 24720 = N 1 0 + 24816 = N 2 0 + 24960 = N 3 0 + 25056 = N 2 0 + 25152 = N 3 112 + 25296 = N 2 0 + 25392 = N 0 0 + 25488 = N 1 0 + 25632 = N 2 0 + 25728 = N 1 0 + 25824 = N 2 112 + 25968 = N 1 0 + 26208 = N 3 0 + 26304 = N 2 0 + 26448 = N 1 0 + 26592 = N 0 0 + 26880 = N 3 0 + 26976 = N 2 0 + 27072 = N 1 0 + 27168 = N 0 0 + 27696 = N 0 0 + 27792 = N 1 0 + 27888 = N 2 0 + 28032 = N 3 0 + 28128 = N 2 0 + 28224 = N 2 112 + 28368 = N 3 0 + 28464 = N 0 0 + 28560 = N 1 0 + 28704 = N 2 0 + 28800 = N 1 0 + 28896 = N 2 112 + 29040 = N 3 0 + 29280 = N 3 0 + 29376 = N 2 0 + 29520 = N 1 0 + 29664 = N 0 0 + 29760 = N 0 0 + 29952 = N 2 0 + 30048 = N 1 0 + 30144 = N 1 0 + 30240 = N 0 0 + 30384 = N 1 0 + 30384 = E solo + 30480 = N 2 0 + 30576 = N 0 0 + 30672 = N 1 0 + 30768 = N 3 0 + 30768 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31056 = N 1 0 + 31056 = N 6 0 + 31200 = N 0 0 + 31200 = N 6 0 + 31344 = N 3 0 + 31488 = N 2 0 + 31488 = S 2 576 + 31584 = N 3 16 + 31680 = N 2 0 + 31776 = N 1 0 + 31920 = N 0 0 + 32160 = N 0 0 + 32256 = N 0 0 + 32352 = N 3 0 + 32448 = N 2 0 + 32544 = N 1 0 + 32640 = N 1 0 + 32736 = N 3 0 + 32832 = N 3 0 + 32928 = N 2 0 + 33024 = N 1 0 + 33120 = N 0 0 + 33216 = N 1 0 + 33312 = N 2 0 + 33408 = N 2 0 + 33504 = N 3 0 + 33696 = N 2 0 + 33792 = N 1 0 + 33888 = N 2 0 + 33984 = N 1 0 + 34080 = N 0 0 + 34176 = N 0 0 + 34368 = N 1 0 + 34464 = N 2 0 + 34560 = N 2 0 + 34656 = N 0 0 + 34752 = N 1 0 + 34944 = N 1 0 + 35088 = N 1 0 + 35280 = N 2 0 + 35360 = N 1 0 + 35488 = N 3 0 + 35712 = N 1 0 + 35904 = N 2 0 + 36048 = N 3 0 + 36144 = N 2 0 + 36288 = N 1 0 + 36480 = N 3 0 + 36608 = N 1 0 + 36768 = N 0 0 + 36864 = N 3 0 + 37056 = N 3 0 + 37152 = N 2 0 + 37248 = N 1 0 + 37344 = N 0 0 + 37440 = N 1 0 + 37536 = N 0 0 + 37632 = N 1 0 + 37728 = N 2 0 + 37824 = N 3 0 + 37920 = N 2 0 + 38016 = N 1 0 + 38208 = N 3 0 + 38352 = N 2 0 + 38400 = S 2 1536 + 38496 = N 1 0 + 38640 = N 0 0 + 38784 = N 3 0 + 38928 = N 2 0 + 39072 = N 1 0 + 39216 = N 0 0 + 39360 = N 2 0 + 39456 = N 1 0 + 39552 = N 0 0 + 40320 = N 0 0 + 40416 = N 0 0 + 40512 = N 1 0 + 40608 = N 1 0 + 40704 = N 2 0 + 40800 = N 2 0 + 40896 = N 1 0 + 40992 = N 1 0 + 41088 = N 3 0 + 41184 = N 2 0 + 41280 = N 1 0 + 41376 = N 0 0 + 41472 = N 3 0 + 41568 = N 3 0 + 41664 = N 2 0 + 41760 = N 2 0 + 41856 = N 1 0 + 41952 = N 2 0 + 42048 = N 1 0 + 42144 = N 2 0 + 42240 = N 0 0 + 42336 = N 0 0 + 42432 = N 1 0 + 42528 = N 1 0 + 42624 = N 2 0 + 42720 = N 2 0 + 42816 = N 3 0 + 42912 = N 2 0 + 43008 = N 1 0 + 43152 = N 2 0 + 43248 = N 1 0 + 43344 = N 0 0 + 43440 = N 3 0 + 43584 = N 2 0 + 43680 = N 1 0 + 43808 = N 2 0 + 43968 = N 1 0 + 44112 = N 3 0 + 44352 = N 0 0 + 44448 = N 1 0 + 44544 = N 2 0 + 44672 = N 3 0 + 44832 = N 2 0 + 44928 = N 3 0 + 45024 = N 3 0 + 45120 = N 2 0 + 45216 = N 1 0 + 45312 = N 0 0 + 45408 = N 1 0 + 45504 = N 0 0 + 45648 = N 1 0 + 45792 = N 2 0 + 45936 = N 3 0 + 46080 = N 0 0 + 46080 = S 2 1248 + 46224 = N 1 0 + 46368 = N 0 0 + 46512 = N 1 0 + 46656 = N 2 0 + 46800 = N 2 0 + 46944 = N 1 0 + 47088 = N 2 0 + 47232 = N 3 0 + 47376 = N 3 0 + 47520 = N 3 0 + 47712 = N 2 0 + 47808 = N 3 0 + 47904 = N 2 0 + 48000 = N 3 0 + 48096 = N 1 0 + 48192 = N 1 0 + 48288 = N 0 0 + 48384 = N 1 0 + 48480 = N 2 0 + 48576 = N 3 0 + 48960 = N 1 0 + 48960 = N 3 0 + 49056 = N 2 0 + 49056 = N 3 0 + 49392 = N 3 0 + 49488 = N 2 0 + 49584 = N 2 0 + 49728 = N 1 0 + 49824 = N 2 0 + 49968 = N 2 0 + 50064 = N 1 0 + 50160 = N 1 0 + 50256 = N 0 0 + 50352 = N 0 0 + 50496 = N 1 0 + 50640 = N 0 0 + 50736 = N 2 0 + 50832 = N 1 0 + 50928 = N 3 0 + 51072 = N 3 0 + 51168 = N 2 0 + 51264 = N 1 0 + 51360 = N 0 0 + 51456 = N 1 0 + 51552 = N 3 0 + 51648 = N 2 0 + 51744 = N 1 0 + 51840 = N 0 0 + 51936 = N 3 0 + 52032 = N 2 0 + 52128 = N 1 0 + 52224 = N 2 0 + 52320 = N 1 0 + 52416 = N 0 0 + 52632 = N 0 0 + 52744 = N 0 0 + 52864 = N 0 0 + 52992 = N 0 0 + 53184 = N 1 0 + 53376 = N 2 0 + 53568 = N 3 0 + 53760 = N 2 0 + 53952 = N 3 0 + 54080 = N 3 0 + 54240 = N 3 0 + 54336 = N 2 0 + 54432 = S 2 768 + 54528 = N 2 0 + 54624 = N 1 0 + 54720 = N 1 0 + 54816 = N 0 0 + 55200 = E soloend + 55296 = N 0 0 + 55392 = N 2 0 + 55488 = N 2 0 + 55584 = N 2 0 + 55728 = N 1 240 + 56064 = N 3 0 + 56160 = N 3 0 + 56256 = N 2 0 + 56400 = N 1 336 + 56832 = N 0 0 + 56928 = N 1 0 + 57024 = N 1 0 + 57120 = N 1 0 + 57216 = N 2 192 + 57600 = N 3 0 + 57696 = N 2 0 + 57792 = N 2 0 + 57888 = N 1 0 + 57984 = N 0 288 + 58464 = N 0 0 + 58560 = N 2 0 + 58656 = N 2 0 + 58800 = N 1 144 + 59040 = N 1 0 + 59136 = N 2 0 + 59232 = N 2 0 + 59328 = N 3 0 + 59472 = N 1 144 + 59904 = N 3 0 + 60000 = N 3 0 + 60096 = N 2 0 + 60240 = N 3 0 + 60384 = N 2 0 + 60480 = N 1 0 + 60576 = N 3 0 + 60672 = N 2 0 + 60768 = N 1 0 + 60864 = N 0 0 + 60960 = N 1 0 + 61056 = N 1 0 + 61152 = N 2 0 + 61248 = N 1 0 + 61344 = N 0 0 + 61440 = N 3 0 + 61440 = S 2 1536 + 61440 = E solo + 61536 = N 3 0 + 61632 = N 2 0 + 61728 = N 1 0 + 61824 = N 1 144 + 62016 = N 0 0 + 62112 = N 1 0 + 62208 = N 1 0 + 62304 = N 1 0 + 62400 = N 2 0 + 62544 = N 1 0 + 62688 = N 1 0 + 62784 = N 2 0 + 62880 = N 3 0 + 63168 = N 3 0 + 63264 = N 2 0 + 63360 = N 2 0 + 63456 = N 1 192 + 63840 = N 0 0 + 63936 = N 1 0 + 64080 = N 2 0 + 64224 = N 3 0 + 64320 = N 2 0 + 64416 = N 2 0 + 64512 = N 0 0 + 64608 = N 0 0 + 64704 = N 1 0 + 64800 = N 0 0 + 64896 = N 3 0 + 64992 = N 3 0 + 65088 = N 2 0 + 65184 = N 1 0 + 65280 = N 0 0 + 65376 = N 1 0 + 65472 = N 1 0 + 65568 = N 2 0 + 65712 = N 3 0 + 65856 = N 3 0 + 65952 = N 2 0 + 66048 = N 1 0 + 66144 = N 0 0 + 66240 = N 2 0 + 66336 = N 1 0 + 66432 = N 1 256 + 66720 = N 1 0 + 66816 = N 0 0 + 66912 = N 0 0 + 67104 = N 1 0 + 67200 = N 1 0 + 67296 = N 2 0 + 67392 = N 2 0 + 67584 = N 2 0 + 67776 = N 1 0 + 67968 = N 0 160 + 68160 = N 1 0 + 68352 = N 0 0 + 68544 = N 1 0 + 68832 = N 1 160 + 69024 = N 2 0 + 69216 = N 2 0 + 69312 = N 1 112 + 69504 = N 0 160 + 69696 = N 1 0 + 69888 = N 0 0 + 69888 = S 2 768 + 70080 = N 0 0 + 70272 = N 1 0 + 70464 = N 1 0 + 70656 = N 2 0 + 70848 = N 1 160 + 71040 = N 2 64 + 71232 = N 0 160 + 71424 = N 2 0 + 71616 = N 0 160 + 71808 = N 1 0 + 72000 = N 0 160 + 72192 = N 1 0 + 72288 = N 2 0 + 72480 = N 0 160 + 72672 = N 2 0 + 72864 = N 1 160 + 73056 = N 2 0 + 73248 = N 2 0 + 73344 = N 2 192 + 73728 = N 2 0 + 73920 = N 1 0 + 74112 = N 0 0 + 74304 = N 1 0 + 74496 = N 0 0 + 74592 = N 1 0 + 74688 = N 2 0 + 74880 = N 1 192 + 75264 = N 2 0 + 75360 = N 2 0 + 75456 = N 1 0 + 75552 = N 1 0 + 75648 = N 0 0 + 75744 = N 0 0 + 75840 = N 1 0 + 75936 = N 2 160 + 76128 = N 0 0 + 76224 = N 1 0 + 76416 = N 2 160 + 76608 = N 1 256 + 76896 = N 3 0 + 76992 = N 2 0 + 77088 = N 3 0 + 77184 = N 2 0 + 77280 = N 1 0 + 77376 = N 1 0 + 77472 = N 1 0 + 77568 = N 3 0 + 77568 = S 2 768 + 77664 = N 3 0 + 77760 = N 3 0 + 77856 = N 3 0 + 77952 = N 3 112 + 78144 = N 2 160 + 78336 = N 0 0 + 78432 = N 0 0 + 78528 = N 1 0 + 78624 = N 1 0 + 78720 = N 2 0 + 78816 = N 2 0 + 78912 = N 3 0 + 79008 = N 3 0 + 79104 = N 0 0 + 79200 = N 0 0 + 79296 = N 1 0 + 79392 = N 1 0 + 79488 = N 2 0 + 79584 = N 2 0 + 79872 = N 3 0 + 80064 = N 1 0 + 80160 = N 2 0 + 80256 = N 3 0 + 80352 = N 2 0 + 80496 = N 1 0 + 80640 = N 1 0 + 80736 = N 0 0 + 80832 = N 2 0 + 80928 = N 1 0 + 81024 = N 1 0 + 81120 = N 2 0 + 81216 = N 3 0 + 81312 = N 2 0 + 81408 = N 1 160 + 81600 = N 1 0 + 81696 = N 0 0 + 81792 = N 2 160 + 81984 = N 1 0 + 82080 = N 0 0 + 82176 = N 3 160 + 82368 = N 1 0 + 82464 = N 0 0 + 82560 = N 3 160 + 82752 = N 2 0 + 82848 = N 0 0 + 82944 = N 3 160 + 83136 = N 2 0 + 83232 = N 1 0 + 83328 = N 2 160 + 83520 = N 1 0 + 83616 = N 0 0 + 83712 = N 3 160 + 83904 = N 2 0 + 84000 = N 1 0 + 84096 = N 3 192 + 84480 = N 2 160 + 84480 = N 3 160 + 84672 = N 1 160 + 84672 = N 3 160 + 84864 = N 1 160 + 84864 = N 2 160 + 85056 = N 0 160 + 85056 = N 2 160 + 85248 = N 0 160 + 85248 = N 1 160 + 85440 = N 0 288 + 85440 = N 1 288 + 85824 = E soloend + 86016 = N 1 0 + 86016 = S 2 1536 + 86208 = N 0 0 + 86304 = N 3 0 + 86400 = N 1 0 + 86496 = N 3 0 + 86688 = N 3 0 + 86784 = N 1 0 + 86880 = N 2 0 + 86976 = N 0 0 + 87072 = N 2 0 + 87168 = N 1 0 + 87264 = N 2 0 + 87360 = N 0 160 + 87552 = N 1 0 + 87648 = N 3 0 + 87744 = N 0 0 + 87840 = N 2 0 + 87936 = N 1 0 + 88032 = N 3 0 + 88320 = N 1 0 + 88320 = N 3 0 + 88512 = N 1 160 + 88512 = N 3 160 + 88704 = N 1 160 + 88896 = N 1 160 + 88896 = N 2 160 + 89088 = N 0 0 + 89280 = N 1 0 + 89376 = N 2 0 + 89472 = N 3 0 + 89568 = N 2 0 + 89664 = N 2 0 + 89760 = N 2 0 + 89856 = N 1 0 + 90048 = N 0 0 + 90144 = N 0 0 + 90240 = N 1 0 + 90336 = N 0 0 + 90432 = N 1 0 + 90624 = N 0 0 + 90720 = N 1 0 + 90816 = N 1 0 + 90912 = N 2 0 + 91008 = N 2 0 + 91104 = N 3 0 + 91296 = N 2 0 + 91392 = N 2 0 + 91488 = N 1 0 + 91584 = N 0 0 + 91776 = N 2 0 + 91872 = N 1 0 + 91968 = N 0 0 + 92112 = N 1 0 + 92208 = N 0 0 + 92352 = N 1 0 + 92448 = N 2 0 + 92544 = N 2 0 + 92688 = N 3 0 + 92832 = N 2 0 + 92976 = N 1 0 + 93120 = N 0 0 + 93264 = N 2 0 + 93408 = N 1 0 + 93504 = N 0 0 + 93600 = N 1 0 + 93696 = N 2 0 + 93696 = S 2 960 + 93792 = N 1 0 + 93888 = N 2 0 + 93984 = N 3 0 + 94080 = N 0 0 + 94176 = N 1 0 + 94272 = N 2 0 + 94368 = N 3 0 + 94464 = N 2 192 + 95040 = N 2 0 + 95136 = N 2 0 + 95232 = N 3 0 + 95328 = N 3 0 + 95424 = N 2 0 + 95520 = N 1 0 + 95616 = N 2 0 + 95712 = N 3 0 + 95808 = N 2 0 + 95904 = N 1 0 + 96000 = N 0 0 + 96096 = N 0 0 + 96192 = N 1 0 + 96288 = N 2 0 + 96384 = N 3 0 + 96672 = N 2 0 + 96768 = N 3 0 + 96864 = N 3 0 + 96960 = N 2 0 + 97056 = N 1 0 + 97152 = N 2 0 + 97248 = N 3 0 + 97344 = N 2 0 + 97440 = N 1 0 + 97536 = N 0 0 + 97632 = N 0 0 + 97728 = N 1 0 + 97824 = N 2 0 + 97920 = N 3 0 + 98208 = N 1 0 + 98304 = N 2 0 + 98400 = N 3 0 + 98496 = N 1 0 + 98592 = N 3 0 + 98688 = N 1 0 + 98784 = N 2 0 + 98880 = N 0 0 + 98976 = N 3 0 + 99072 = N 0 0 + 99168 = N 2 0 + 99264 = N 0 0 + 99360 = N 1 0 + 99456 = N 1 0 + 99552 = N 1 0 + 99648 = N 0 192 + 99936 = N 0 0 + 100032 = N 1 0 + 100128 = N 2 0 + 100224 = N 3 160 + 100416 = N 1 0 + 100512 = N 0 0 + 100608 = N 1 0 + 101376 = N 2 0 + 101376 = S 2 768 + 101472 = N 3 0 + 101568 = N 3 0 + 101664 = N 2 0 + 101760 = N 3 0 + 101856 = N 3 0 + 101952 = N 2 0 + 102048 = N 3 0 + 102144 = N 3 0 + 102240 = N 2 0 + 102336 = N 3 0 + 102432 = N 3 0 + 102528 = N 2 0 + 102624 = N 3 0 + 102720 = N 3 0 + 102816 = N 3 0 + 102912 = N 1 0 + 103008 = N 3 0 + 103104 = N 3 0 + 103200 = N 1 0 + 103296 = N 3 0 + 103392 = N 3 0 + 103488 = N 1 0 + 103584 = N 2 0 + 103680 = N 2 0 + 103776 = N 1 0 + 103872 = N 3 0 + 103968 = N 3 0 + 104064 = N 1 0 + 104160 = N 3 0 + 104256 = N 3 0 + 104352 = N 3 0 + 104448 = N 0 0 + 104544 = N 1 0 + 104640 = N 1 0 + 104736 = N 0 0 + 104832 = N 1 0 + 104928 = N 1 0 + 105024 = N 0 0 + 105120 = N 1 0 + 105216 = N 1 0 + 105312 = N 0 0 + 105408 = N 1 0 + 105504 = N 1 0 + 105600 = N 0 0 + 105696 = N 1 0 + 105792 = N 1 0 + 105888 = N 1 0 + 105984 = N 2 256 + 106272 = N 1 0 + 106272 = N 5 0 + 106368 = N 0 192 + 106368 = N 5 0 + 107568 = N 0 0 + 107664 = N 1 0 + 107760 = N 2 0 + 107904 = N 3 0 + 108000 = N 2 0 + 108096 = N 3 112 + 108240 = N 2 0 + 108288 = S 2 768 + 108336 = N 0 0 + 108432 = N 1 0 + 108528 = N 2 0 + 108624 = N 3 0 + 108768 = N 3 112 + 108912 = N 1 0 + 109104 = N 3 0 + 109248 = N 0 0 + 109392 = N 3 0 + 109536 = N 1 0 + 109680 = N 3 0 + 109824 = N 2 0 + 110016 = N 2 0 + 110112 = N 1 192 + 110640 = N 0 0 + 110736 = N 1 0 + 110832 = N 2 0 + 110976 = N 3 0 + 111072 = N 2 0 + 111168 = N 2 112 + 111312 = N 3 0 + 111408 = N 0 0 + 111504 = N 1 0 + 111648 = N 2 0 + 111744 = N 1 0 + 111840 = N 2 112 + 111984 = N 3 0 + 112224 = N 3 0 + 112320 = N 2 0 + 112464 = N 1 0 + 112608 = N 0 0 + 112704 = N 0 0 + 112896 = N 2 0 + 112992 = N 1 0 + 113088 = N 1 0 + 113184 = N 0 0 + 113664 = N 0 0 + 113760 = N 2 0 + 113856 = N 2 0 + 113952 = N 2 0 + 114096 = N 1 240 + 114432 = N 3 0 + 114528 = N 2 0 + 114624 = N 1 0 + 114768 = N 1 336 + 115200 = N 0 0 + 115296 = N 2 0 + 115392 = N 2 0 + 115488 = N 2 0 + 115632 = N 1 240 + 116016 = N 2 0 + 116160 = N 3 0 + 116256 = N 1 0 + 116448 = N 0 240 + 116736 = N 0 0 + 116736 = S 2 1536 + 116832 = N 2 0 + 116928 = N 2 0 + 117024 = N 2 0 + 117168 = N 1 144 + 117504 = N 1 0 + 117600 = N 2 0 + 117696 = N 2 0 + 117840 = N 3 192 + 118272 = N 0 0 + 118400 = N 2 0 + 118496 = N 1 0 + 118608 = N 3 0 + 118752 = N 1 0 + 118896 = N 0 0 + 119040 = N 0 0 + 119184 = N 1 0 + 119280 = N 2 0 + 119376 = N 3 240 + 119856 = N 0 0 + 119952 = N 1 0 + 120048 = N 2 0 + 120192 = N 3 0 + 120288 = N 2 0 + 120384 = N 3 112 + 120528 = N 2 0 + 120624 = N 0 0 + 120720 = N 1 0 + 120864 = N 2 0 + 120960 = N 1 0 + 121056 = N 2 112 + 121200 = N 1 0 + 121392 = N 3 0 + 121536 = N 2 0 + 121680 = N 1 0 + 121824 = N 0 0 + 122112 = N 3 0 + 122208 = N 2 0 + 122304 = N 1 0 + 122400 = N 0 0 + 122928 = N 0 0 + 123024 = N 1 0 + 123120 = N 2 0 + 123264 = N 3 0 + 123360 = N 2 0 + 123456 = N 2 112 + 123600 = N 3 0 + 123696 = N 0 0 + 123792 = N 1 0 + 123936 = N 2 0 + 124032 = N 1 0 + 124128 = N 2 112 + 124272 = N 3 0 + 124512 = N 3 0 + 124608 = N 2 0 + 124752 = N 1 0 + 124896 = N 0 0 + 124992 = N 0 0 + 125184 = N 2 0 + 125280 = N 1 0 + 125376 = N 1 0 + 125472 = N 0 0 + 125952 = N 2 0 + 126048 = N 1 0 + 126144 = N 1 0 + 126240 = N 0 0 + 126720 = N 1 0 + 126912 = N 1 0 + 127008 = N 0 0 + 127488 = N 2 0 + 127584 = N 1 0 + 127680 = N 1 0 + 127968 = N 3 1824 + 127968 = N 6 0 +} +[EasySingle] +{ + 1584 = N 0 0 + 1776 = N 1 0 + 1920 = N 2 0 + 2112 = N 2 112 + 2352 = N 0 0 + 2592 = N 1 0 + 2784 = N 1 112 + 3072 = N 2 0 + 3072 = S 2 768 + 3264 = N 1 0 + 3456 = N 0 192 + 3840 = N 2 0 + 4032 = N 1 0 + 4224 = N 0 352 + 4608 = N 1 640 + 5376 = N 2 0 + 5568 = N 2 384 + 6192 = N 0 0 + 6384 = N 1 0 + 6528 = N 2 0 + 6720 = N 2 112 + 6960 = N 0 0 + 7200 = N 1 0 + 7392 = N 1 112 + 7728 = N 2 0 + 7872 = N 1 0 + 8016 = N 0 0 + 8448 = N 2 0 + 8640 = N 1 0 + 8736 = N 0 0 + 9264 = N 0 0 + 9456 = N 1 0 + 9600 = N 2 0 + 9792 = N 1 112 + 9984 = S 2 768 + 10032 = N 0 0 + 10272 = N 1 0 + 10464 = N 1 144 + 10944 = N 2 0 + 11088 = N 1 0 + 11328 = N 0 0 + 11520 = N 2 0 + 11712 = N 1 0 + 11808 = N 1 256 + 12096 = N 0 160 + 12096 = N 5 0 + 12336 = N 0 0 + 12528 = N 1 0 + 12672 = N 2 0 + 12864 = N 2 112 + 13104 = N 0 0 + 13344 = N 1 0 + 13536 = N 1 0 + 13872 = N 2 0 + 14016 = N 1 0 + 14160 = N 0 0 + 14592 = N 2 0 + 14784 = N 1 0 + 14880 = N 0 0 + 15408 = N 0 0 + 15600 = N 1 0 + 15744 = N 2 0 + 15936 = N 1 112 + 16176 = N 0 0 + 16416 = N 1 0 + 16608 = N 1 112 + 16896 = S 2 1152 + 17088 = N 2 0 + 17232 = N 1 0 + 17472 = N 0 0 + 17664 = N 2 0 + 17856 = N 1 0 + 17952 = N 0 0 + 18432 = N 0 0 + 18624 = N 2 0 + 18864 = N 1 240 + 19200 = N 2 0 + 19392 = N 1 0 + 19536 = N 0 400 + 19968 = N 0 0 + 20160 = N 1 0 + 20400 = N 1 240 + 20928 = N 2 0 + 21168 = N 0 240 + 21504 = N 0 0 + 21696 = N 2 0 + 21936 = N 1 144 + 22272 = N 0 0 + 22464 = N 1 0 + 22608 = N 2 240 + 23040 = N 0 0 + 23184 = N 1 0 + 23328 = N 0 0 + 23472 = N 2 0 + 23616 = N 1 0 + 23760 = N 2 0 + 24000 = N 1 0 + 24144 = N 2 240 + 24576 = S 2 768 + 24624 = N 0 0 + 24816 = N 1 0 + 24960 = N 2 0 + 25152 = N 2 112 + 25392 = N 0 0 + 25632 = N 1 0 + 25824 = N 1 112 + 26208 = N 2 0 + 26448 = N 1 0 + 26592 = N 0 0 + 26880 = N 2 0 + 27072 = N 1 0 + 27168 = N 0 0 + 27696 = N 0 0 + 27888 = N 1 0 + 28032 = N 2 0 + 28224 = N 1 112 + 28464 = N 0 0 + 28704 = N 1 0 + 28896 = N 1 112 + 29376 = N 2 0 + 29520 = N 1 0 + 29760 = N 0 0 + 29952 = N 2 0 + 30144 = N 1 0 + 30240 = N 0 0 + 30384 = N 0 0 + 30384 = E solo + 30576 = N 1 0 + 30768 = N 2 0 + 30768 = N 6 0 + 30912 = N 2 0 + 30912 = N 6 0 + 31056 = N 1 0 + 31056 = N 6 0 + 31200 = N 1 0 + 31200 = N 6 0 + 31344 = N 0 0 + 31488 = N 2 0 + 31488 = S 2 576 + 31680 = N 1 0 + 31776 = N 0 0 + 32256 = N 0 0 + 32448 = N 2 0 + 32640 = N 1 0 + 32832 = N 2 0 + 33024 = N 0 0 + 33216 = N 1 0 + 33408 = N 2 0 + 33696 = N 1 0 + 33840 = N 2 0 + 33984 = N 1 0 + 34176 = N 0 0 + 34368 = N 1 0 + 34560 = N 2 0 + 34752 = N 1 0 + 34944 = N 0 0 + 35088 = N 0 0 + 35280 = N 1 0 + 35488 = N 2 0 + 35712 = N 0 0 + 35904 = N 2 0 + 36048 = N 1 0 + 36288 = N 1 0 + 36480 = N 2 0 + 36768 = N 0 0 + 36864 = N 2 0 + 37056 = N 2 0 + 37248 = N 1 0 + 37440 = N 0 0 + 37632 = N 1 0 + 37824 = N 2 0 + 38016 = N 1 0 + 38208 = N 2 0 + 38352 = N 2 0 + 38400 = S 2 1536 + 38496 = N 1 0 + 38640 = N 1 0 + 38784 = N 2 0 + 38928 = N 2 0 + 39072 = N 1 0 + 39216 = N 1 0 + 39360 = N 0 0 + 39552 = N 0 0 + 40320 = N 0 0 + 40512 = N 1 0 + 40704 = N 2 0 + 40896 = N 1 0 + 41088 = N 2 0 + 41280 = N 1 0 + 41472 = N 2 0 + 41664 = N 1 0 + 41856 = N 0 0 + 42048 = N 0 0 + 42240 = N 0 0 + 42432 = N 2 0 + 42624 = N 1 0 + 42816 = N 2 0 + 43008 = N 1 0 + 43248 = N 0 0 + 43440 = N 2 0 + 43584 = N 1 0 + 43808 = N 1 0 + 43968 = N 0 0 + 44112 = N 2 0 + 44352 = N 0 0 + 44544 = N 1 0 + 44672 = N 2 0 + 44928 = N 2 0 + 45120 = N 1 0 + 45312 = N 0 0 + 45504 = N 0 0 + 45792 = N 1 0 + 46080 = N 0 0 + 46080 = S 2 1248 + 46368 = N 0 0 + 46656 = N 1 0 + 46944 = N 0 0 + 47232 = N 2 0 + 47520 = N 2 0 + 47808 = N 2 0 + 48000 = N 2 0 + 48192 = N 1 0 + 48384 = N 0 0 + 48576 = N 1 0 + 48960 = N 1 0 + 49056 = N 2 0 + 49392 = N 2 0 + 49488 = N 1 0 + 49728 = N 0 0 + 49824 = N 2 0 + 50064 = N 1 0 + 50256 = N 0 0 + 50496 = N 1 0 + 50640 = N 0 0 + 50832 = N 1 0 + 51072 = N 2 0 + 51264 = N 0 0 + 51456 = N 1 0 + 51648 = N 2 0 + 51840 = N 1 0 + 52032 = N 2 0 + 52224 = N 1 0 + 52416 = N 0 0 + 52632 = N 0 0 + 52864 = N 0 0 + 52992 = N 0 0 + 53184 = N 0 0 + 53376 = N 1 0 + 53568 = N 1 0 + 53760 = N 2 0 + 53952 = N 2 0 + 54336 = N 1 0 + 54432 = S 2 768 + 54528 = N 2 0 + 54720 = N 1 0 + 54816 = N 0 0 + 55200 = E soloend + 55296 = N 0 0 + 55488 = N 2 0 + 55728 = N 1 240 + 56064 = N 2 0 + 56256 = N 1 0 + 56400 = N 0 336 + 56832 = N 0 0 + 57024 = N 1 0 + 57216 = N 2 192 + 57600 = N 2 0 + 57792 = N 1 0 + 57984 = N 0 288 + 58560 = N 1 0 + 58800 = N 0 144 + 59136 = N 1 0 + 59328 = N 2 0 + 59472 = N 0 144 + 59904 = N 2 0 + 60096 = N 1 0 + 60240 = N 2 0 + 60480 = N 0 0 + 60672 = N 1 0 + 60864 = N 0 0 + 61056 = N 2 0 + 61248 = N 1 0 + 61440 = N 2 0 + 61440 = S 2 1536 + 61440 = E solo + 61632 = N 1 0 + 61824 = N 0 144 + 62016 = N 0 0 + 62208 = N 1 0 + 62304 = N 1 0 + 62400 = N 2 0 + 62544 = N 1 0 + 62688 = N 0 0 + 62784 = N 1 0 + 63168 = N 2 0 + 63360 = N 1 0 + 63456 = N 0 192 + 63936 = N 0 0 + 64080 = N 1 0 + 64320 = N 1 0 + 64512 = N 0 0 + 64704 = N 1 0 + 64896 = N 2 0 + 65088 = N 1 0 + 65280 = N 0 0 + 65472 = N 1 0 + 65712 = N 2 0 + 65856 = N 1 48 + 66048 = N 0 0 + 66240 = N 2 0 + 66432 = N 1 256 + 66720 = N 1 0 + 66816 = N 0 0 + 66912 = N 0 0 + 67008 = N 1 0 + 67104 = N 1 0 + 67200 = N 1 0 + 67296 = N 2 0 + 67392 = N 2 0 + 67488 = N 2 0 + 67584 = N 3 0 + 67680 = N 2 0 + 67776 = N 1 0 + 67872 = N 1 0 + 67968 = N 0 160 + 68160 = N 2 0 + 68256 = N 1 0 + 68352 = N 0 0 + 68544 = N 1 0 + 68736 = N 1 0 + 68832 = N 2 160 + 69024 = N 3 0 + 69216 = N 3 0 + 69312 = N 2 112 + 69504 = N 1 160 + 69696 = N 2 0 + 69792 = N 1 0 + 69888 = N 0 0 + 69888 = S 2 768 + 70080 = N 0 0 + 70272 = N 1 0 + 70464 = N 2 0 + 70656 = N 3 0 + 70752 = N 2 0 + 70848 = N 1 160 + 71040 = N 3 0 + 71136 = N 2 0 + 71232 = N 0 160 + 71424 = N 3 0 + 71520 = N 1 0 + 71616 = N 0 160 + 71808 = N 2 0 + 71904 = N 1 0 + 72000 = N 0 160 + 72192 = N 1 0 + 72288 = N 3 0 + 72480 = N 0 160 + 72672 = N 2 0 + 72864 = N 1 160 + 73056 = N 3 0 + 73248 = N 2 0 + 73344 = N 2 160 + 73536 = N 3 0 + 73536 = N 5 0 + 73728 = N 3 0 + 73824 = N 2 0 + 73920 = N 1 0 + 74016 = N 2 0 + 74112 = N 0 0 + 74208 = N 0 0 + 74304 = N 1 0 + 74400 = N 2 0 + 74496 = N 1 0 + 74592 = N 2 0 + 74688 = N 3 0 + 74784 = N 1 0 + 74880 = N 2 192 + 75264 = N 3 0 + 75360 = N 2 0 + 75456 = N 1 0 + 75552 = N 0 0 + 75648 = N 3 0 + 75744 = N 2 0 + 75840 = N 1 0 + 75936 = N 2 160 + 76224 = N 1 0 + 76416 = N 2 160 + 76608 = N 1 256 + 76992 = N 1 0 + 77184 = N 2 0 + 77376 = N 0 0 + 77568 = N 2 0 + 77568 = S 2 768 + 77760 = N 2 0 + 77952 = N 2 112 + 78144 = N 1 160 + 78336 = N 0 0 + 78528 = N 1 0 + 78720 = N 2 0 + 78912 = N 0 0 + 79104 = N 1 0 + 79296 = N 2 0 + 79488 = N 1 0 + 79872 = N 2 0 + 80064 = N 0 0 + 80256 = N 2 0 + 80496 = N 1 0 + 80640 = N 0 0 + 80832 = N 2 0 + 81024 = N 0 0 + 81120 = N 1 0 + 81216 = N 2 0 + 81408 = N 2 160 + 81600 = N 0 0 + 81792 = N 1 160 + 81984 = N 0 0 + 82176 = N 2 160 + 82368 = N 0 0 + 82560 = N 2 160 + 82752 = N 1 0 + 82944 = N 1 160 + 83136 = N 0 0 + 83328 = N 2 160 + 83520 = N 0 0 + 83712 = N 2 160 + 83904 = N 1 0 + 84096 = N 2 192 + 84480 = N 2 160 + 84672 = N 2 160 + 84864 = N 1 160 + 85056 = N 1 160 + 85248 = N 0 160 + 85440 = N 0 288 + 85824 = E soloend + 86016 = N 1 0 + 86016 = S 2 1536 + 86208 = N 0 0 + 86400 = N 1 0 + 86784 = N 1 0 + 86976 = N 0 0 + 87168 = N 1 0 + 87360 = N 0 160 + 87552 = N 1 0 + 87744 = N 0 0 + 87936 = N 1 0 + 88320 = N 2 0 + 88512 = N 2 160 + 88704 = N 0 160 + 88896 = N 1 160 + 89088 = N 0 0 + 89280 = N 1 0 + 89472 = N 2 0 + 89664 = N 1 0 + 89856 = N 0 0 + 90048 = N 2 0 + 90240 = N 1 0 + 90432 = N 0 0 + 90624 = N 0 0 + 90816 = N 1 0 + 91008 = N 2 0 + 91392 = N 1 0 + 91584 = N 0 0 + 91776 = N 2 0 + 91968 = N 1 0 + 92208 = N 0 0 + 92352 = N 1 0 + 92544 = N 2 0 + 92688 = N 2 0 + 92832 = N 1 0 + 92976 = N 1 0 + 93120 = N 0 0 + 93264 = N 2 0 + 93504 = N 1 0 + 93696 = N 0 0 + 93696 = S 2 960 + 93888 = N 1 0 + 94080 = N 0 0 + 94272 = N 1 0 + 94464 = N 2 192 + 95040 = N 1 0 + 95232 = N 2 0 + 95424 = N 1 0 + 95616 = N 1 0 + 95808 = N 1 0 + 96000 = N 0 0 + 96192 = N 1 0 + 96384 = N 2 0 + 96768 = N 2 0 + 96960 = N 1 0 + 97152 = N 1 0 + 97344 = N 1 0 + 97536 = N 0 0 + 97728 = N 1 0 + 97920 = N 2 0 + 98304 = N 2 0 + 98496 = N 2 0 + 98688 = N 1 0 + 98880 = N 1 0 + 99072 = N 0 0 + 99264 = N 0 0 + 99456 = N 1 0 + 99648 = N 0 192 + 100032 = N 1 0 + 100224 = N 2 160 + 100416 = N 1 0 + 100512 = N 0 0 + 100608 = N 1 0 + 101376 = N 2 0 + 101376 = S 2 768 + 101664 = N 2 0 + 101952 = N 2 0 + 102240 = N 2 0 + 102528 = N 2 0 + 102720 = N 2 0 + 102912 = N 1 0 + 103200 = N 1 0 + 103488 = N 1 0 + 103776 = N 1 0 + 104064 = N 1 0 + 104256 = N 2 0 + 104448 = N 0 0 + 104736 = N 0 0 + 105024 = N 0 0 + 105312 = N 0 0 + 105600 = N 0 0 + 105792 = N 1 0 + 105984 = N 2 256 + 106272 = N 1 288 + 106272 = N 5 0 + 107568 = N 0 0 + 107760 = N 1 0 + 107904 = N 2 0 + 108096 = N 2 112 + 108288 = S 2 768 + 108336 = N 0 0 + 108528 = N 1 0 + 108768 = N 2 112 + 109296 = N 0 0 + 109584 = N 1 0 + 109872 = N 2 0 + 110016 = N 1 0 + 110112 = N 0 192 + 110640 = N 0 0 + 110832 = N 1 0 + 110976 = N 2 0 + 111168 = N 1 112 + 111408 = N 0 0 + 111648 = N 1 0 + 111840 = N 1 112 + 112320 = N 2 0 + 112464 = N 1 0 + 112704 = N 0 0 + 112896 = N 2 0 + 113088 = N 1 0 + 113184 = N 0 0 + 113664 = N 0 0 + 113856 = N 2 0 + 114096 = N 1 240 + 114432 = N 2 0 + 114624 = N 1 0 + 114768 = N 1 336 + 115200 = N 0 0 + 115392 = N 2 0 + 115632 = N 1 240 + 116016 = N 1 0 + 116160 = N 2 0 + 116448 = N 0 240 + 116736 = N 0 0 + 116736 = S 2 1536 + 116928 = N 2 0 + 117168 = N 1 144 + 117504 = N 0 0 + 117696 = N 1 0 + 117840 = N 2 192 + 118272 = N 0 0 + 118512 = N 1 0 + 118656 = N 0 0 + 118896 = N 1 0 + 119040 = N 2 0 + 119184 = N 1 0 + 119376 = N 2 240 + 119856 = N 0 0 + 120048 = N 1 0 + 120192 = N 2 0 + 120384 = N 2 112 + 120624 = N 0 0 + 120864 = N 1 0 + 121056 = N 1 112 + 121392 = N 2 0 + 121536 = N 1 0 + 121680 = N 1 0 + 121824 = N 0 0 + 122112 = N 2 0 + 122304 = N 1 0 + 122400 = N 0 0 + 122928 = N 0 0 + 123120 = N 1 0 + 123264 = N 2 0 + 123456 = N 1 112 + 123696 = N 0 0 + 123936 = N 1 0 + 124128 = N 1 112 + 124608 = N 2 0 + 124752 = N 1 0 + 124992 = N 0 0 + 125184 = N 2 0 + 125376 = N 1 0 + 125472 = N 0 0 + 125952 = N 2 0 + 126144 = N 1 0 + 126240 = N 0 0 + 126720 = N 2 0 + 126912 = N 1 0 + 127008 = N 0 0 + 127488 = N 1 0 + 127680 = N 0 0 + 127968 = N 2 1824 + 127968 = N 6 0 +} diff --git a/timestamp.cpp b/timestamp.cpp new file mode 100644 index 0000000..a39a527 --- /dev/null +++ b/timestamp.cpp @@ -0,0 +1,21 @@ +#include "timestamp.h" + +Timestamp::Timestamp(long int time, int tick, int nbpm): + time(time), tick(tick), nbpm(nbpm){}; + +int Timestamp::getTime(){ + return time; +} + +int Timestamp::getTick(){ + return tick; +} + +float Timestamp::getBPM(){ + return nbpm/1000; +} + +int Timestamp::getNbpm(){ + return nbpm; +} +// vim: syntax=cpp.doxygen diff --git a/timestamp.h b/timestamp.h new file mode 100644 index 0000000..6a7d363 --- /dev/null +++ b/timestamp.h @@ -0,0 +1,21 @@ +#ifndef TIMESTAMP_H +#define TIMESTAMP_H + +#include + +class Timestamp{ + public: + Timestamp(long int time, int tick, int nbpm); + int getTime(); + int getTick(); + float getBPM(); + int getNbpm(); // Weird chart formatting (133000 = 133 bpm) + private: + const long int time; // Time in the song in milliseconds + const int tick; // Current tick in the song + const int nbpm; // New BPM to change to +}; + +#include "timestamp.cpp" +#endif // TIMESTAMP_H +// vim: syntax=cpp.doxygen -- cgit v1.2.3 From 7fa3812f1297c444754f22c3141facecbda92ec7 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 21 Mar 2023 11:48:21 -0400 Subject: Trim ns to ms --- chordNote.cpp | 6 ++++++ chordNote.h | 5 +++-- main.cpp | 9 +++++++++ song.cpp | 6 ++++++ song.h | 1 + 5 files changed, 25 insertions(+), 2 deletions(-) (limited to 'song.cpp') diff --git a/chordNote.cpp b/chordNote.cpp index 8b0051c..1fa7549 100644 --- a/chordNote.cpp +++ b/chordNote.cpp @@ -94,6 +94,12 @@ void ChordNote::print(){ std::cout << "Start: " << start << " End: " << end << std::endl; } +// Trim all timings to milliseconds +void ChordNote::trim(){ + start = start/1000000; + end = end/1000000; +} + // }}} // vim: syntax=cpp.doxygen diff --git a/chordNote.h b/chordNote.h index 47ca43f..b66af06 100644 --- a/chordNote.h +++ b/chordNote.h @@ -16,8 +16,8 @@ class ChordNote { private: - const int start; // Time in Nanoseconds - const int end; // 0 if not set + int start; // Time in Nanoseconds + int end; // 0 if not set bool notes[5]; // Which notes are in the chord int renderStart; // Time in Nanoseconds // Chords are initialized with a single button. @@ -45,6 +45,7 @@ class ChordNote { // Misc: bool has(int note); // check if a note is in the chord void print(); // For debugging + void trim(); // Trim all timings to milliseconds }; //#include "chordNote.cpp" diff --git a/main.cpp b/main.cpp index c5e29cd..d72b1d0 100644 --- a/main.cpp +++ b/main.cpp @@ -75,6 +75,15 @@ int main() { repertoire.push_back(Song(songRoot + songFolders[i] + chartFile)); } + // Parse all the songs + for (int i = 0; i < repertoire.size(); i++) + { + repertoire[i].parseSync(); + repertoire[i].parseChords(0); + repertoire[i].consolidateChords(0); + repertoire[i].trim(0); + cout << repertoire[i].getTitle() << " parsed!" << endl; + } string displayString; diff --git a/song.cpp b/song.cpp index cdffddc..9ac5f91 100644 --- a/song.cpp +++ b/song.cpp @@ -321,5 +321,11 @@ std::string Song::getAudioFile(){ return audioFile; } +void Song::trim(int difficulty){ + // TODO: make this fuction use the difficulty parameter + std::vector*chords = &expert; + chords->trim(); +} + // vim: syntax=cpp.doxygen diff --git a/song.h b/song.h index db9bec4..5af5fbd 100644 --- a/song.h +++ b/song.h @@ -26,6 +26,7 @@ class Song{ void printChords(int difficulty); void consolidateChords(int difficulty); // Merge chords with same start/end times + void trim(int difficulty); // Trim chord timings from nanoseconds to milliseconds std::string getChartFile(); std::string getTitle(); -- cgit v1.2.3 From 1a9b75fc21606d8d9ebda3092c65989b3104d775 Mon Sep 17 00:00:00 2001 From: Simon Gagne Date: Tue, 21 Mar 2023 13:16:41 -0400 Subject: Merge chart file --- chordNote.cpp | 7 +++- main.cpp | 128 +++++++++++++++++++++++++++++----------------------------- song.cpp | 7 +++- song.h | 9 +++-- 4 files changed, 80 insertions(+), 71 deletions(-) (limited to 'song.cpp') diff --git a/chordNote.cpp b/chordNote.cpp index 1fa7549..3f1f795 100644 --- a/chordNote.cpp +++ b/chordNote.cpp @@ -96,8 +96,11 @@ void ChordNote::print(){ // Trim all timings to milliseconds void ChordNote::trim(){ - start = start/1000000; - end = end/1000000; + start = start/1000; + if (end != 0) + { + end = end / 1000; + } } // }}} diff --git a/main.cpp b/main.cpp index d72b1d0..9234ef7 100644 --- a/main.cpp +++ b/main.cpp @@ -85,59 +85,61 @@ int main() cout << repertoire[i].getTitle() << " parsed!" << endl; } + std::vector song = repertoire[0].expert; + string displayString; // Initialisation du port de communication //string com; //cout <<"Entrer le port de communication du Arduino: "; //cin >> com; - const int POWERUP_LENGTH = 10000; + const int POWERUP_LENGTH = 5000; const int NB_SQUARES = 50; - ChordNote note1(0, 5200, 5600); - ChordNote note2(0, 6000, 0); - ChordNote note3(0, 6600, 0); - ChordNote note4(0, 8000, 0); - ChordNote note5(0, 9000, 9600); - ChordNote note6(0, 10000, 0); - ChordNote note7(0, 11500, 12000); - ChordNote note8(0, 12400, 0); - ChordNote note9(0, 12600, 0); - ChordNote note10(0, 13000, 13400); - - ChordNote note11(0, 15200, 15600); - ChordNote note12(0, 16000, 0); - ChordNote note13(0, 16600, 0); - ChordNote note14(0, 18000, 0); - ChordNote note15(0, 19000, 19600); - ChordNote note16(0, 20000, 0); - ChordNote note17(0, 21500, 22000); - ChordNote note18(0, 22400, 0); - ChordNote note19(0, 22600, 0); - ChordNote note20(0, 23000, 23400); - - ChordNote note21(0, 25200, 25600); - ChordNote note22(0, 26000, 0); - ChordNote note23(0, 26600, 0); - ChordNote note24(0, 28000, 0); - ChordNote note25(0, 29000, 29600); - - - note2.toggle(0); - /*note2.change(0); - note7.change(2);*/ - - const int NB_NOTES = 25; - ChordNote song[NB_NOTES] = {note1, note2, note3, note4, note5, - note6, note7, note8, note9, note10, - note11, note12, note13, note14, note15, - note16, note17, note18, note19, note20, - note21, note22, note23, note24, note25}; - - const int FRAMERATE = 100; + //ChordNote note1(0, 5200, 5600); + //ChordNote note2(0, 6000, 0); + //ChordNote note3(0, 6600, 0); + //ChordNote note4(0, 8000, 0); + //ChordNote note5(0, 9000, 9600); + //ChordNote note6(0, 10000, 0); + //ChordNote note7(0, 11500, 12000); + //ChordNote note8(0, 12400, 0); + //ChordNote note9(0, 12600, 0); + //ChordNote note10(0, 13000, 13400); + + //ChordNote note11(0, 15200, 15600); + //ChordNote note12(0, 16000, 0); + //ChordNote note13(0, 16600, 0); + //ChordNote note14(0, 18000, 0); + //ChordNote note15(0, 19000, 19600); + //ChordNote note16(0, 20000, 0); + //ChordNote note17(0, 21500, 22000); + //ChordNote note18(0, 22400, 0); + //ChordNote note19(0, 22600, 0); + //ChordNote note20(0, 23000, 23400); + + //ChordNote note21(0, 25200, 25600); + //ChordNote note22(0, 26000, 0); + //ChordNote note23(0, 26600, 0); + //ChordNote note24(0, 28000, 0); + //ChordNote note25(0, 29000, 29600); + + + //note2.toggle(0); + ///*note2.change(0); + //note7.change(2);*/ + + //const int NB_NOTES = 25; + //ChordNote song[NB_NOTES] = {note1, note2, note3, note4, note5, + // note6, note7, note8, note9, note10, + // note11, note12, note13, note14, note15, + // note16, note17, note18, note19, note20, + // note21, note22, note23, note24, note25}; + + const int FRAMERATE = 50; int renderStart = FRAMERATE * (NB_SQUARES); - for (int i = 0; i < NB_NOTES; i++) + for (int i = 0; i < song.size(); i++) { song[i].setRenderStart(renderStart); } @@ -186,7 +188,7 @@ int main() int lastCorrectHoldTime = 0; int powerupStartTime = 0; - int multiplier = 1; + int powerupModifier = 1; std::thread worker(RcvJsonThread); @@ -195,7 +197,8 @@ int main() auto currentTime = chrono::steady_clock::now(); totalDiff = int(std::chrono::duration_cast (currentTime - startTime).count()); - if(totalDiff > 30000)//End of song + //if(totalDiff > 30000)//End of song + if (nextNoteToPlay == song.size()) { isThreadOver = true; worker.join(); @@ -210,7 +213,7 @@ int main() //CHECK NOTES INPUT int nextNoteStart = song[nextNoteToPlay].getStart(); - if (abs(nextNoteStart - diffSinceBeginning) < 25 && nextNoteToPlay < NB_NOTES) + if (abs(nextNoteStart - diffSinceBeginning) < 25 && nextNoteToPlay < song.size()) { bool isNotePlayedCorrectly = ComparePlayedNotes(song[nextNoteToPlay], false); //TODO. DEVRA ETRE A TRUE if (isNotePlayedCorrectly) @@ -222,12 +225,7 @@ int main() { if (notes[i]) { - multiplier = 1; - if (IsInPowerup) - { - multiplier = 2; - } - points += 100 * multiplier; + points += 100 * powerupModifier; } } nextNoteToPlay++; @@ -236,7 +234,7 @@ int main() hasLetGoHold = false; } } - else if (nextNoteStart < diffSinceBeginning && nextNoteToPlay < NB_NOTES) + else if (nextNoteStart < diffSinceBeginning && nextNoteToPlay < song.size()) { nextNoteToPlay++; NotesCorrectStreak = 0; @@ -268,12 +266,7 @@ int main() nbHeldNotes++; } } - multiplier = 1; - if (IsInPowerup) - { - multiplier = 2; - } - points += ((diffSinceBeginning - lastCorrectHoldTime) * nbHeldNotes) * multiplier; + points += ((diffSinceBeginning - lastCorrectHoldTime) * nbHeldNotes) * powerupModifier; } lastCorrectHoldTime = diffSinceBeginning; } @@ -284,15 +277,17 @@ int main() } } - if (IsShaking && LedState == 10) + if (!IsInPowerup && IsShaking && LedState == 10) { IsInPowerup = true; powerupStartTime = diffSinceBeginning; + powerupModifier = 2; } if (IsInPowerup && diffSinceBeginning - powerupStartTime > POWERUP_LENGTH) { IsInPowerup = false; BargraphNeedReset = true; + powerupModifier = 1; } //Gestion affichage @@ -384,20 +379,23 @@ int main() string ledStateString = to_string(LedState); string streakString = to_string(NotesCorrectStreak); string holdTimeString = to_string(points); - string multiplierString = to_string(multiplier); + string powerupModifierString = to_string(powerupModifier); displayString += "Timestamp " + timestampString.substr(0, timestampString.find(".")) + " ms\n"; displayString += "Nb LEDs : " + ledStateString.substr(0, ledStateString.find(".")) + "/10\n"; displayString += "Nb notes de suite : " + streakString.substr(0, streakString.find(".")) + "\n"; displayString += "Points : " + holdTimeString.substr(0, holdTimeString.find(".")) + "\n"; if (IsInPowerup) { - displayString += "Multiplicateur : x" + multiplierString.substr(0, multiplierString.find(".")) + " --- POWERUP !!!!!\n"; + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- POWERUP !!!!!\n"; } else { - displayString += "Multiplicateur : x" + multiplierString.substr(0, multiplierString.find(".")) + "\n"; + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + "\n"; } + string IsShakingString = to_string(IsShaking); + displayString += "IsShaking : " + IsShakingString.substr(0, IsShakingString.find(".")) + "\n"; + cout << displayString; } } @@ -492,6 +490,10 @@ int main() JoyDir = json_recu[JOY_DIR]; IsShaking = json_recu[ACCEL]; + if (IsShaking) + { + cout << "SENSIBILITE BEN TROP BASSE" << endl; + } /*if(led_state == 10) //lorsque la dixieme led est allumee { diff --git a/song.cpp b/song.cpp index 9ac5f91..84c962d 100644 --- a/song.cpp +++ b/song.cpp @@ -323,8 +323,11 @@ std::string Song::getAudioFile(){ void Song::trim(int difficulty){ // TODO: make this fuction use the difficulty parameter - std::vector*chords = &expert; - chords->trim(); + //std::vector *chords = &expert; + for (int i = 0; i < expert.size(); i++) + { + expert[i].trim(); + } } diff --git a/song.h b/song.h index 5af5fbd..69cdbd5 100644 --- a/song.h +++ b/song.h @@ -37,6 +37,11 @@ class Song{ std::string getGenre(); std::string getAudioFile(); + std::vector easy; + std::vector medium; + std::vector hard; + std::vector expert; + private: const std::string chartFile; std::string title; @@ -49,10 +54,6 @@ class Song{ bool difficulty[4]; // Which difficulties are available int resolution; std::vector timestamps; - std::vector easy; - std::vector medium; - std::vector hard; - std::vector expert; }; //#include "song.cpp" -- cgit v1.2.3 From e169020157fae20f21f1f9e244cb86ca049176e8 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 21 Mar 2023 14:59:14 -0400 Subject: Song methods utilize the difficulty parameter --- song.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++----------- song.h | 24 +++++++++++----------- 2 files changed, 72 insertions(+), 24 deletions(-) (limited to 'song.cpp') diff --git a/song.cpp b/song.cpp index 84c962d..ba1dcd8 100644 --- a/song.cpp +++ b/song.cpp @@ -156,18 +156,31 @@ void Song::printTimestamps(){ } bool Song::parseChords(int difficulty){ - // List of chords for each difficulty - const std::vector *chordDifficulties[4]={&easy,&medium,&hard,&expert}; - // List of patterns to stringPattern - const std::string patterns[4] = { - "EasySingle", "MediumSingle", "HardSingle", "ExpertSingle" - }; - // We set the stringPattern to match depending on the difficulty - /* std::string stringPattern = patterns[difficulty]; */ - std::string stringPattern = "ExpertSingle"; // We set a chord vector to store point to the correct difficulty vector - /* std::vector*chords=(std::vector*)chordDifficulties[difficulty]; */ - std::vector*chords = &expert; + std::vector*chords; + // We set the stringPattern to match depending on the difficulty + std::string stringPattern; + switch (difficulty){ + case DIFFICULTY_EASY: + stringPattern = "EasySingle"; + std::vector*chords = &easy; + break; + case DIFFICULTY_MEDIUM: + stringPattern = "MediumSingle"; + std::vector*chords = &medium; + break; + case DIFFICULTY_HARD: + stringPattern = "HardSingle"; + std::vector*chords = &hard; + break; + case DIFFICULTY_EXPERT: + stringPattern = "ExpertSingle"; + std::vector*chords = &expert; + break; + default: + std::cerr << "Invalid difficulty" << std::endl; + return false; + } // We open the chart file std::ifstream file(chartFile); if (!file.is_open()) { @@ -231,6 +244,23 @@ bool Song::parseChords(int difficulty){ #endif // DEBUG // Create a new chord and add it to the vector chords->push_back(ChordNote(fret, chordTime, chordEnd)); + /* switch (difficulty){ */ + /* case DIFFICULTY_EASY: */ + /* easy.push_back(ChordNote(fret, chordTime, chordEnd)); */ + /* break; */ + /* case DIFFICULTY_MEDIUM: */ + /* medium.push_back(ChordNote(fret, chordTime, chordEnd)); */ + /* break; */ + /* case DIFFICULTY_HARD: */ + /* hard.push_back(ChordNote(fret, chordTime, chordEnd)); */ + /* break; */ + /* case DIFFICULTY_EXPERT: */ + /* expert.push_back(ChordNote(fret, chordTime, chordEnd)); */ + /* break; */ + /* default: */ + /* std::cerr << "Invalid difficulty" << std::endl; */ + /* return false; */ + /* } */ } else if (line.find("[") != std::string::npos) return true; } @@ -242,7 +272,24 @@ bool Song::parseChords(int difficulty){ void Song::consolidateChords(int difficulty){ // TODO: make this fuction use the difficulty parameter - std::vector*chords = &expert; + std::vector*chords; + switch (difficulty){ + case DIFFICULTY_EASY: + std::vector*chords = &easy; + break; + case DIFFICULTY_MEDIUM: + std::vector*chords = &medium; + break; + case DIFFICULTY_HARD: + std::vector*chords = &hard; + break; + case DIFFICULTY_EXPERT: + std::vector*chords = &expert; + break; + default: + std::cerr << "Invalid difficulty" << std::endl; + return; + } // Number of chords in the vector int chordSize = chords->size(); // Go through all the chords @@ -282,6 +329,7 @@ void Song::consolidateChords(int difficulty){ } void Song::printChords(int difficulty){ + // TODO: make this fuction use the difficulty parameter for (int i=0; i easy; std::vector medium; std::vector hard; std::vector expert; - private: const std::string chartFile; std::string title; -- cgit v1.2.3 From a00db59c676a0f3c06525ee7f423fdfb7b40c3cf Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 21 Mar 2023 16:41:34 -0400 Subject: Handle audiofile path --- main.cpp | 2 ++ song.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'song.cpp') diff --git a/main.cpp b/main.cpp index 9234ef7..2e80ac1 100644 --- a/main.cpp +++ b/main.cpp @@ -176,6 +176,8 @@ int main() json j_msg_send, j_msg_rcv; auto startTime = chrono::steady_clock::now(); + // TODO: Check if this command works as intended: + /* PlaySound(TEXT(song.getAudioFile().c_str()), NULL, SND_ASYNC); */ double totalDiff = 0; auto lastPrintTime = chrono::steady_clock::now();; bool SongNotDone = true; diff --git a/song.cpp b/song.cpp index ba1dcd8..14ac92d 100644 --- a/song.cpp +++ b/song.cpp @@ -9,6 +9,9 @@ #include "common.h" Song::Song(std::string chartFile): chartFile(chartFile){ + // substitute "notes.chart" for "song.wav" + string audioFile = chartFile; + audioFile.replace(audioFile.find("notes.chart"), 12, "song.wav"); parseInfo(); parseSync(); /* for(int i = 0; i < 4; i++){ */ @@ -271,7 +274,6 @@ bool Song::parseChords(int difficulty){ void Song::consolidateChords(int difficulty){ - // TODO: make this fuction use the difficulty parameter std::vector*chords; switch (difficulty){ case DIFFICULTY_EASY: -- cgit v1.2.3 From d14d5abf66098c13440a6d035c4b503a00086ce5 Mon Sep 17 00:00:00 2001 From: Simon Gagne Date: Wed, 22 Mar 2023 23:03:32 -0400 Subject: Synchro Strumming + ajout menu Keyboard --- main.cpp | 886 +++++++++++++++++++++++++++++++++++++++++---------------------- song.cpp | 41 ++- 2 files changed, 611 insertions(+), 316 deletions(-) (limited to 'song.cpp') diff --git a/main.cpp b/main.cpp index 2e80ac1..b298db0 100644 --- a/main.cpp +++ b/main.cpp @@ -37,7 +37,10 @@ bool RcvFromSerial(SerialPort *arduino, string &msg); void RcvJsonThread(); bool ComparePlayedNotes(ChordNote note, bool strumNeeded); bool CompareIndividualButton(bool wantedValue, int buttonState); +bool CompareStrums(); int GetLedState(); +int displayMenu(); +bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector repo); /*---------------------------- Variables globales ---------------------------*/ SerialPort * arduino; //doit etre un objet global! @@ -54,20 +57,25 @@ int IsShaking = 0; int NotesCorrectStreak = 0; bool BargraphNeedReset = false; bool IsInPowerup = false; +int consecutiveStrumUP = 0; +int consecutiveStrumDN = 0; bool isThreadOver = false; int StreakWhenLastSend = 0; +bool isSameStrumUP = true; +bool isSameStrumDN = true; + int main() { vector repertoire; //Liste des chansons disponibles: vector songFolders; //Liste des dossiers chansons disponibles: songFolders.push_back("\\Maynard-Ferguson-Birdland\\"); - songFolders.push_back("\\Maynard-Ferguson-Country-Road-(James-Taylor-Cover)\\"); - songFolders.push_back("\\Maynard-Ferguson-Theme-From-Shaft\\"); - songFolders.push_back("\\Owane-Rock-Is-Too-Heavy\\"); - songFolders.push_back("\\Stevie-Wonder-Contusion\\"); - songFolders.push_back("\\Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)\\"); + //songFolders.push_back("\\Maynard-Ferguson-Country-Road-(James-Taylor-Cover)\\"); + //songFolders.push_back("\\Maynard-Ferguson-Theme-From-Shaft\\"); + //songFolders.push_back("\\Owane-Rock-Is-Too-Heavy\\"); + //songFolders.push_back("\\Stevie-Wonder-Contusion\\"); + //songFolders.push_back("\\Victor-Wooten-and-Steve-Bailey-A-Chick-from-Corea-(Live)\\"); string songRoot = "..\\songs"; string chartFile = "notes.chart"; @@ -76,329 +84,340 @@ int main() repertoire.push_back(Song(songRoot + songFolders[i] + chartFile)); } // Parse all the songs - for (int i = 0; i < repertoire.size(); i++) - { - repertoire[i].parseSync(); - repertoire[i].parseChords(0); - repertoire[i].consolidateChords(0); - repertoire[i].trim(0); - cout << repertoire[i].getTitle() << " parsed!" << endl; - } - - std::vector song = repertoire[0].expert; - - string displayString; - - // Initialisation du port de communication - //string com; - //cout <<"Entrer le port de communication du Arduino: "; - //cin >> com; - const int POWERUP_LENGTH = 5000; - - const int NB_SQUARES = 50; - //ChordNote note1(0, 5200, 5600); - //ChordNote note2(0, 6000, 0); - //ChordNote note3(0, 6600, 0); - //ChordNote note4(0, 8000, 0); - //ChordNote note5(0, 9000, 9600); - //ChordNote note6(0, 10000, 0); - //ChordNote note7(0, 11500, 12000); - //ChordNote note8(0, 12400, 0); - //ChordNote note9(0, 12600, 0); - //ChordNote note10(0, 13000, 13400); - - //ChordNote note11(0, 15200, 15600); - //ChordNote note12(0, 16000, 0); - //ChordNote note13(0, 16600, 0); - //ChordNote note14(0, 18000, 0); - //ChordNote note15(0, 19000, 19600); - //ChordNote note16(0, 20000, 0); - //ChordNote note17(0, 21500, 22000); - //ChordNote note18(0, 22400, 0); - //ChordNote note19(0, 22600, 0); - //ChordNote note20(0, 23000, 23400); - - //ChordNote note21(0, 25200, 25600); - //ChordNote note22(0, 26000, 0); - //ChordNote note23(0, 26600, 0); - //ChordNote note24(0, 28000, 0); - //ChordNote note25(0, 29000, 29600); - - - //note2.toggle(0); - ///*note2.change(0); - //note7.change(2);*/ - - //const int NB_NOTES = 25; - //ChordNote song[NB_NOTES] = {note1, note2, note3, note4, note5, - // note6, note7, note8, note9, note10, - // note11, note12, note13, note14, note15, - // note16, note17, note18, note19, note20, - // note21, note22, note23, note24, note25}; - - const int FRAMERATE = 50; - int renderStart = FRAMERATE * (NB_SQUARES); - - for (int i = 0; i < song.size(); i++) + for (int difficulty = 0; difficulty < 4; difficulty++) { - song[i].setRenderStart(renderStart); + for (int i = 0; i < repertoire.size(); i++) + { + repertoire[i].parseSync(); + repertoire[i].parseChords(difficulty); + repertoire[i].consolidateChords(difficulty); + repertoire[i].trim(difficulty); + cout << repertoire[i].getTitle() << " parsed!" << endl; + } } - /*note1.setRenderStart(renderStart); - note2.setRenderStart(renderStart); - note3.setRenderStart(renderStart); - note4.setRenderStart(renderStart); - note5.setRenderStart(renderStart); - note6.setRenderStart(renderStart); - note7.setRenderStart(renderStart); - note8.setRenderStart(renderStart); - note9.setRenderStart(renderStart); - note10.setRenderStart(renderStart);*/ - - string displayArray[NB_SQUARES + 1][5]; - for (int i = 0; i < NB_SQUARES + 1; i++) + int songIndex; + int difficulty; + bool wantToPlay = MenuInitialisation(songIndex, difficulty, repertoire); + if (wantToPlay) { - for (int j = 0; j < 5; j++) + std::vector song; + switch (difficulty) { - displayArray[i][j] = " "; + case (DIFFICULTY_EASY): + song = repertoire[songIndex].easy; + break; + case (DIFFICULTY_MEDIUM): + song = repertoire[songIndex].medium; + break; + case (DIFFICULTY_HARD): + song = repertoire[songIndex].hard; + break; + case (DIFFICULTY_EXPERT): + song = repertoire[songIndex].expert; + break; + default: + std::cerr << "Invalid difficulty" << std::endl; + return 1; } - } - string com = "com7"; - arduino = new SerialPort(com.c_str(), BAUD); - if(!arduino->isConnected()){ - cerr << "Impossible de se connecter au port "<< string(com.c_str()) <<". Fermeture du programme!" <(currentTime - startTime).count()); + if (!arduino->isConnected()) { + cerr << "Impossible de se connecter au port " << string(com.c_str()) << ". Fermeture du programme!" << endl; + exit(1); + } - //if(totalDiff > 30000)//End of song - if (nextNoteToPlay == song.size()) + // Structure de donnees JSON pour envoie et reception + json j_msg_send, j_msg_rcv; + + auto startTime = chrono::steady_clock::now(); + // TODO: Check if this command works as intended: + /* PlaySound(TEXT(song.getAudioFile().c_str()), NULL, SND_ASYNC); */ + double totalDiff = 0; + auto lastPrintTime = chrono::steady_clock::now();; + bool SongNotDone = true; + + int nextRenderNoteIndex = 0; + int nextNoteToPlay = 0; + //int nbNotesCorrect = 0; + int points = 0; + bool hasLetGoHold = false; + int lastCorrectHoldTime = 0; + bool isPreviousNoteReussie = false; + + int powerupStartTime = 0; + int powerupModifier = 1; + int NbNotesReussies = 0; + + int endOfSong = song[song.size() - 1].getEnd(); + if (endOfSong == 0) { - isThreadOver = true; - worker.join(); - SongNotDone = false; + endOfSong = song[song.size() - 1].getStart(); } - else - { - auto newCheckTime = chrono::steady_clock::now(); + endOfSong += 500; - int diffSinceBeginning = int(std::chrono::duration_cast (newCheckTime - startTime).count()); + std::thread worker(RcvJsonThread); - //CHECK NOTES INPUT - int nextNoteStart = song[nextNoteToPlay].getStart(); + while (SongNotDone) + { + auto currentTime = chrono::steady_clock::now(); + totalDiff = int(std::chrono::duration_cast (currentTime - startTime).count()); - if (abs(nextNoteStart - diffSinceBeginning) < 25 && nextNoteToPlay < song.size()) + if(totalDiff > endOfSong)//End of song + //if (nextNoteToPlay == song.size()) { - bool isNotePlayedCorrectly = ComparePlayedNotes(song[nextNoteToPlay], false); //TODO. DEVRA ETRE A TRUE - if (isNotePlayedCorrectly) - { - //cout << " REUSSI A " << diffSinceBeginning << endl; - //nbNotesCorrect++; - bool* notes = song[nextNoteToPlay].getNotes(); - for (int i = 0; i < 5; i++) - { - if (notes[i]) - { - points += 100 * powerupModifier; - } - } - nextNoteToPlay++; - NotesCorrectStreak++; - lastCorrectHoldTime = diffSinceBeginning; - hasLetGoHold = false; - } + isThreadOver = true; + worker.join(); + SongNotDone = false; } - else if (nextNoteStart < diffSinceBeginning && nextNoteToPlay < song.size()) + else { - nextNoteToPlay++; - NotesCorrectStreak = 0; - StreakWhenLastSend = 0; - //Enlever des points ???? - } + auto newCheckTime = chrono::steady_clock::now(); - //Gestion des longues notes - int previousNoteEnd = 0; - if (nextNoteToPlay > 0) - { - previousNoteEnd = song[nextNoteToPlay - 1].getEnd(); - } - if (previousNoteEnd > 0 && previousNoteEnd > diffSinceBeginning) - { - if (!hasLetGoHold) + int diffSinceBeginning = int(std::chrono::duration_cast (newCheckTime - startTime).count()); + + //CHECK NOTES INPUT + if (nextNoteToPlay < song.size()) { - bool isHeldNotePlayedCorrectly = ComparePlayedNotes(song[nextNoteToPlay - 1], false); - if (isHeldNotePlayedCorrectly) + int nextNoteStart = song[nextNoteToPlay].getStart(); + + if (abs(nextNoteStart - diffSinceBeginning) < 25 && nextNoteToPlay < song.size()) { - if (lastCorrectHoldTime >= song[nextNoteToPlay - 1].getStart()) + bool isNotePlayedCorrectly = ComparePlayedNotes(song[nextNoteToPlay], true); //TODO. DEVRA ETRE A TRUE + if (isNotePlayedCorrectly) { - bool* notes = song[nextNoteToPlay - 1].getNotes(); - int nbHeldNotes = 0; - for (int i = 0; i < 5; i++) + bool isStrummed = CompareStrums(); + if (isStrummed) { - if (notes[i]) + //cout << " REUSSI A " << diffSinceBeginning << endl; + NbNotesReussies++; + bool* notes = song[nextNoteToPlay].getNotes(); + for (int i = 0; i < 5; i++) { - nbHeldNotes++; + if (notes[i]) + { + points += 100 * powerupModifier; + } } + nextNoteToPlay++; + NotesCorrectStreak++; + isPreviousNoteReussie = true; + lastCorrectHoldTime = diffSinceBeginning; + hasLetGoHold = false; } - points += ((diffSinceBeginning - lastCorrectHoldTime) * nbHeldNotes) * powerupModifier; } - lastCorrectHoldTime = diffSinceBeginning; } else { - hasLetGoHold = true; + bool isStrumming = CompareStrums(); + if (isStrumming) + { + NotesCorrectStreak = 0; + StreakWhenLastSend = 0; + points -= 10; + } + if (nextNoteStart < diffSinceBeginning && nextNoteToPlay < song.size()) + { + nextNoteToPlay++; + NotesCorrectStreak = 0; + StreakWhenLastSend = 0; + isPreviousNoteReussie = false; + } } } - } - - if (!IsInPowerup && IsShaking && LedState == 10) - { - IsInPowerup = true; - powerupStartTime = diffSinceBeginning; - powerupModifier = 2; - } - if (IsInPowerup && diffSinceBeginning - powerupStartTime > POWERUP_LENGTH) - { - IsInPowerup = false; - BargraphNeedReset = true; - powerupModifier = 1; - } - //Gestion affichage - if(diffSinceBeginning % FRAMERATE == 0) - { - //system("cls"); - displayString.clear(); - lastPrintTime = newCheckTime; - if (nextRenderNoteIndex > 0) + //Gestion des longues notes + int previousNoteEnd = 0; + if (nextNoteToPlay > 0) { - int previousNoteRenderStart = song[nextRenderNoteIndex -1].getRenderStart(); - int previousNoteEnd = song[nextRenderNoteIndex - 1].getEnd(); - int previousNoteLength; - if (previousNoteEnd == 0) - { - previousNoteLength = 0; - } - else - { - previousNoteLength = previousNoteEnd - song[nextRenderNoteIndex - 1].getStart(); - } - if ((diffSinceBeginning - previousNoteRenderStart) < previousNoteLength) + previousNoteEnd = song[nextNoteToPlay - 1].getEnd(); + } + if (previousNoteEnd > 0 && previousNoteEnd > diffSinceBeginning) + { + if (!hasLetGoHold && isPreviousNoteReussie) { - bool* notes = song[nextRenderNoteIndex - 1].getNotes(); - for (int j = 0; j < 5; j++) + bool isHeldNotePlayedCorrectly = ComparePlayedNotes(song[nextNoteToPlay - 1], false); + if (isHeldNotePlayedCorrectly) { - if (notes[j]) + if (lastCorrectHoldTime >= song[nextNoteToPlay - 1].getStart()) { - displayArray[0][j] = "|"; + bool* notes = song[nextNoteToPlay - 1].getNotes(); + int nbHeldNotes = 0; + for (int i = 0; i < 5; i++) + { + if (notes[i]) + { + nbHeldNotes++; + } + } + points += ((diffSinceBeginning - lastCorrectHoldTime) * nbHeldNotes) * powerupModifier; } + lastCorrectHoldTime = diffSinceBeginning; + } + else + { + hasLetGoHold = true; } } } - if (abs(song[nextRenderNoteIndex].getRenderStart() - diffSinceBeginning) < 25) + if (!IsInPowerup && IsShaking && LedState == 10) + { + IsInPowerup = true; + powerupStartTime = diffSinceBeginning; + powerupModifier = 2; + } + if (IsInPowerup && diffSinceBeginning - powerupStartTime > POWERUP_LENGTH) + { + IsInPowerup = false; + BargraphNeedReset = true; + powerupModifier = 1; + } + + /*cout << "StrumUp : " << StrumUp << " --- "; + cout << "StrumDn : " << StrumDown << endl;*/ + + //Gestion affichage + if (diffSinceBeginning % FRAMERATE == 0) { - bool* notes = song[nextRenderNoteIndex].getNotes(); - for (int j = 0; j < 5; j++) + //system("cls"); + displayString.clear(); + lastPrintTime = newCheckTime; + if (nextRenderNoteIndex > 0) { - if (notes[j]) + int previousNoteRenderStart = song[nextRenderNoteIndex - 1].getRenderStart(); + int previousNoteEnd = song[nextRenderNoteIndex - 1].getEnd(); + int previousNoteLength; + if (previousNoteEnd == 0) + { + previousNoteLength = 0; + } + else { - displayArray[0][j] = "X"; + previousNoteLength = previousNoteEnd - song[nextRenderNoteIndex - 1].getStart(); + } + if ((diffSinceBeginning - previousNoteRenderStart) < previousNoteLength) + { + bool* notes = song[nextRenderNoteIndex - 1].getNotes(); + for (int j = 0; j < 5; j++) + { + if (notes[j]) + { + displayArray[0][j] = "|"; + } + } } } - nextRenderNoteIndex++; - } - //printing - for (int i = 0; i < NB_SQUARES + 1; i++) - { - for (int j = 0; j < 5; j++) + if (nextRenderNoteIndex < song.size()) { - if (i == NB_SQUARES - 1) + if (abs(song[nextRenderNoteIndex].getRenderStart() - diffSinceBeginning) < 25) { - displayString += "|_" + displayArray[i][j] + "_"; + bool* notes = song[nextRenderNoteIndex].getNotes(); + for (int j = 0; j < 5; j++) + { + if (notes[j]) + { + displayArray[0][j] = "X"; + } + } + nextRenderNoteIndex++; } - else + else if (song[nextRenderNoteIndex].getRenderStart() < diffSinceBeginning && nextRenderNoteIndex < song.size()) { - displayString += "| " + displayArray[i][j] + " "; + nextRenderNoteIndex++; } } - displayString += "|\n"; - } + + //printing + for (int i = 0; i < NB_SQUARES + 1; i++) + { + for (int j = 0; j < 5; j++) + { + if (i == NB_SQUARES - 1) + { + displayString += "|_" + displayArray[i][j] + "_"; + } + else + { + displayString += "| " + displayArray[i][j] + " "; + } + } + displayString += "|\n"; + } - //Reordering - int reorderingIndex = NB_SQUARES; - while (reorderingIndex > 0) - { - string temp[5]; - for (int i = 0; i < 5; i++) + //Reordering + int reorderingIndex = NB_SQUARES; + while (reorderingIndex > 0) { - temp[i] = displayArray[reorderingIndex - 1][i]; + string temp[5]; + for (int i = 0; i < 5; i++) + { + temp[i] = displayArray[reorderingIndex - 1][i]; + } + for (int i = 0; i < 5; i++) + { + displayArray[reorderingIndex][i] = temp[i]; + } + reorderingIndex--; } - for (int i = 0; i < 5; i++) + displayArray[0][0] = " "; + displayArray[0][1] = " "; + displayArray[0][2] = " "; + displayArray[0][3] = " "; + displayArray[0][4] = " "; + + displayString += "\n"; + string timestampString = to_string(diffSinceBeginning); + string ledStateString = to_string(LedState); + string streakString = to_string(NotesCorrectStreak); + string holdTimeString = to_string(points); + string powerupModifierString = to_string(powerupModifier); + displayString += "Timestamp " + timestampString.substr(0, timestampString.find(".")) + " ms\n"; + displayString += "Nb LEDs : " + ledStateString.substr(0, ledStateString.find(".")) + "/10\n"; + displayString += "Nb notes de suite : " + streakString.substr(0, streakString.find(".")) + "\n"; + displayString += "Points : " + holdTimeString.substr(0, holdTimeString.find(".")) + "\n"; + if (IsInPowerup) { - displayArray[reorderingIndex ][i] = temp[i]; + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- POWERUP !!!!!\n"; + } + else + { + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + "\n"; } - reorderingIndex--; - } - displayArray[0][0] = " "; - displayArray[0][1] = " "; - displayArray[0][2] = " "; - displayArray[0][3] = " "; - displayArray[0][4] = " "; - - displayString += "\n"; - string timestampString = to_string(diffSinceBeginning); - string ledStateString = to_string(LedState); - string streakString = to_string(NotesCorrectStreak); - string holdTimeString = to_string(points); - string powerupModifierString = to_string(powerupModifier); - displayString += "Timestamp " + timestampString.substr(0, timestampString.find(".")) + " ms\n"; - displayString += "Nb LEDs : " + ledStateString.substr(0, ledStateString.find(".")) + "/10\n"; - displayString += "Nb notes de suite : " + streakString.substr(0, streakString.find(".")) + "\n"; - displayString += "Points : " + holdTimeString.substr(0, holdTimeString.find(".")) + "\n"; - if (IsInPowerup) - { - displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- POWERUP !!!!!\n"; - } - else - { - displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + "\n"; - } - string IsShakingString = to_string(IsShaking); - displayString += "IsShaking : " + IsShakingString.substr(0, IsShakingString.find(".")) + "\n"; + string IsShakingString = to_string(IsShaking); + displayString += "IsShaking : " + IsShakingString.substr(0, IsShakingString.find(".")) + "\n"; - cout << displayString; + cout << displayString; + } } } } @@ -487,56 +506,51 @@ int main() Fret3 = json_recu[FRET3]; Fret4 = json_recu[FRET4]; Fret5 = json_recu[FRET5]; - StrumUp = json_recu[STRUM_UP]; - StrumDown = json_recu[STRUM_DN]; - JoyDir = json_recu[JOY_DIR]; - IsShaking = json_recu[ACCEL]; + /*StrumUp = json_recu[STRUM_UP]; + StrumDown = json_recu[STRUM_DN];*/ - if (IsShaking) + int tempStrumUP = json_recu[STRUM_UP]; + if (tempStrumUP == 1) { - cout << "SENSIBILITE BEN TROP BASSE" << endl; + if (consecutiveStrumUP > 0) + { + StrumUp = 0; + } + else { + StrumUp = 1; + consecutiveStrumUP++; + isSameStrumUP = false; + } } - - /*if(led_state == 10) //lorsque la dixieme led est allumee - { - start = std::chrono::steady_clock::now(); // debute le chrono + else{ + StrumUp = 0; + consecutiveStrumUP = 0; } - if(Fret1 != 0) //verifie la valeur de fret1 + int tempStrumDown = json_recu[STRUM_DN]; + if (tempStrumDown == 1) { - now = std::chrono::steady_clock::now(); - - double elapsed_time_ms = double(std::chrono::duration_cast (now - start).count()); - std::cout << "Temps ecouleyy : " << elapsed_time_ms/1e3 << " secondes" << std::endl; - }*/ - /*if (JoyDir == 4) - { - led_state += 1; - } - - if (JoyDir == 3) - { - led_state -= 1; + if (consecutiveStrumDN > 0) + { + StrumDown = 0; + } + else { + StrumDown = 1; + consecutiveStrumDN++; + isSameStrumDN = false; + } } - - if (JoyDir == 2) - { - led_state = 0; - } - - if (JoyDir == 1) - { - led_state = 10; + else { + StrumDown = 0; + consecutiveStrumDN = 0; } - if (led_state > 10) - { - led_state = 0; - } + JoyDir = json_recu[JOY_DIR]; + IsShaking = json_recu[ACCEL]; - if (led_state < 0) + /*if (IsShaking) { - led_state = 10; + cout << "SENSIBILITE BEN TROP BASSE" << endl; }*/ } Sleep(1); @@ -556,22 +570,71 @@ int main() if (comp1 && comp2 && comp3 && comp4 && comp5) { - if (strumNeeded) + correctlyPlayed = true; + /*if (strumNeeded) { bool compDown = CompareIndividualButton(true, StrumDown); + if (isSameStrumDN && compDown) + { + compDown = false; + } + else { + isSameStrumDN = true; + } bool compUp = CompareIndividualButton(true, StrumUp); + if (isSameStrumUP && compDown) + { + compUp = false; + } + else { + isSameStrumUP = true; + } - if (compDown || compUp) + if (!compDown && !compUp) { - correctlyPlayed = true; + correctlyPlayed = false; } - } - correctlyPlayed = true; + }*/ } return correctlyPlayed; } + bool CompareStrums() + { + bool correctlyPlayed = false; + + bool compDn = StrumDown; + if (isSameStrumDN) + { + compDn = false; + } + else { + if (compDn) + { + isSameStrumDN = true; + } + } + + bool compUp = StrumUp; + if (isSameStrumUP) + { + compUp = false; + } + else { + if (compUp) + { + isSameStrumUP = true; + } + } + + if (compDn || compUp) + { + correctlyPlayed = true; + } + return correctlyPlayed; + } + bool CompareIndividualButton(bool wantedValue, int buttonState) { return wantedValue == buttonState; @@ -608,3 +671,216 @@ int main() return LedState; } + //bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector repo) { + // //display du Menu + // int repo_size = repo.size(); + // int choix = displayMenu(); + // switch (choix) + // { + // case 1: + // //choisir chanson + // system("CLS"); + // cout << "----------------------------------------------------------------------" << endl; + // cout << "\t\t\tMENU CHOIX DE CHANSON" << endl; + // cout << "----------------------------------------------------------------------\n" << endl; + // cout << " On devra faire un display des chansons disponibles...\n"; + // /* + // for (int i = 0; i < repertoire.size; i++){ + // cout << i+1 << ". " << repertoire[i].song.getTitle() << endl; + // } + // */ + // for (int i = 0; i < repo_size + 1; i++) { + // if (i == repo.size()) + // { + // cout << i + 1 << ". Retour" << endl; + // } + // else { + // cout << i + 1 << ". " << repo[i].getTitle() << endl << " par " << repo[i].getArtist() << endl; + // } + // } + // cout << "\nChoisissez une chanson : "; + // cin >> numeroChanson; + // while (numeroChanson < 1 || numeroChanson > repo.size() + 1) { + // cout << "Entree non valide. Veuillez entrer un numero de chanson valide" << endl; + // cin >> numeroChanson; + // } + // if (numeroChanson == repo.size()) + // { + // MenuInitialisation(numeroChanson, niveauDifficulte, repo); //retourne au display du menu + // } + // numeroChanson -= 1; + + // //choisir niveau de difficulté + // system("CLS"); + // cout << "----------------------------------------------------------------------" << endl; + // cout << "\t\t\tMENU NIVEAU DE DIFFICULTE" << endl; + // cout << "----------------------------------------------------------------------\n" << endl; + + // cout << "1. Easy" << endl; + // cout << "2. Medium" << endl; + // cout << "3. Hard" << endl; + // cout << "4. Expert" << endl; + + // cout << "\nChoisissez le niveau de difficulte : "; + // cin >> niveauDifficulte; + // while (niveauDifficulte < 0 || niveauDifficulte > 4) { + // cout << "Entree non valide. Veuillez entrer un niveau de difficulte valide" << endl; + // cin >> niveauDifficulte; + // } + // MenuInitialisation(numeroChanson, niveauDifficulte, repo); //retourne au display du menu + // niveauDifficulte = -1; + // return true; + // break; + // //case 3: + // // system("CLS"); + // // cout << "Le jeu va debuter...!!\n" << endl; + // // if (*numeroChanson < 1 || *numeroChanson > 4 || *niveauDifficulte < 1 || *niveauDifficulte > 4) { + // // //chanson et difficulte par defaut + // // *numeroChanson = 1; + // // *niveauDifficulte = 1; + // // } + // // cout << "Chanson choisie : " << listeChansons[*numeroChanson - 1] << endl; + // // cout << "Niveau de difficulte : " << listeDifficultes[*niveauDifficulte - 1] << "\n\n"; + // // return true; //debuter le jeu + // // break; + + // case 2: + // system("CLS"); + // cout << "A bientot, KEEP ON ROCKING!!" << endl; + // return false; //quitter le jeu + // break; + + // default: + // break; + // } + //} + + bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector repo) { + //display du Menu + int repo_size = repo.size(); + int choix = 0; + bool madeADecision = false; + bool retour = false; + bool wantToReturn = false; + + while (!madeADecision) + { + choix = displayMenu(); + switch (choix) + { + case 1: + wantToReturn = false; + //choisir chanson + system("CLS"); + cout << "----------------------------------------------------------------------" << endl; + cout << "\t\t\tMENU CHOIX DE CHANSON" << endl; + cout << "----------------------------------------------------------------------\n" << endl; + cout << " On devra faire un display des chansons disponibles...\n"; + /* + for (int i = 0; i < repertoire.size; i++){ + cout << i+1 << ". " << repertoire[i].song.getTitle() << endl; + } + */ + for (int i = 0; i < repo_size + 1; i++) { + if (i == repo.size()) + { + cout << i + 1 << ". Retour" << endl; + } + else { + cout << i + 1 << ". " << repo[i].getTitle() << " par " << repo[i].getArtist() << endl; + } + } + cout << "\nChoisissez une chanson : "; + cin >> numeroChanson; + while (numeroChanson < 1 || numeroChanson > repo.size() + 1) { + cout << "Entree non valide. Veuillez entrer un numero de chanson valide" << endl; + cin >> numeroChanson; + } + numeroChanson -= 1; + if (numeroChanson == repo.size()) + { + wantToReturn = true; + } + + + if (!wantToReturn) + { + //choisir niveau de difficulté + system("CLS"); + cout << "----------------------------------------------------------------------" << endl; + cout << "\t\t\tMENU NIVEAU DE DIFFICULTE" << endl; + cout << "----------------------------------------------------------------------\n" << endl; + + cout << "1. Easy" << endl; + cout << "2. Medium" << endl; + cout << "3. Hard" << endl; + cout << "4. Expert" << endl; + cout << "5. Retour" << endl; + + cout << "\nChoisissez le niveau de difficulte : "; + cin >> niveauDifficulte; + while (niveauDifficulte < 0 || niveauDifficulte > 5) { + cout << "Entree non valide. Veuillez entrer un niveau de difficulte valide" << endl; + cin >> niveauDifficulte; + } + + if (niveauDifficulte == 5) + { + wantToReturn = true; + } + + niveauDifficulte -= 1; + //case 3: + // system("CLS"); + // cout << "Le jeu va debuter...!!\n" << endl; + // if (*numeroChanson < 1 || *numeroChanson > 4 || *niveauDifficulte < 1 || *niveauDifficulte > 4) { + // //chanson et difficulte par defaut + // *numeroChanson = 1; + // *niveauDifficulte = 1; + // } + // cout << "Chanson choisie : " << listeChansons[*numeroChanson - 1] << endl; + // cout << "Niveau de difficulte : " << listeDifficultes[*niveauDifficulte - 1] << "\n\n"; + // return true; //debuter le jeu + // break; + } + + if (!wantToReturn) + { + madeADecision = true; + retour = true; + } + + break; + + case 2: + system("CLS"); + cout << "A bientot, KEEP ON ROCKING!!" << endl; + madeADecision = true; + retour = false; //quitter le jeu + break; + + default: + break; + } + } + return retour; + } + + //Fonction qui presente la premiere section du menu + int displayMenu() { + system("CLS"); + int choix; + cout << "----------------------------------------------------------------------" << endl; + cout << "\t\tMENU GUITAR HERO DEVELISH RELLISH" << endl; + cout << "----------------------------------------------------------------------\n" << endl; + cout << " 1. Debuter le jeu " << endl; + //cout << " 2. Informations " << endl; + cout << " 2. Quitter le jeu \n" << endl; + cout << "Choisissez une option : "; + cin >> choix; + while (choix < 1 || choix > 3) { + cout << "Choix non valide. Veuillez choisir une option valide" << endl; + cin >> choix; + } + return choix; + } \ No newline at end of file diff --git a/song.cpp b/song.cpp index 14ac92d..6fc03a2 100644 --- a/song.cpp +++ b/song.cpp @@ -10,7 +10,7 @@ Song::Song(std::string chartFile): chartFile(chartFile){ // substitute "notes.chart" for "song.wav" - string audioFile = chartFile; + std::string audioFile = chartFile; audioFile.replace(audioFile.find("notes.chart"), 12, "song.wav"); parseInfo(); parseSync(); @@ -166,19 +166,19 @@ bool Song::parseChords(int difficulty){ switch (difficulty){ case DIFFICULTY_EASY: stringPattern = "EasySingle"; - std::vector*chords = &easy; + chords = &easy; break; case DIFFICULTY_MEDIUM: stringPattern = "MediumSingle"; - std::vector*chords = &medium; + chords = &medium; break; case DIFFICULTY_HARD: stringPattern = "HardSingle"; - std::vector*chords = &hard; + chords = &hard; break; case DIFFICULTY_EXPERT: stringPattern = "ExpertSingle"; - std::vector*chords = &expert; + chords = &expert; break; default: std::cerr << "Invalid difficulty" << std::endl; @@ -277,16 +277,16 @@ void Song::consolidateChords(int difficulty){ std::vector*chords; switch (difficulty){ case DIFFICULTY_EASY: - std::vector*chords = &easy; + chords = &easy; break; case DIFFICULTY_MEDIUM: - std::vector*chords = &medium; + chords = &medium; break; case DIFFICULTY_HARD: - std::vector*chords = &hard; + chords = &hard; break; case DIFFICULTY_EXPERT: - std::vector*chords = &expert; + chords = &expert; break; default: std::cerr << "Invalid difficulty" << std::endl; @@ -374,9 +374,28 @@ std::string Song::getAudioFile(){ void Song::trim(int difficulty){ // TODO: make this fuction use the difficulty parameter //std::vector *chords = &expert; - for (int i = 0; i < expert.size(); i++) + std::vector* chords; + switch (difficulty) { + case DIFFICULTY_EASY: + chords = &easy; + break; + case DIFFICULTY_MEDIUM: + chords = &medium; + break; + case DIFFICULTY_HARD: + chords = &hard; + break; + case DIFFICULTY_EXPERT: + chords = &expert; + break; + default: + std::cerr << "Invalid difficulty" << std::endl; + return; + } + + for (int i = 0; i < chords->size(); i++) { - expert[i].trim(); + chords->at(i).trim(); } } -- cgit v1.2.3 From 3180cb7584c037463ee5c2047aea3e3ed0f0b364 Mon Sep 17 00:00:00 2001 From: simong4 Date: Tue, 4 Apr 2023 20:38:06 -0400 Subject: Gestion Muons + Ecran de fin de chanson -Gestion du multiplicateur des muons (Divine Intervention) -Ajout d'un ecran de fin de chanson indiquant le nombre de points et le pourcentage de notes reussies -Correction d'un bug lors du "parse" des .chart --- main.cpp | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- song.cpp | 8 ++-- 2 files changed, 138 insertions(+), 24 deletions(-) (limited to 'song.cpp') diff --git a/main.cpp b/main.cpp index a0b2181..e6dda70 100644 --- a/main.cpp +++ b/main.cpp @@ -28,6 +28,7 @@ using namespace std; #define STRUM_DN 6 #define JOY_DIR 7 #define ACCEL 8 +#define MUONS 9 #define JOY_DIR_UP 3 #define JOY_DIR_DN 4 @@ -45,6 +46,7 @@ int GetLedState(); int displayMenu(); bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector repo); string printSelectionCursor(int selected, int lineIndex); +void printEndOfSongScreen(int difficulty, Song song, int maxStreak, int points, int nbNotesReussies, int nbNotesSong); /*---------------------------- Variables globales ---------------------------*/ @@ -62,6 +64,7 @@ int IsShaking = 0; int NotesCorrectStreak = 0; bool BargraphNeedReset = false; bool IsInPowerup = false; +bool IsInDivineIntervention = false; int consecutiveStrumUP = 0; int consecutiveStrumDN = 0; @@ -77,6 +80,10 @@ bool isSameEvaluatedFret1 = false; bool isSameEvaluatedFret2 = false; bool isInMenu = false; +int MuonsCount = 0; + +int NB_NOTES_TO_INCREASE_POWERUP = 1; + int main() { @@ -105,6 +112,10 @@ int main() { for (int i = 0; i < repertoire.size(); i++) { + if (difficulty == 3 && i == 2) + { + int bleh = 2; + } repertoire[i].parseSync(); repertoire[i].parseChords(difficulty); repertoire[i].consolidateChords(difficulty); @@ -151,10 +162,7 @@ int main() string displayString; - const int POWERUP_LENGTH = 5000; - const int NB_SQUARES = 50; - const int FRAMERATE = 50; int renderStart = FRAMERATE * (NB_SQUARES); @@ -172,27 +180,33 @@ int main() } } - // Structure de donnees JSON pour envoie et reception - json j_msg_send, j_msg_rcv; - - auto startTime = chrono::steady_clock::now(); // TODO: Check if this command works as intended: /* PlaySound(TEXT(song.getAudioFile().c_str()), NULL, SND_ASYNC); */ + + auto startTime = chrono::steady_clock::now(); + double totalDiff = 0; auto lastPrintTime = chrono::steady_clock::now();; bool SongNotDone = true; int nextRenderNoteIndex = 0; int nextNoteToPlay = 0; - //int nbNotesCorrect = 0; int points = 0; bool hasLetGoHold = false; int lastCorrectHoldTime = 0; bool isPreviousNoteReussie = false; int powerupStartTime = 0; + const int POWERUP_LENGTH = 15000; + int divineInterventionStartTime = 0; + const int DIVINE_INTERVENTION_LENGTH = 15000; + int lastDivineInterventionChecktime = 0; + const int DIVINE_INTERVENTION_CHECK_INTERVALL = 10000; + const int DIVINE_INVERVENTION_ODDS = 5; //1 out of x (10) int powerupModifier = 1; + int NbNotesReussies = 0; + int MaxStreak = 0; int endOfSong = song[song.size() - 1].getEnd(); if (endOfSong == 0) @@ -201,6 +215,7 @@ int main() } endOfSong += 500; + MuonsCount = 0; while (SongNotDone) { auto currentTime = chrono::steady_clock::now(); @@ -211,6 +226,8 @@ int main() { /*isThreadOver = true; worker.join();*/ + MaxStreak = max(MaxStreak, NotesCorrectStreak); + printEndOfSongScreen(difficulty, repertoire[songIndex], MaxStreak, points, NbNotesReussies, song.size()); SongNotDone = false; } else @@ -232,7 +249,6 @@ int main() bool isStrummed = CompareStrums(); if (isStrummed) { - //cout << " REUSSI A " << diffSinceBeginning << endl; NbNotesReussies++; bool* notes = song[nextNoteToPlay].getNotes(); for (int i = 0; i < 5; i++) @@ -255,6 +271,7 @@ int main() bool isStrumming = CompareStrums(); if (isStrumming) { + MaxStreak = max(MaxStreak, NotesCorrectStreak); NotesCorrectStreak = 0; StreakWhenLastSend = 0; points -= 10; @@ -262,6 +279,7 @@ int main() if (nextNoteStart < diffSinceBeginning && nextNoteToPlay < song.size()) { nextNoteToPlay++; + MaxStreak = max(MaxStreak, NotesCorrectStreak); NotesCorrectStreak = 0; StreakWhenLastSend = 0; isPreviousNoteReussie = false; @@ -304,21 +322,35 @@ int main() } } + //PowerUP and DivineIntervention if (!IsInPowerup && IsShaking && LedState == 10) { IsInPowerup = true; powerupStartTime = diffSinceBeginning; - powerupModifier = 2; + powerupModifier *= 2; } if (IsInPowerup && diffSinceBeginning - powerupStartTime > POWERUP_LENGTH) { IsInPowerup = false; BargraphNeedReset = true; - powerupModifier = 1; + powerupModifier /= 2; + } + if (!IsInDivineIntervention && diffSinceBeginning - lastDivineInterventionChecktime > DIVINE_INTERVENTION_CHECK_INTERVALL) + { + lastDivineInterventionChecktime = diffSinceBeginning; + if (MuonsCount % DIVINE_INVERVENTION_ODDS == 0) + { + IsInDivineIntervention = true; + divineInterventionStartTime = diffSinceBeginning; + powerupModifier *= 2; + } + } + if (IsInDivineIntervention && diffSinceBeginning - divineInterventionStartTime > DIVINE_INTERVENTION_LENGTH) + { + IsInDivineIntervention = false; + powerupModifier /= 2; + lastDivineInterventionChecktime = diffSinceBeginning; } - - /*cout << "StrumUp : " << StrumUp << " --- "; - cout << "StrumDn : " << StrumDown << endl;*/ //Gestion affichage if (diffSinceBeginning % FRAMERATE == 0) @@ -415,18 +447,30 @@ int main() string timestampString = to_string(diffSinceBeginning); string ledStateString = to_string(LedState); string streakString = to_string(NotesCorrectStreak); - string holdTimeString = to_string(points); + string pointsString = to_string(points); string powerupModifierString = to_string(powerupModifier); + string muonsCountString = to_string(MuonsCount); + string divineString = to_string(IsInDivineIntervention); displayString += "Timestamp " + timestampString.substr(0, timestampString.find(".")) + " ms\n"; displayString += "Nb LEDs : " + ledStateString.substr(0, ledStateString.find(".")) + "/10\n"; displayString += "Nb notes de suite : " + streakString.substr(0, streakString.find(".")) + "\n"; - displayString += "Points : " + holdTimeString.substr(0, holdTimeString.find(".")) + "\n"; + displayString += "Points : " + pointsString.substr(0, pointsString.find(".")) + "\n"; + displayString += "Muons : " + muonsCountString.substr(0, muonsCountString.find(".")) + " --- DIVINE : " + divineString.substr(0, divineString.find(".")) + "\n"; + if (IsInPowerup) { + if (IsInDivineIntervention) + { + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- POWERUP AND DIVINE INTERVENTION!!!!!\n"; + } displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- POWERUP !!!!!\n"; } else { + if (IsInDivineIntervention) + { + displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + " --- DIVINE INTERVENTION!!!!!\n"; + } displayString += "Multiplicateur : x" + powerupModifierString.substr(0, powerupModifierString.find(".")) + "\n"; } @@ -615,6 +659,8 @@ void RcvJsonThread() lastReceivedJoyDir = tempJoyDir; IsShaking = json_recu[ACCEL]; + MuonsCount += json_recu[MUONS]; + //MuonsCount += rand() % 10 + 1;//rand() % range + min /*if (IsShaking) { cout << "SENSIBILITE BEN TROP BASSE" << endl; @@ -719,7 +765,7 @@ int GetLedState() } else { - if (NotesCorrectStreak % 1 == 0 && StreakWhenLastSend < NotesCorrectStreak) + if (NotesCorrectStreak % NB_NOTES_TO_INCREASE_POWERUP == 0 && StreakWhenLastSend < NotesCorrectStreak) { LedState++; StreakWhenLastSend = NotesCorrectStreak; @@ -750,6 +796,7 @@ bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector bool madeDifficultyDecision = false; int choixChanson = 1; int choixDifficulte = 1; + bool inputSelected = false; while (!madeADecision) { @@ -788,7 +835,7 @@ bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector cout << "Entree non valide. Veuillez entrer un numero de chanson valide" << endl; cin >> numeroChanson; }*/ - bool inputSelected = false; + inputSelected = false; while (!inputSelected) { if (JoyDir == JOY_DIR_UP && !isSameEvaluatedJoyDir) @@ -857,7 +904,7 @@ bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector cout << "Entree non valide. Veuillez entrer un niveau de difficulte valide" << endl; cin >> niveauDifficulte; }*/ - bool inputSelected = false; + inputSelected = false; while (!inputSelected) { if (JoyDir == JOY_DIR_UP && !isSameEvaluatedJoyDir) @@ -920,8 +967,35 @@ bool MenuInitialisation(int& numeroChanson, int& niveauDifficulte, vector } break; - case 2: + system("CLS"); + cout << "FLAMMING DEVELISH RELISH" << endl; + cout << "Projet de session S2-H23 de l'equipe P-05" << endl; + cout << "Benjamin Chaussé" << endl; + cout << "Simon Gagné" << endl; + cout << "Brenda Keimgou Tchio" << endl; + cout << "Guillaume Malgorn" << endl; + cout << "Gabriel Nadeau" << endl; + cout << "Zachary Poulin" << endl; + + cout << "Appuyez sur Vert ou Rouge pour continuer" << endl; + inputSelected = false; + while (!inputSelected) + { + if (Fret1 && !isSameEvaluatedFret1) + { + isSameEvaluatedFret1 = true; + inputSelected = true; + } + if (Fret2 && !isSameEvaluatedFret2) + { + isSameEvaluatedFret2 = true; + inputSelected = true; + } + } + break; + + case 3: system("CLS"); cout << "A bientot, KEEP ON ROCKING!!" << endl; madeADecision = true; @@ -997,4 +1071,44 @@ string printSelectionCursor(int selected, int lineIndex) else { return ""; } +} + +void printEndOfSongScreen(int difficulty, Song song, int maxStreak, int points, int nbNotesReussies, int nbNotesSong) +{ + LedState = 0; + system("CLS"); + cout << song.getTitle() << " par " << song.getArtist() << endl; + cout << "Difficulte : "; + switch (difficulty) + { + case DIFFICULTY_EASY: + cout << "Easy" << endl; + break; + case DIFFICULTY_MEDIUM: + cout << "Medium" << endl; + break; + case DIFFICULTY_HARD: + cout << "Hard" << endl; + break; + case DIFFICULTY_EXPERT: + cout << "Expert" << endl; + break; + } + cout << nbNotesReussies * 100 / nbNotesSong << "%" << endl; + cout << points << " points" << endl; + cout << nbNotesReussies << " notes reussies" << endl; + cout << "Plus haute sequence de suite :" << maxStreak << endl; + + cout << "\nAppuyer sur Vert pour continuer"; + + isInMenu = true; + bool inputSelected = false; + while (!inputSelected) + { + if (Fret1 && !isSameEvaluatedFret1) + { + isSameEvaluatedFret1 = true; + inputSelected = true; + } + } } \ No newline at end of file diff --git a/song.cpp b/song.cpp index 6fc03a2..ced9187 100644 --- a/song.cpp +++ b/song.cpp @@ -296,13 +296,13 @@ void Song::consolidateChords(int difficulty){ int chordSize = chords->size(); // Go through all the chords for (int i=0; iat(i); + ChordNote * currentChord = &chords->at(i); // Check if any other chord past the current one // has the same start and end time for (int j=i+1; jat(j); - if (currentChord.getStart() == nextChord.getStart() && - currentChord.getEnd() == nextChord.getEnd()){ + if (currentChord->getStart() == nextChord.getStart() && + currentChord->getEnd() == nextChord.getEnd()){ // If so: // - add the fret to the current chord // - remove the next one @@ -316,7 +316,7 @@ void Song::consolidateChords(int difficulty){ nextChord.print(); std::cout << " ="; #endif // DEBUG - currentChord.merge(nextChord); + currentChord->merge(nextChord); #ifdef DEBUG currentChord.print(); #endif -- cgit v1.2.3