diff options
81 files changed, 2662 insertions, 1706 deletions
diff --git a/cmake/QtFeature.cmake b/cmake/QtFeature.cmake index 9cffa58229e..86b1201792d 100644 --- a/cmake/QtFeature.cmake +++ b/cmake/QtFeature.cmake @@ -1570,7 +1570,8 @@ function(qt_run_config_compile_test name) endif() if(arg_CXX_STANDARD) - if(${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") + if((${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") AND + (${arg_CXX_STANDARD} LESS 26 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25")) set(CMAKE_CXX_STANDARD "${arg_CXX_STANDARD}") set(CMAKE_CXX_STANDARD_REQUIRED OFF) endif() diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index 1747e7c7197..67d6f37e36d 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -359,7 +359,9 @@ endfunction() function(qt_set_language_standards) ## Use the latest standard the compiler supports (same as qt_common.prf) - if (QT_FEATURE_cxx2b) + if (QT_FEATURE_cxx2c) + set(CMAKE_CXX_STANDARD 26 PARENT_SCOPE) + elseif (QT_FEATURE_cxx2b) set(CMAKE_CXX_STANDARD 23 PARENT_SCOPE) elseif (QT_FEATURE_cxx20) set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE) diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake index a1f4cb7281c..1b0adccd5b5 100644 --- a/cmake/QtInternalTargets.cmake +++ b/cmake/QtInternalTargets.cmake @@ -94,6 +94,18 @@ function(qt_internal_set_warnings_are_errors_flags target target_scope) ${language_args} ) endif() + if(APPLE) + qt_internal_add_compiler_dependent_flags("${target}" ${target_scope} + COMPILERS CLANG AppleClang + CONDITIONS $<BOOL:$<TARGET_PROPERTY:UNITY_BUILD>> + OPTIONS + -Wno-error=nullability-completeness + COMMON_CONDITIONS + ${common_conditions} + LANGUAGES + OBJCXX + ) + endif() # Other options are gated at compile time that are not likely to change between different build # environments of other modules. if(ANDROID) diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index ecfdb740d71..f7ab67455ce 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -1554,8 +1554,9 @@ function(qt_describe_module target) endif() if(ANDROID) string(APPEND targets_information - "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\", -${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n") + "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\",\n" + "${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n" + "${indent5}\"android_platform\": \"${ANDROID_PLATFORM}\",\n") endif() string(APPEND targets_information "${indent5}\"architecture\": \"${architecture}\",\n") string(APPEND targets_information "${indent5}\"abi\": \"${TEST_arch_${architecture}_abi}\"\n") diff --git a/cmake/QtPublicWasmToolchainHelpers.cmake b/cmake/QtPublicWasmToolchainHelpers.cmake index ecdca052113..32309ed05ba 100644 --- a/cmake/QtPublicWasmToolchainHelpers.cmake +++ b/cmake/QtPublicWasmToolchainHelpers.cmake @@ -53,7 +53,7 @@ endfunction() function(__qt_internal_get_emcc_recommended_version out_var) # This version of Qt needs this version of emscripten. - set(QT_EMCC_RECOMMENDED_VERSION "3.1.70") + set(QT_EMCC_RECOMMENDED_VERSION "4.0.7") set(${out_var} "${QT_EMCC_RECOMMENDED_VERSION}" PARENT_SCOPE) endfunction() diff --git a/coin/instructions/cmake_run_ctest.yaml b/coin/instructions/cmake_run_ctest.yaml index 0c58a83b209..43963fc172b 100644 --- a/coin/instructions/cmake_run_ctest.yaml +++ b/coin/instructions/cmake_run_ctest.yaml @@ -151,6 +151,8 @@ instructions: userMessageOnFailure: > Failed to copy LastTest.log to testresults directory. executeOn: always + maxTimeInSeconds: 20 + maxTimeBetweenOutput: 20 - type: Group enable_if: condition: runtime diff --git a/configure.cmake b/configure.cmake index 4ca5f7f07d2..92fe4dba448 100644 --- a/configure.cmake +++ b/configure.cmake @@ -292,6 +292,25 @@ int main(void) CXX_STANDARD 23 ) +qt_config_compile_test(cxx2c + LABEL "C++2c support" + CODE +"#if __cplusplus > 202302L +// Compiler claims to support C++2c, trust it +#else +# error __cplusplus must be > 202302L (the value for C++23) +#endif + +int main(void) +{ + /* BEGIN TEST: */ + /* END TEST: */ + return 0; +} +" + CXX_STANDARD 26 +) + qt_config_compiler_supports_flag_test(optimize_debug LABEL "-Og support" FLAG "-Og" @@ -730,6 +749,12 @@ qt_feature("c++2b" PUBLIC CONDITION QT_FEATURE_cxx20 AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") AND TEST_cxx2b ) qt_feature_config("c++2b" QMAKE_PUBLIC_QT_CONFIG) +qt_feature("c++2c" PUBLIC + LABEL "C++2c" + AUTODETECT OFF + CONDITION QT_FEATURE_cxx2b AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.25") AND TEST_cxx2c +) +qt_feature_config("c++2c" QMAKE_PUBLIC_QT_CONFIG) set(__qt_ltcg_detected FALSE) if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) set(__qt_ltcg_detected TRUE) diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf index 6eb08a9d2fa..82c6173a037 100644 --- a/mkspecs/common/clang.conf +++ b/mkspecs/common/clang.conf @@ -36,11 +36,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y QMAKE_CXXFLAGS_CXX1Z = -std=c++1z QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_CXX2B = -std=c++2b +QMAKE_CXXFLAGS_CXX2C = -std=c++2c QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b +QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX14 = diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf index d392879f66d..e12e41506ae 100644 --- a/mkspecs/common/g++-base.conf +++ b/mkspecs/common/g++-base.conf @@ -34,11 +34,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y QMAKE_CXXFLAGS_CXX1Z = -std=c++1z QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_CXX2B = -std=c++2b +QMAKE_CXXFLAGS_CXX2C = -std=c++2c QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b +QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX14 = QMAKE_LFLAGS_CXX1Z = diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf index 303b341e9d7..0130542ddb9 100644 --- a/mkspecs/common/msvc-version.conf +++ b/mkspecs/common/msvc-version.conf @@ -121,6 +121,7 @@ greaterThan(QMAKE_MSC_VER, 1919) { MSVC_TOOLSET_VER = 142 QMAKE_CXXFLAGS_CXX2A = -std:c++latest QMAKE_CXXFLAGS_CXX2B = -std:c++latest + QMAKE_CXXFLAGS_CXX2C = -std:c++latest QMAKE_CXXFLAGS += -Zc:externConstexpr } diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index a44d03c91bb..cf48bfda07f 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -124,17 +124,18 @@ breakpad { c++17: CONFIG += c++1z c++20: CONFIG += c++2a c++23: CONFIG += c++2b -c++latest: CONFIG *= c++2b c++2a c++1z c++14 c++11 +c++latest: CONFIG *= c++2c c++2b c++2a c++1z c++14 c++11 -!c++1z:!c++2a:!c++2b { +!c++1z:!c++2a:!c++2b:!c++2c { # Qt requires C++17 QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "") !greaterThan(QT_COMPILER_STDCXX_no_L, 201402): CONFIG += c++1z } -c++1z|c++2a|c++2b { +c++1z|c++2a|c++2b|c++2c { # Disable special compiler flags for host builds !host_build|!cross_compile { - c++2b: cxxstd = CXX2B + c++2c: cxxstd = CXX2C + else:c++2b: cxxstd = CXX2B else:c++2a: cxxstd = CXX2A else: cxxstd = CXX1Z } else { diff --git a/mkspecs/features/wasm/emcc_ver.prf b/mkspecs/features/wasm/emcc_ver.prf index 2f801228797..bb59844c4d5 100644 --- a/mkspecs/features/wasm/emcc_ver.prf +++ b/mkspecs/features/wasm/emcc_ver.prf @@ -1,5 +1,5 @@ defineReplace(qtEmccRecommendedVersion) { - return (3.1.70) + return (4.0.7) } defineReplace(qtSystemEmccVersion) { diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake index 3abd265e9c7..8f68a40f3ff 100644 --- a/qt_cmdline.cmake +++ b/qt_cmdline.cmake @@ -174,12 +174,19 @@ function(qt_commandline_cxxstd arg val nextok) if(val MATCHES "(c\\+\\+)?(17|1z)") qtConfCommandlineDisableFeature(c++20) qtConfCommandlineDisableFeature(c++2b) + qtConfCommandlineDisableFeature(c++2c) elseif(val MATCHES "(c\\+\\+)?(20|2a)") qtConfCommandlineEnableFeature(c++20) qtConfCommandlineDisableFeature(c++2b) + qtConfCommandlineDisableFeature(c++2c) elseif(val MATCHES "(c\\+\\+)?(23|2b)") qtConfCommandlineEnableFeature(c++20) qtConfCommandlineEnableFeature(c++2b) + qtConfCommandlineDisableFeature(c++2c) + elseif(val MATCHES "(c\\+\\+)?(2c)") + qtConfCommandlineEnableFeature(c++20) + qtConfCommandlineEnableFeature(c++2b) + qtConfCommandlineEnableFeature(c++2c) else() qtConfAddError("Invalid argument '${val}' to command line parameter '${arg}'") endif() diff --git a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java index 542d05627c9..61f8f4b8d53 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java @@ -28,10 +28,6 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate // all low positive ints should be fine. static final int INVALID_ID = 333; // half evil - // The platform might ask for the class implementing the "view". - // Pretend to be an inner class of the QtSurface. - private static final String DEFAULT_CLASS_NAME = "$VirtualChild"; - private View m_view = null; private AccessibilityManager m_manager; private QtLayout m_layout; @@ -247,7 +243,7 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT); event.setEnabled(true); - event.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME); + event.setClassName(getNodeForVirtualViewId(viewId).getClassName()); event.setContentDescription(value); @@ -323,7 +319,7 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); event.setEnabled(true); - event.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME); + event.setClassName(getNodeForVirtualViewId(virtualViewId).getClassName()); event.setContentDescription(QtNativeAccessibility.descriptionForAccessibleObject(virtualViewId)); if (event.getText().isEmpty() && TextUtils.isEmpty(event.getContentDescription())) @@ -419,7 +415,6 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain(); - node.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME); node.setPackageName(m_view.getContext().getPackageName()); if (m_layout.getChildCount() == 0 || !QtNativeAccessibility.populateNode(virtualViewId, node)) { diff --git a/src/corelib/io/qdirentryinfo_p.h b/src/corelib/io/qdirentryinfo_p.h index 7ed5391ff04..8864255c425 100644 --- a/src/corelib/io/qdirentryinfo_p.h +++ b/src/corelib/io/qdirentryinfo_p.h @@ -148,7 +148,7 @@ private: QFileSystemEntry entry; QFileSystemMetaData metaData; - std::optional<QFileInfo> fileInfoOpt; + std::optional<QFileInfo> fileInfoOpt = std::nullopt; }; QT_END_NAMESPACE diff --git a/src/corelib/io/qstorageinfo.cpp b/src/corelib/io/qstorageinfo.cpp index 950af69ab82..f3e4dc52b9b 100644 --- a/src/corelib/io/qstorageinfo.cpp +++ b/src/corelib/io/qstorageinfo.cpp @@ -12,6 +12,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcStorageInfo, "qt.core.qstorageinfo", QtWarningMsg) QT_IMPL_METATYPE_EXTERN(QStorageInfo) +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QStorageInfoPrivate) /*! \class QStorageInfo @@ -75,7 +76,7 @@ QStorageInfo::QStorageInfo() \sa setPath() */ QStorageInfo::QStorageInfo(const QString &path) - : d(new QStorageInfoPrivate) + : QStorageInfo() { setPath(path); } @@ -85,39 +86,45 @@ QStorageInfo::QStorageInfo(const QString &path) containing the \a dir folder. */ QStorageInfo::QStorageInfo(const QDir &dir) - : d(new QStorageInfoPrivate) + : QStorageInfo(dir.absolutePath()) { - setPath(dir.absolutePath()); } /*! Constructs a new QStorageInfo object that is a copy of the \a other QStorageInfo object. */ QStorageInfo::QStorageInfo(const QStorageInfo &other) - : d(other.d) -{ -} + = default; + +/*! + \since 6.10 + \fn QStorageInfo::QStorageInfo(QStorageInfo &&other) + + Move-constructs a new QStorageInfo from \a other. + + The moved-from object \a other is placed in a partially-formed state, in + which the only valid operations are destruction and assignment of a new + value. +*/ /*! Destroys the QStorageInfo object and frees its resources. */ QStorageInfo::~QStorageInfo() -{ -} + = default; /*! Makes a copy of the QStorageInfo object \a other and assigns it to this QStorageInfo object. */ QStorageInfo &QStorageInfo::operator=(const QStorageInfo &other) -{ - d = other.d; - return *this; -} + = default; /*! \fn QStorageInfo &QStorageInfo::operator=(QStorageInfo &&other) - Assigns \a other to this QStorageInfo instance. + Move-assigns \a other to this QStorageInfo instance. + + The moved-from object \a other is placed in a valid, but unspecified state. */ /*! diff --git a/src/corelib/io/qstorageinfo.h b/src/corelib/io/qstorageinfo.h index 2d7c60ec915..48aed19e576 100644 --- a/src/corelib/io/qstorageinfo.h +++ b/src/corelib/io/qstorageinfo.h @@ -17,6 +17,7 @@ QT_BEGIN_NAMESPACE class QDebug; class QStorageInfoPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QStorageInfoPrivate) class Q_CORE_EXPORT QStorageInfo { public: @@ -24,6 +25,7 @@ public: explicit QStorageInfo(const QString &path); explicit QStorageInfo(const QDir &dir); QStorageInfo(const QStorageInfo &other); + QStorageInfo(QStorageInfo &&) noexcept = default; ~QStorageInfo(); QStorageInfo &operator=(const QStorageInfo &other); diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h index 849d6084b80..38378fdcc64 100644 --- a/src/corelib/itemmodels/qrangemodel_impl.h +++ b/src/corelib/itemmodels/qrangemodel_impl.h @@ -952,7 +952,7 @@ public: if constexpr (multi_role::int_key) return std::as_const(value).find(Qt::ItemDataRole(role)); else - return std::as_const(value).find(roleNames().value(role)); + return std::as_const(value).find(itemModel().roleNames().value(role)); }(); if (it != value.cend()) { result = QRangeModelDetails::value(it); @@ -981,13 +981,20 @@ public: if constexpr (std::is_convertible_v<value_type, decltype(result)>) { result = value; } else { + const auto roleNames = [this]() -> QHash<int, QByteArray> { + Q_UNUSED(this); + if constexpr (!multi_role::int_key) + return itemModel().roleNames(); + else + return {}; + }(); for (auto it = std::cbegin(value); it != std::cend(value); ++it) { - int role = [this, key = QRangeModelDetails::key(it)]() { - Q_UNUSED(this); + const int role = [&roleNames, key = QRangeModelDetails::key(it)]() { + Q_UNUSED(roleNames); if constexpr (multi_role::int_key) return int(key); else - return roleNames().key(key.toUtf8(), -1); + return roleNames.key(key.toUtf8(), -1); }(); if (role != -1) @@ -999,7 +1006,7 @@ public: tried = true; using meta_type = QRangeModelDetails::wrapped_t<value_type>; const QMetaObject &mo = meta_type::staticMetaObject; - for (auto &&[role, roleName] : roleNames().asKeyValueRange()) { + for (auto &&[role, roleName] : itemModel().roleNames().asKeyValueRange()) { QVariant data; if constexpr (std::is_base_of_v<QObject, meta_type>) { if (value) @@ -1064,19 +1071,26 @@ public: Qt::ItemDataRole roleToSet = Qt::ItemDataRole(role); // If there is an entry for EditRole, overwrite that; otherwise, // set the entry for DisplayRole. + const auto roleNames = [this]() -> QHash<int, QByteArray> { + Q_UNUSED(this); + if constexpr (!multi_role::int_key) + return itemModel().roleNames(); + else + return {}; + }(); if (role == Qt::EditRole) { if constexpr (multi_role::int_key) { if (target.find(roleToSet) == target.end()) roleToSet = Qt::DisplayRole; } else { - if (target.find(roleNames().value(roleToSet)) == target.end()) + if (target.find(roleNames.value(roleToSet)) == target.end()) roleToSet = Qt::DisplayRole; } } if constexpr (multi_role::int_key) return write(target[roleToSet], data); else - return write(target[roleNames().value(roleToSet)], data); + return write(target[roleNames.value(roleToSet)], data); } else if (role == Qt::DisplayRole || role == Qt::EditRole) { return write(target, data); } @@ -1108,7 +1122,9 @@ public: if constexpr (multi_role()) { using key_type = typename value_type::key_type; tried = true; - const auto roleName = [map = roleNames()](int role) { return map.value(role); }; + const auto roleName = [map = itemModel().roleNames()](int role) { + return map.value(role); + }; // transactional: only update target if all values from data // can be stored. Storing never fails with int-keys. @@ -1148,8 +1164,9 @@ public: else // can't copy - targetCopy is now a pointer return &origin; }(target); + const auto roleNames = itemModel().roleNames(); for (auto &&[role, value] : data.asKeyValueRange()) { - const QByteArray roleName = roleNames().value(role); + const QByteArray roleName = roleNames.value(role); bool written = false; if constexpr (std::is_base_of_v<QObject, meta_type>) { if (targetCopy) @@ -1547,7 +1564,7 @@ protected: QMetaProperty roleProperty(int role) const { const QMetaObject *mo = &ItemType::staticMetaObject; - const QByteArray roleName = roleNames().value(role); + const QByteArray roleName = itemModel().roleNames().value(role); if (const int index = mo->indexOfProperty(roleName.data()); index >= 0) return mo->property(index); return {}; diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index b48922daeab..2356611a5cf 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -2362,7 +2362,7 @@ QList<QByteArray> QMetaMethod::parameterNames() const \note In Qt 7, this function will return a null pointer for constructors. - \sa returnType(), QMetaType::type() + \sa returnType(), QMetaType::name() */ const char *QMetaMethod::typeName() const { diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 0ec95c3bb99..d31566b4e95 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -2103,6 +2103,9 @@ public: while (begin != end && is_space(*(end - 1))) end--; + if (begin == end) + return len; + // Convert 'char const *' into 'const char *'. Start at index 1, // not 0, because 'const char *' is already OK. const char *cst = begin + 1; diff --git a/src/corelib/kernel/qobject_p_p.h b/src/corelib/kernel/qobject_p_p.h index 1b05f20b827..fdc0f1e8392 100644 --- a/src/corelib/kernel/qobject_p_p.h +++ b/src/corelib/kernel/qobject_p_p.h @@ -143,7 +143,7 @@ struct QObjectPrivate::ConnectionData QAtomicPointer<SignalVector> signalVector; Connection *senders = nullptr; Sender *currentSender = nullptr; // object currently activating the object - std::atomic<TaggedSignalVector> orphaned = {}; + std::atomic<TaggedSignalVector> orphaned = {nullptr}; ~ConnectionData() { diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h index f4e7942e947..a3c4e109adf 100644 --- a/src/corelib/kernel/qproperty.h +++ b/src/corelib/kernel/qproperty.h @@ -299,7 +299,7 @@ public: auto This = static_cast<QPropertyChangeHandler<Functor>*>(self); This->m_handler(); }) - , m_handler(handler) + , m_handler(std::move(handler)) { } @@ -310,7 +310,7 @@ public: auto This = static_cast<QPropertyChangeHandler<Functor>*>(self); This->m_handler(); }) - , m_handler(handler) + , m_handler(std::move(handler)) { setSource(property); } @@ -329,7 +329,7 @@ public: auto This = static_cast<QPropertyNotifier *>(self); This->m_handler(); }) - , m_handler(handler) + , m_handler(std::move(handler)) { } @@ -341,7 +341,7 @@ public: auto This = static_cast<QPropertyNotifier *>(self); This->m_handler(); }) - , m_handler(handler) + , m_handler(std::move(handler)) { setSource(property); } @@ -516,7 +516,7 @@ public: QPropertyChangeHandler<Functor> onValueChanged(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyChangeHandler<Functor>(*this, f); + return QPropertyChangeHandler<Functor>(*this, std::move(f)); } template<typename Functor> @@ -524,14 +524,14 @@ public: { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); f(); - return onValueChanged(f); + return onValueChanged(std::move(f)); } template<typename Functor> QPropertyNotifier addNotifier(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyNotifier(*this, f); + return QPropertyNotifier(*this, std::move(f)); } const QtPrivate::QPropertyBindingData &bindingData() const { return d; } @@ -785,7 +785,7 @@ public: template<typename Functor> QPropertyChangeHandler<Functor> onValueChanged(Functor f) const { - QPropertyChangeHandler<Functor> handler(f); + QPropertyChangeHandler<Functor> handler(std::move(f)); observe(&handler); return handler; } @@ -794,13 +794,13 @@ public: QPropertyChangeHandler<Functor> subscribe(Functor f) const { f(); - return onValueChanged(f); + return onValueChanged(std::move(f)); } template<typename Functor> QPropertyNotifier addNotifier(Functor f) { - QPropertyNotifier handler(f); + QPropertyNotifier handler(std::move(f)); observe(&handler); return handler; } @@ -1046,19 +1046,19 @@ public: template<typename Functor> QPropertyChangeHandler<Functor> onValueChanged(Functor f) { - return QBindable<T>(aliasedProperty(), iface).onValueChanged(f); + return QBindable<T>(aliasedProperty(), iface).onValueChanged(std::move(f)); } template<typename Functor> QPropertyChangeHandler<Functor> subscribe(Functor f) { - return QBindable<T>(aliasedProperty(), iface).subscribe(f); + return QBindable<T>(aliasedProperty(), iface).subscribe(std::move(f)); } template<typename Functor> QPropertyNotifier addNotifier(Functor f) { - return QBindable<T>(aliasedProperty(), iface).addNotifier(f); + return QBindable<T>(aliasedProperty(), iface).addNotifier(std::move(f)); } bool isValid() const @@ -1238,7 +1238,7 @@ public: QPropertyChangeHandler<Functor> onValueChanged(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyChangeHandler<Functor>(*this, f); + return QPropertyChangeHandler<Functor>(*this, std::move(f)); } template<typename Functor> @@ -1246,14 +1246,14 @@ public: { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); f(); - return onValueChanged(f); + return onValueChanged(std::move(f)); } template<typename Functor> QPropertyNotifier addNotifier(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyNotifier(*this, f); + return QPropertyNotifier(*this, std::move(f)); } const QtPrivate::QPropertyBindingData &bindingData() const @@ -1386,7 +1386,7 @@ public: QPropertyChangeHandler<Functor> onValueChanged(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyChangeHandler<Functor>(*this, f); + return QPropertyChangeHandler<Functor>(*this, std::move(f)); } template<typename Functor> @@ -1394,14 +1394,14 @@ public: { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); f(); - return onValueChanged(f); + return onValueChanged(std::move(f)); } template<typename Functor> QPropertyNotifier addNotifier(Functor f) { static_assert(std::is_invocable_v<Functor>, "Functor callback must be callable without any parameters"); - return QPropertyNotifier(*this, f); + return QPropertyNotifier(*this, std::move(f)); } QtPrivate::QPropertyBindingData &bindingData() const diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 3a2dcb4a12d..e91797a3ffe 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -321,11 +321,6 @@ static QVariant::Private clonePrivate(const QVariant::Private &other) \compares equality - Because C++ forbids unions from including types that have - non-default constructors or destructors, most interesting Qt - classes cannot be used in unions. Without QVariant, this would be - a problem for QObject::property() and for database work, etc. - A QVariant object holds a single value of a single typeId() at a time. (Some types are multi-valued, for example a string list.) You can find out what type, T, the variant holds, convert it to a diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index ad9e1089bfe..b4751d1324f 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -1081,10 +1081,12 @@ void QXmlStreamReaderPrivate::parseEntity(const QString &value) inline void QXmlStreamReaderPrivate::reallocateStack() { stack_size <<= 1; - sym_stack = reinterpret_cast<Value*> (realloc(sym_stack, stack_size * sizeof(Value))); - Q_CHECK_PTR(sym_stack); - state_stack = reinterpret_cast<int*> (realloc(state_stack, stack_size * sizeof(int))); - Q_CHECK_PTR(state_stack); + void *p = realloc(sym_stack, stack_size * sizeof(Value)); + Q_CHECK_PTR(p); + sym_stack = static_cast<Value*>(p); + p = realloc(state_stack, stack_size * sizeof(int)); + Q_CHECK_PTR(p); + state_stack = static_cast<int*>(p); } @@ -2036,7 +2038,7 @@ void QXmlStreamReaderPrivate::startDocument() // unspecified (i.e. System) encoding. QString buf = decoder(QByteArrayView(rawReadBuffer).first(nbytesread)); if (!decoder.hasError()) - readBuffer = buf; + readBuffer = std::move(buf); } } } diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h index 4bba6bcc765..bd8770200db 100644 --- a/src/corelib/serialization/qxmlstream_p.h +++ b/src/corelib/serialization/qxmlstream_p.h @@ -140,8 +140,8 @@ public: if (tos + extraCapacity + 1 > cap) { cap = qMax(tos + extraCapacity + 1, cap << 1 ); void *ptr = realloc(static_cast<void *>(data), cap * sizeof(T)); + Q_CHECK_PTR(ptr); data = reinterpret_cast<T *>(ptr); - Q_CHECK_PTR(data); } } diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 3e27f0260d3..91550056101 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -4933,7 +4933,7 @@ QByteArray QByteArray::fromEcmaUint8Array(emscripten::val uint8array) \since 6.5 \ingroup platform-type-conversions - \sa toEcmaUint8Array() + \sa fromEcmaUint8Array() */ emscripten::val QByteArray::toEcmaUint8Array() { diff --git a/src/corelib/text/qstringalgorithms_p.h b/src/corelib/text/qstringalgorithms_p.h index a017ec58d49..c873858c59b 100644 --- a/src/corelib/text/qstringalgorithms_p.h +++ b/src/corelib/text/qstringalgorithms_p.h @@ -149,7 +149,10 @@ template <typename StringType> struct QStringAlgorithms return src.size() + adjust; } - static inline void replace_detaching(StringType &src, qsizetype bsize, + // Instead of detaching, i.e. copying the whole data array then performing the + // replacement, create a new buffer, copy `src` and `after` to it and swap it + // with `src`. + static inline void replace_into_copy(StringType &src, qsizetype bsize, ViewType after, QSpan<const qsizetype> indices, qsizetype newlen) { @@ -237,7 +240,7 @@ template <typename StringType> struct QStringAlgorithms // Instead of detaching (which would copy the whole data array) then // performing the replacement, allocate a new string and copy the data // over from `src` and `after` as needed. - replace_detaching(src, bsize, after, indices, newlen); + replace_into_copy(src, bsize, after, indices, newlen); return; } diff --git a/src/corelib/text/qutf8stringview.qdoc b/src/corelib/text/qutf8stringview.qdoc index 6261927f682..fea4ae97761 100644 --- a/src/corelib/text/qutf8stringview.qdoc +++ b/src/corelib/text/qutf8stringview.qdoc @@ -108,7 +108,7 @@ QBasicUtf8StringView. Please do not use the template class's name in your source code. - \sa QAnyStringView, QUtf8StringView, QString + \sa QAnyStringView, QStringView, QLatin1StringView, QString */ /*! diff --git a/src/corelib/time/qtimezonelocale_data_p.h b/src/corelib/time/qtimezonelocale_data_p.h index 9afb12406c0..9e179369254 100644 --- a/src/corelib/time/qtimezonelocale_data_p.h +++ b/src/corelib/time/qtimezonelocale_data_p.h @@ -58,7 +58,7 @@ namespace QtTimeZoneLocale { // GENERATED PART STARTS HERE /* - This part of the file was generated on 2025-06-17 from the + This part of the file was generated on 2025-07-01 from the Common Locale Data Repository v47 http://www.unicode.org/cldr/ @@ -49804,7 +49804,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 5130, 88357, 11, }, // Africa/Dar_es_Salaam { 687, 5043, 88368, 6, }, // Africa/Djibouti { 687, 5243, 88374, 5, }, // Africa/Douala - { 687, 5166, 221031, 9, }, // Africa/El_Aaiun + { 687, 5166, 88379, 8, }, // Africa/El_Aaiun { 687, 6853, 88387, 9, }, // Africa/Freetown { 687, 4906, 88396, 7, }, // Africa/Gaborone { 687, 5015, 88403, 5, }, // Africa/Harare @@ -49925,7 +49925,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 5897, 89278, 7, }, // America/Marigot { 687, 5805, 89285, 9, }, // America/Martinique { 687, 8184, 89294, 9, }, // America/Matamoros - { 687, 2917, 221040, 8, }, // America/Mazatlan + { 687, 2917, 221031, 8, }, // America/Mazatlan { 687, 8202, 89312, 8, }, // America/Menominee { 687, 8220, 31158, 6, }, // America/Merida { 687, 8235, 89320, 12, }, // America/Metlakatla @@ -50012,7 +50012,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 4540, 89984, 7, }, // Asia/Damascus { 687, 1093, 89991, 4, }, // Asia/Dhaka { 687, 6192, 89995, 4, }, // Asia/Dili - { 687, 3596, 221048, 3, }, // Asia/Dubai + { 687, 3596, 221039, 3, }, // Asia/Dubai { 687, 6159, 90003, 7, }, // Asia/Dushanbe { 687, 8636, 90010, 11, }, // Asia/Famagusta { 687, 8651, 90021, 5, }, // Asia/Gaza @@ -50024,7 +50024,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 7006, 90073, 7, }, // Asia/Jakarta { 687, 6992, 31943, 7, }, // Asia/Jayapura { 687, 1290, 90080, 6, }, // Asia/Jerusalem - { 687, 3560, 221051, 4, }, // Asia/Kabul + { 687, 3560, 221042, 4, }, // Asia/Kabul { 687, 4316, 90091, 7, }, // Asia/Kamchatka { 687, 4239, 31972, 5, }, // Asia/Karachi { 687, 1185, 90098, 8, }, // Asia/Kathmandu @@ -50080,7 +50080,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 1395, 90429, 5, }, // Atlantic/Faroe { 687, 8736, 90434, 5, }, // Atlantic/Madeira { 687, 2748, 90439, 9, }, // Atlantic/Reykjavik - { 687, 7272, 221055, 13, }, // Atlantic/South_Georgia + { 687, 7272, 221046, 13, }, // Atlantic/South_Georgia { 687, 6821, 90463, 11, }, // Atlantic/St_Helena { 687, 6644, 90474, 7, }, // Atlantic/Stanley { 687, 1670, 90481, 6, }, // Australia/Adelaide @@ -50094,7 +50094,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 1727, 90537, 8, }, // Australia/Melbourne { 687, 1762, 90545, 4, }, // Australia/Perth { 687, 1463, 32494, 5, }, // Australia/Sydney - { 687, 6441, 221068, 9, }, // Europe/Amsterdam + { 687, 6441, 221059, 9, }, // Europe/Amsterdam { 687, 6216, 90559, 6, }, // Europe/Andorra { 687, 3620, 90565, 10, }, // Europe/Astrakhan { 687, 2300, 90575, 5, }, // Europe/Athens @@ -50128,7 +50128,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 6410, 90773, 6, }, // Europe/Monaco { 687, 3537, 90779, 6, }, // Europe/Moscow { 687, 6458, 90785, 5, }, // Europe/Oslo - { 687, 4284, 221077, 4, }, // Europe/Paris + { 687, 4284, 221068, 4, }, // Europe/Paris { 687, 6424, 90790, 10, }, // Europe/Podgorica { 687, 6275, 90800, 5, }, // Europe/Prague { 687, 8837, 90805, 4, }, // Europe/Riga @@ -50154,7 +50154,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 6540, 90946, 9, }, // Europe/Zurich { 687, 5078, 90955, 11, }, // Indian/Antananarivo { 687, 6947, 90966, 5, }, // Indian/Chagos - { 687, 6046, 221081, 8, }, // Indian/Christmas + { 687, 6046, 221072, 8, }, // Indian/Christmas { 687, 6063, 90978, 5, }, // Indian/Cocos { 687, 5029, 90983, 6, }, // Indian/Comoro { 687, 6661, 90989, 7, }, // Indian/Kerguelen @@ -50177,7 +50177,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 6696, 91094, 7, }, // Pacific/Gambier { 687, 3822, 91101, 10, }, // Pacific/Guadalcanal { 687, 6018, 31112, 4, }, // Pacific/Guam - { 687, 3049, 221089, 5, }, // Pacific/Kanton + { 687, 3049, 221080, 5, }, // Pacific/Kanton { 687, 3998, 33132, 10, }, // Pacific/Kiritimati { 687, 7019, 91126, 6, }, // Pacific/Kosrae { 687, 2842, 91132, 10, }, // Pacific/Kwajalein @@ -50188,7 +50188,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 687, 7132, 91165, 4, }, // Pacific/Niue { 687, 4168, 91169, 7, }, // Pacific/Norfolk { 687, 7098, 91176, 6, }, // Pacific/Noumea - { 687, 3126, 221094, 9, }, // Pacific/Pago_Pago + { 687, 3126, 221085, 9, }, // Pacific/Pago_Pago { 687, 7155, 91191, 4, }, // Pacific/Palau { 687, 7194, 33210, 8, }, // Pacific/Pitcairn { 687, 3096, 91195, 6, }, // Pacific/Pohnpei @@ -50203,650 +50203,650 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 688, 6788, 195501, 6, }, // Africa/Abidjan Venetian/Latin/Italy { 688, 6760, 74129, 4, }, // Africa/Accra { 688, 5059, 35821, 10, }, // Africa/Addis_Ababa - { 688, 7420, 221103, 6, }, // Africa/Algiers - { 688, 14, 221109, 6, }, // Africa/Asmara - { 688, 5257, 221115, 6, }, // Africa/Bangui - { 688, 7435, 221121, 5, }, // Africa/Bissau - { 688, 4922, 221126, 9, }, // Africa/Bujumbura + { 688, 7420, 221094, 6, }, // Africa/Algiers + { 688, 14, 221100, 6, }, // Africa/Asmara + { 688, 5257, 221106, 6, }, // Africa/Bangui + { 688, 7435, 221112, 5, }, // Africa/Bissau + { 688, 4922, 221117, 9, }, // Africa/Bujumbura { 688, 2320, 161877, 8, }, // Africa/Cairo - { 688, 4117, 221135, 10, }, // Africa/Casablanca + { 688, 4117, 221126, 10, }, // Africa/Casablanca { 688, 7449, 166781, 5, }, // Africa/Ceuta { 688, 6773, 157976, 7, }, // Africa/Conakry { 688, 5130, 21354, 12, }, // Africa/Dar_es_Salaam { 688, 5043, 158501, 6, }, // Africa/Djibouti { 688, 5243, 21372, 5, }, // Africa/Douala { 688, 5166, 6393, 7, }, // Africa/El_Aaiun - { 688, 5151, 221145, 7, }, // Africa/Kampala + { 688, 5151, 221136, 7, }, // Africa/Kampala { 688, 4524, 157994, 6, }, // Africa/Khartoum { 688, 6869, 20418, 4, }, // Africa/Lome - { 688, 4939, 221152, 10, }, // Africa/Lubumbashi - { 688, 5197, 221162, 6, }, // Africa/Maseru - { 688, 5182, 221168, 7, }, // Africa/Mbabane - { 688, 5113, 221175, 8, }, // Africa/Mogadishu + { 688, 4939, 221143, 10, }, // Africa/Lubumbashi + { 688, 5197, 221153, 6, }, // Africa/Maseru + { 688, 5182, 221159, 7, }, // Africa/Mbabane + { 688, 5113, 221166, 8, }, // Africa/Mogadishu { 688, 5271, 195575, 6, }, // Africa/Ndjamena { 688, 6803, 147724, 8, }, // Africa/Nouakchott - { 688, 6727, 221183, 8, }, // Africa/Ouagadougou + { 688, 6727, 221174, 8, }, // Africa/Ouagadougou { 688, 5225, 26542, 10, }, // Africa/Porto-Novo - { 688, 4435, 221191, 15, }, // Africa/Sao_Tome + { 688, 4435, 221182, 15, }, // Africa/Sao_Tome { 688, 2866, 164486, 7, }, // Africa/Tripoli - { 688, 6554, 221206, 6, }, // Africa/Tunis + { 688, 6554, 221197, 6, }, // Africa/Tunis { 688, 5607, 4775, 7, }, // America/Anguilla - { 688, 270, 221212, 7, }, // America/Argentina/Cordoba - { 688, 7489, 221219, 11, }, // America/Argentina/Rio_Gallegos + { 688, 270, 221203, 7, }, // America/Argentina/Cordoba + { 688, 7489, 221210, 11, }, // America/Argentina/Rio_Gallegos { 688, 4252, 6592, 8, }, // America/Asuncion { 688, 237, 22, 8, }, // America/Atikokan - { 688, 7623, 221230, 16, }, // America/Bahia_Banderas + { 688, 7623, 221221, 16, }, // America/Bahia_Banderas { 688, 4361, 44161, 6, }, // America/Bogota - { 688, 7735, 221246, 12, }, // America/Campo_Grande + { 688, 7735, 221237, 12, }, // America/Campo_Grande { 688, 3868, 33314, 6, }, // America/Cancun { 688, 4345, 147758, 6, }, // America/Cayenne { 688, 5496, 44173, 6, }, // America/Cayman { 688, 7774, 60, 6, }, // America/Ciudad_Juarez - { 688, 3791, 221258, 6, }, // America/Cuiaba + { 688, 3791, 221249, 6, }, // America/Cuiaba { 688, 5723, 66, 7, }, // America/Curacao - { 688, 805, 221264, 6, }, // America/Denver - { 688, 5739, 221270, 8, }, // America/Dominica + { 688, 805, 221255, 6, }, // America/Denver + { 688, 5739, 221261, 8, }, // America/Dominica { 688, 7869, 26580, 8, }, // America/Eirunepe { 688, 5770, 20519, 7, }, // America/Grenada { 688, 5786, 95109, 9, }, // America/Guadeloupe { 688, 2281, 95118, 7, }, // America/Havana - { 688, 348, 221278, 12, }, // America/Indiana/Indianapolis - { 688, 481, 221290, 14, }, // America/Indiana/Knox - { 688, 7961, 221304, 17, }, // America/Indiana/Marengo - { 688, 7985, 221321, 20, }, // America/Indiana/Petersburg - { 688, 8012, 221341, 19, }, // America/Indiana/Tell_City - { 688, 8038, 221360, 15, }, // America/Indiana/Vevay - { 688, 8060, 221375, 19, }, // America/Indiana/Vincennes - { 688, 8086, 221394, 17, }, // America/Indiana/Winamac - { 688, 2799, 221411, 7, }, // America/Jamaica - { 688, 8125, 221418, 21, }, // America/Kentucky/Monticello - { 688, 3239, 221439, 11, }, // America/Los_Angeles + { 688, 348, 221269, 12, }, // America/Indiana/Indianapolis + { 688, 481, 221281, 14, }, // America/Indiana/Knox + { 688, 7961, 221295, 17, }, // America/Indiana/Marengo + { 688, 7985, 221312, 20, }, // America/Indiana/Petersburg + { 688, 8012, 221332, 19, }, // America/Indiana/Tell_City + { 688, 8038, 221351, 15, }, // America/Indiana/Vevay + { 688, 8060, 221366, 19, }, // America/Indiana/Vincennes + { 688, 8086, 221385, 17, }, // America/Indiana/Winamac + { 688, 2799, 221402, 7, }, // America/Jamaica + { 688, 8125, 221409, 21, }, // America/Kentucky/Monticello + { 688, 3239, 221430, 11, }, // America/Los_Angeles { 688, 5932, 207, 22, }, // America/Lower_Princes { 688, 8153, 26588, 6, }, // America/Maceio - { 688, 5805, 221450, 9, }, // America/Martinique + { 688, 5805, 221441, 9, }, // America/Martinique { 688, 8220, 229, 6, }, // America/Merida - { 688, 2949, 221459, 16, }, // America/Mexico_City - { 688, 4391, 221475, 8, }, // America/Miquelon + { 688, 2949, 221450, 16, }, // America/Mexico_City + { 688, 4391, 221466, 8, }, // America/Miquelon { 688, 8270, 21944, 8, }, // America/Monterrey { 688, 5824, 7172, 9, }, // America/Montserrat { 688, 1850, 235, 19, }, // America/Noronha - { 688, 8301, 221483, 20, }, // America/North_Dakota/Beulah - { 688, 8329, 221503, 20, }, // America/North_Dakota/Center - { 688, 8357, 221523, 23, }, // America/North_Dakota/New_Salem + { 688, 8301, 221474, 20, }, // America/North_Dakota/Beulah + { 688, 8329, 221494, 20, }, // America/North_Dakota/Center + { 688, 8357, 221514, 23, }, // America/North_Dakota/New_Salem { 688, 393, 317, 4, }, // America/Nuuk { 688, 2356, 164613, 6, }, // America/Panama - { 688, 3945, 221546, 14, }, // America/Port-au-Prince - { 688, 5954, 221560, 15, }, // America/Port_of_Spain + { 688, 3945, 221537, 14, }, // America/Port-au-Prince + { 688, 5954, 221551, 15, }, // America/Port_of_Spain { 688, 5843, 95222, 9, }, // America/Puerto_Rico - { 688, 1878, 221575, 8, }, // America/Sao_Paulo + { 688, 1878, 221566, 8, }, // America/Sao_Paulo { 688, 6899, 321, 16, }, // America/Scoresbysund - { 688, 8508, 221583, 13, }, // America/St_Barthelemy - { 688, 2061, 221596, 8, }, // America/St_Johns - { 688, 5863, 221604, 12, }, // America/St_Kitts - { 688, 5880, 221616, 8, }, // America/St_Lucia - { 688, 855, 221197, 9, }, // America/St_Thomas - { 688, 5913, 221624, 11, }, // America/St_Vincent + { 688, 8508, 221574, 13, }, // America/St_Barthelemy + { 688, 2061, 221587, 8, }, // America/St_Johns + { 688, 5863, 221595, 12, }, // America/St_Kitts + { 688, 5880, 221607, 8, }, // America/St_Lucia + { 688, 855, 221188, 9, }, // America/St_Thomas + { 688, 5913, 221615, 11, }, // America/St_Vincent { 688, 5688, 148000, 7, }, // America/Tortola { 688, 6133, 400, 16, }, // Antarctica/DumontDUrville - { 688, 8568, 221635, 15, }, // Antarctica/Macquarie + { 688, 8568, 221626, 15, }, // Antarctica/Macquarie { 688, 5395, 7594, 6, }, // Asia/Almaty { 688, 3968, 5605, 4, }, // Asia/Amman - { 688, 5511, 221650, 6, }, // Asia/Anadyr - { 688, 5523, 221656, 5, }, // Asia/Aqtau + { 688, 5511, 221641, 6, }, // Asia/Anadyr + { 688, 5523, 221647, 5, }, // Asia/Aqtau { 688, 5368, 7606, 6, }, // Asia/Aqtobe - { 688, 964, 221661, 7, }, // Asia/Ashgabat - { 688, 8624, 221668, 6, }, // Asia/Atyrau + { 688, 964, 221652, 7, }, // Asia/Ashgabat + { 688, 8624, 221659, 6, }, // Asia/Atyrau { 688, 3607, 4162, 6, }, // Asia/Baghdad { 688, 5534, 63955, 6, }, // Asia/Bahrain { 688, 3778, 91536, 6, }, // Asia/Bishkek { 688, 5989, 20751, 6, }, // Asia/Brunei { 688, 4601, 93254, 4, }, // Asia/Chita - { 688, 4511, 221674, 7, }, // Asia/Colombo + { 688, 4511, 221665, 7, }, // Asia/Colombo { 688, 4540, 74438, 7, }, // Asia/Damascus { 688, 1093, 158496, 4, }, // Asia/Dhaka - { 688, 3596, 221681, 5, }, // Asia/Dubai - { 688, 6159, 221686, 7, }, // Asia/Dushanbe + { 688, 3596, 221672, 5, }, // Asia/Dubai + { 688, 6159, 221677, 7, }, // Asia/Dushanbe { 688, 8636, 95258, 9, }, // Asia/Famagusta { 688, 1259, 432, 11, }, // Asia/Ho_Chi_Minh { 688, 1290, 123559, 10, }, // Asia/Jerusalem { 688, 4316, 162180, 9, }, // Asia/Kamchatka - { 688, 1185, 221693, 8, }, // Asia/Kathmandu - { 688, 8661, 221701, 7, }, // Asia/Khandyga + { 688, 1185, 221684, 8, }, // Asia/Kathmandu + { 688, 8661, 221692, 7, }, // Asia/Khandyga { 688, 992, 20838, 7, }, // Asia/Kolkata - { 688, 4197, 221708, 11, }, // Asia/Krasnoyarsk - { 688, 4859, 221719, 12, }, // Asia/Kuala_Lumpur - { 688, 1211, 221731, 5, }, // Asia/Macau + { 688, 4197, 221699, 11, }, // Asia/Krasnoyarsk + { 688, 4859, 221710, 12, }, // Asia/Kuala_Lumpur + { 688, 1211, 221722, 5, }, // Asia/Macau { 688, 1349, 7736, 7, }, // Asia/Makassar { 688, 6920, 20857, 7, }, // Asia/Muscat - { 688, 8675, 221736, 13, }, // Asia/Novokuznetsk + { 688, 8675, 221727, 13, }, // Asia/Novokuznetsk { 688, 7145, 65240, 5, }, // Asia/Oral { 688, 6961, 22518, 8, }, // Asia/Phnom_Penh { 688, 5559, 73150, 5, }, // Asia/Qatar - { 688, 8708, 221749, 8, }, // Asia/Qostanay + { 688, 8708, 221740, 8, }, // Asia/Qostanay { 688, 4269, 7778, 9, }, // Asia/Qyzylorda { 688, 3584, 7787, 4, }, // Asia/Riyadh { 688, 4408, 158282, 7, }, // Asia/Sakhalin { 688, 7245, 20886, 10, }, // Asia/Samarkand { 688, 3279, 7798, 4, }, // Asia/Seoul - { 688, 1053, 221757, 8, }, // Asia/Shanghai - { 688, 4297, 221765, 13, }, // Asia/Srednekolymsk + { 688, 1053, 221748, 8, }, // Asia/Shanghai + { 688, 4297, 221756, 13, }, // Asia/Srednekolymsk { 688, 3263, 177683, 6, }, // Asia/Taipei { 688, 4781, 91755, 7, }, // Asia/Tashkent { 688, 3915, 220114, 7, }, // Asia/Tbilisi { 688, 2772, 7842, 7, }, // Asia/Tehran - { 688, 1317, 221778, 5, }, // Asia/Thimphu - { 688, 1021, 221783, 10, }, // Asia/Ulaanbaatar + { 688, 1317, 221769, 5, }, // Asia/Thimphu + { 688, 1021, 221774, 10, }, // Asia/Ulaanbaatar { 688, 1159, 202026, 7, }, // Asia/Urumqi - { 688, 8722, 221793, 9, }, // Asia/Ust-Nera + { 688, 8722, 221784, 9, }, // Asia/Ust-Nera { 688, 6977, 26939, 8, }, // Asia/Vientiane { 688, 1235, 477, 6, }, // Asia/Yangon - { 688, 3883, 221802, 14, }, // Asia/Yekaterinburg - { 688, 3747, 221816, 7, }, // Asia/Yerevan - { 688, 3663, 221823, 11, }, // Atlantic/Azores - { 688, 6628, 221834, 13, }, // Atlantic/Canary - { 688, 3727, 221847, 9, }, // Atlantic/Cape_Verde - { 688, 1395, 221856, 11, }, // Atlantic/Faroe - { 688, 8736, 221867, 13, }, // Atlantic/Madeira - { 688, 2748, 221880, 8, }, // Atlantic/Reykjavik - { 688, 7272, 221888, 16, }, // Atlantic/South_Georgia - { 688, 6821, 221904, 14, }, // Atlantic/St_Helena - { 688, 1670, 221918, 8, }, // Australia/Adelaide - { 688, 1635, 221926, 8, }, // Australia/Brisbane - { 688, 1547, 221934, 15, }, // Australia/Lord_Howe - { 688, 6441, 221949, 9, }, // Europe/Amsterdam + { 688, 3883, 221793, 14, }, // Asia/Yekaterinburg + { 688, 3747, 221807, 7, }, // Asia/Yerevan + { 688, 3663, 221814, 11, }, // Atlantic/Azores + { 688, 6628, 221825, 13, }, // Atlantic/Canary + { 688, 3727, 221838, 9, }, // Atlantic/Cape_Verde + { 688, 1395, 221847, 11, }, // Atlantic/Faroe + { 688, 8736, 221858, 13, }, // Atlantic/Madeira + { 688, 2748, 221871, 8, }, // Atlantic/Reykjavik + { 688, 7272, 221879, 16, }, // Atlantic/South_Georgia + { 688, 6821, 221895, 14, }, // Atlantic/St_Helena + { 688, 1670, 221909, 8, }, // Australia/Adelaide + { 688, 1635, 221917, 8, }, // Australia/Brisbane + { 688, 1547, 221925, 15, }, // Australia/Lord_Howe + { 688, 6441, 221940, 9, }, // Europe/Amsterdam { 688, 6216, 33638, 6, }, // Europe/Andorra { 688, 3620, 33644, 8, }, // Europe/Astrakhan { 688, 2300, 5911, 5, }, // Europe/Athens { 688, 6336, 58906, 8, }, // Europe/Belgrade - { 688, 6488, 221958, 10, }, // Europe/Bratislava + { 688, 6488, 221949, 10, }, // Europe/Bratislava { 688, 2167, 27022, 6, }, // Europe/Brussels { 688, 3928, 21073, 8, }, // Europe/Bucharest { 688, 8772, 27037, 8, }, // Europe/Busingen { 688, 6289, 95331, 10, }, // Europe/Copenhagen - { 688, 6307, 221968, 9, }, // Europe/Gibraltar - { 688, 8804, 221977, 12, }, // Europe/Isle_of_Man + { 688, 6307, 221959, 9, }, // Europe/Gibraltar + { 688, 8804, 221968, 12, }, // Europe/Isle_of_Man { 688, 1130, 164893, 8, }, // Europe/Istanbul { 688, 3979, 63006, 12, }, // Europe/Kaliningrad { 688, 2527, 8148, 4, }, // Europe/Kyiv { 688, 3213, 157721, 7, }, // Europe/Lisbon - { 688, 6506, 221989, 8, }, // Europe/Ljubljana + { 688, 6506, 221980, 8, }, // Europe/Ljubljana { 688, 2501, 95370, 6, }, // Europe/London - { 688, 6365, 221997, 10, }, // Europe/Luxembourg + { 688, 6365, 221988, 10, }, // Europe/Luxembourg { 688, 6410, 44570, 6, }, // Europe/Monaco { 688, 3537, 95387, 5, }, // Europe/Moscow - { 688, 6458, 222007, 4, }, // Europe/Oslo - { 688, 4284, 222011, 6, }, // Europe/Paris + { 688, 6458, 221998, 4, }, // Europe/Oslo + { 688, 4284, 222002, 6, }, // Europe/Paris { 688, 6424, 196828, 9, }, // Europe/Podgorica { 688, 6275, 21185, 5, }, // Europe/Prague { 688, 6324, 6064, 4, }, // Europe/Rome { 688, 6470, 65868, 9, }, // Europe/San_Marino - { 688, 8849, 222017, 11, }, // Europe/Simferopol - { 688, 6523, 222028, 8, }, // Europe/Stockholm + { 688, 8849, 222008, 11, }, // Europe/Simferopol + { 688, 6523, 222019, 8, }, // Europe/Stockholm { 688, 8867, 8250, 5, }, // Europe/Tallinn { 688, 6202, 21213, 6, }, // Europe/Tirane - { 688, 8882, 222036, 8, }, // Europe/Ulyanovsk - { 688, 6567, 222044, 7, }, // Europe/Vatican + { 688, 8882, 222027, 8, }, // Europe/Ulyanovsk + { 688, 6567, 222035, 7, }, // Europe/Vatican { 688, 6231, 21230, 5, }, // Europe/Vienna { 688, 4727, 63187, 10, }, // Europe/Volgograd { 688, 3190, 95436, 8, }, // Europe/Warsaw { 688, 6540, 95452, 6, }, // Europe/Zurich - { 688, 6947, 222051, 6, }, // Indian/Chagos - { 688, 6046, 222057, 15, }, // Indian/Christmas - { 688, 6063, 222072, 11, }, // Indian/Cocos - { 688, 5029, 222083, 12, }, // Indian/Comoro + { 688, 6947, 222042, 6, }, // Indian/Chagos + { 688, 6046, 222048, 15, }, // Indian/Christmas + { 688, 6063, 222063, 11, }, // Indian/Cocos + { 688, 5029, 222074, 12, }, // Indian/Comoro { 688, 7260, 27115, 4, }, // Indian/Mahe - { 688, 7050, 222095, 13, }, // Indian/Maldives - { 688, 4069, 222108, 14, }, // Indian/Mauritius - { 688, 5098, 222122, 12, }, // Indian/Mayotte - { 688, 7211, 222134, 13, }, // Indian/Reunion - { 688, 3706, 222147, 18, }, // Pacific/Bougainville - { 688, 3015, 222165, 12, }, // Pacific/Chatham - { 688, 3157, 222177, 11, }, // Pacific/Chuuk - { 688, 2237, 222188, 15, }, // Pacific/Easter - { 688, 7360, 222203, 11, }, // Pacific/Efate - { 688, 7327, 222214, 13, }, // Pacific/Fakaofo - { 688, 7343, 222227, 14, }, // Pacific/Funafuti + { 688, 7050, 222086, 13, }, // Indian/Maldives + { 688, 4069, 222099, 14, }, // Indian/Mauritius + { 688, 5098, 222113, 12, }, // Indian/Mayotte + { 688, 7211, 222125, 13, }, // Indian/Reunion + { 688, 3706, 222138, 18, }, // Pacific/Bougainville + { 688, 3015, 222156, 12, }, // Pacific/Chatham + { 688, 3157, 222168, 11, }, // Pacific/Chuuk + { 688, 2237, 222179, 15, }, // Pacific/Easter + { 688, 7360, 222194, 11, }, // Pacific/Efate + { 688, 7327, 222205, 13, }, // Pacific/Fakaofo + { 688, 7343, 222218, 14, }, // Pacific/Funafuti { 688, 6678, 167332, 9, }, // Pacific/Galapagos - { 688, 6696, 222241, 13, }, // Pacific/Gambier - { 688, 3822, 222254, 17, }, // Pacific/Guadalcanal - { 688, 3049, 222271, 12, }, // Pacific/Kanton - { 688, 3998, 222283, 16, }, // Pacific/Kiritimati - { 688, 7019, 222299, 12, }, // Pacific/Kosrae - { 688, 2842, 222311, 15, }, // Pacific/Kwajalein - { 688, 4051, 222326, 14, }, // Pacific/Marquesas - { 688, 8914, 222340, 12, }, // Pacific/Midway - { 688, 7084, 222352, 11, }, // Pacific/Nauru - { 688, 7132, 222363, 10, }, // Pacific/Niue - { 688, 4168, 222373, 13, }, // Pacific/Norfolk + { 688, 6696, 222232, 13, }, // Pacific/Gambier + { 688, 3822, 222245, 17, }, // Pacific/Guadalcanal + { 688, 3049, 222262, 12, }, // Pacific/Kanton + { 688, 3998, 222274, 16, }, // Pacific/Kiritimati + { 688, 7019, 222290, 12, }, // Pacific/Kosrae + { 688, 2842, 222302, 15, }, // Pacific/Kwajalein + { 688, 4051, 222317, 14, }, // Pacific/Marquesas + { 688, 8914, 222331, 12, }, // Pacific/Midway + { 688, 7084, 222343, 11, }, // Pacific/Nauru + { 688, 7132, 222354, 10, }, // Pacific/Niue + { 688, 4168, 222364, 13, }, // Pacific/Norfolk { 688, 7098, 4628, 6, }, // Pacific/Noumea { 688, 3126, 135456, 11, }, // Pacific/Pago_Pago - { 688, 7155, 222386, 5, }, // Pacific/Palau - { 688, 7194, 222391, 14, }, // Pacific/Pitcairn - { 688, 3096, 222405, 12, }, // Pacific/Pohnpei - { 688, 4807, 222417, 13, }, // Pacific/Port_Moresby - { 688, 6076, 222430, 15, }, // Pacific/Rarotonga - { 688, 6031, 222445, 12, }, // Pacific/Saipan - { 688, 7312, 222457, 11, }, // Pacific/Tahiti - { 688, 6712, 222468, 13, }, // Pacific/Tarawa - { 688, 4583, 222481, 15, }, // Pacific/Tongatapu - { 688, 7392, 222496, 10, }, // Pacific/Wake - { 688, 7405, 222506, 12, }, // Pacific/Wallis - { 689, 6788, 222518, 7, }, // Africa/Abidjan Kuvi/Latin/India - { 689, 6760, 222525, 4, }, // Africa/Accra - { 689, 5059, 222529, 10, }, // Africa/Addis_Ababa - { 689, 7420, 222539, 7, }, // Africa/Algiers - { 689, 14, 222546, 6, }, // Africa/Asmara - { 689, 44, 222552, 6, }, // Africa/Bamako - { 689, 5257, 222558, 6, }, // Africa/Bangui - { 689, 6746, 222564, 6, }, // Africa/Banjul - { 689, 7435, 222570, 6, }, // Africa/Bissau - { 689, 4957, 222576, 8, }, // Africa/Blantyre - { 689, 5287, 222584, 9, }, // Africa/Brazzaville - { 689, 4922, 222593, 9, }, // Africa/Bujumbura - { 689, 2320, 222602, 5, }, // Africa/Cairo - { 689, 4117, 222607, 10, }, // Africa/Casablanca - { 689, 7449, 222617, 5, }, // Africa/Ceuta - { 689, 6773, 222622, 7, }, // Africa/Conakry - { 689, 6840, 222629, 4, }, // Africa/Dakar - { 689, 5130, 222633, 13, }, // Africa/Dar_es_Salaam + { 688, 7155, 222377, 5, }, // Pacific/Palau + { 688, 7194, 222382, 14, }, // Pacific/Pitcairn + { 688, 3096, 222396, 12, }, // Pacific/Pohnpei + { 688, 4807, 222408, 13, }, // Pacific/Port_Moresby + { 688, 6076, 222421, 15, }, // Pacific/Rarotonga + { 688, 6031, 222436, 12, }, // Pacific/Saipan + { 688, 7312, 222448, 11, }, // Pacific/Tahiti + { 688, 6712, 222459, 13, }, // Pacific/Tarawa + { 688, 4583, 222472, 15, }, // Pacific/Tongatapu + { 688, 7392, 222487, 10, }, // Pacific/Wake + { 688, 7405, 222497, 12, }, // Pacific/Wallis + { 689, 6788, 222509, 7, }, // Africa/Abidjan Kuvi/Latin/India + { 689, 6760, 222516, 4, }, // Africa/Accra + { 689, 5059, 222520, 10, }, // Africa/Addis_Ababa + { 689, 7420, 222530, 7, }, // Africa/Algiers + { 689, 14, 222537, 6, }, // Africa/Asmara + { 689, 44, 222543, 6, }, // Africa/Bamako + { 689, 5257, 222549, 6, }, // Africa/Bangui + { 689, 6746, 222555, 6, }, // Africa/Banjul + { 689, 7435, 222561, 6, }, // Africa/Bissau + { 689, 4957, 222567, 8, }, // Africa/Blantyre + { 689, 5287, 222575, 9, }, // Africa/Brazzaville + { 689, 4922, 222584, 9, }, // Africa/Bujumbura + { 689, 2320, 222593, 5, }, // Africa/Cairo + { 689, 4117, 222598, 10, }, // Africa/Casablanca + { 689, 7449, 222608, 5, }, // Africa/Ceuta + { 689, 6773, 222613, 7, }, // Africa/Conakry + { 689, 6840, 222620, 4, }, // Africa/Dakar + { 689, 5130, 222624, 13, }, // Africa/Dar_es_Salaam { 689, 5043, 26493, 6, }, // Africa/Djibouti - { 689, 5243, 222646, 5, }, // Africa/Douala - { 689, 5166, 222651, 9, }, // Africa/El_Aaiun - { 689, 6853, 222660, 7, }, // Africa/Freetown - { 689, 4906, 222667, 7, }, // Africa/Gaborone - { 689, 5015, 222674, 5, }, // Africa/Harare - { 689, 4479, 222679, 12, }, // Africa/Johannesburg - { 689, 4499, 222691, 4, }, // Africa/Juba - { 689, 5151, 222695, 6, }, // Africa/Kampala - { 689, 4524, 222701, 7, }, // Africa/Khartoum - { 689, 4973, 222708, 6, }, // Africa/Kigali - { 689, 5306, 222714, 7, }, // Africa/Kinshasa - { 689, 4744, 222721, 5, }, // Africa/Lagos - { 689, 5336, 222726, 9, }, // Africa/Libreville + { 689, 5243, 222637, 5, }, // Africa/Douala + { 689, 5166, 222642, 9, }, // Africa/El_Aaiun + { 689, 6853, 222651, 7, }, // Africa/Freetown + { 689, 4906, 222658, 7, }, // Africa/Gaborone + { 689, 5015, 222665, 5, }, // Africa/Harare + { 689, 4479, 222670, 12, }, // Africa/Johannesburg + { 689, 4499, 222682, 4, }, // Africa/Juba + { 689, 5151, 222686, 6, }, // Africa/Kampala + { 689, 4524, 222692, 7, }, // Africa/Khartoum + { 689, 4973, 222699, 6, }, // Africa/Kigali + { 689, 5306, 222705, 7, }, // Africa/Kinshasa + { 689, 4744, 222712, 5, }, // Africa/Lagos + { 689, 5336, 222717, 9, }, // Africa/Libreville { 689, 6869, 4087, 3, }, // Africa/Lome - { 689, 5211, 222735, 6, }, // Africa/Luanda - { 689, 4939, 222741, 9, }, // Africa/Lubumbashi - { 689, 5001, 222750, 6, }, // Africa/Lusaka - { 689, 5322, 222756, 6, }, // Africa/Malabo - { 689, 4987, 222762, 6, }, // Africa/Maputo - { 689, 5197, 222768, 6, }, // Africa/Maseru - { 689, 5182, 222774, 7, }, // Africa/Mbabane - { 689, 5113, 222781, 8, }, // Africa/Mogadishu - { 689, 7034, 222789, 8, }, // Africa/Monrovia - { 689, 3853, 222797, 7, }, // Africa/Nairobi - { 689, 5271, 222804, 7, }, // Africa/Ndjamena - { 689, 5354, 222811, 6, }, // Africa/Niamey - { 689, 6803, 222817, 6, }, // Africa/Nouakchott - { 689, 6727, 222823, 7, }, // Africa/Ouagadougou - { 689, 5225, 222830, 10, }, // Africa/Porto-Novo - { 689, 4435, 222840, 7, }, // Africa/Sao_Tome - { 689, 2866, 222847, 7, }, // Africa/Tripoli - { 689, 6554, 222854, 5, }, // Africa/Tunis - { 689, 4152, 222859, 7, }, // Africa/Windhoek - { 689, 132, 222866, 4, }, // America/Adak - { 689, 3346, 222870, 7, }, // America/Anchorage - { 689, 5607, 222877, 8, }, // America/Anguilla - { 689, 5624, 222885, 7, }, // America/Antigua - { 689, 4554, 222892, 9, }, // America/Araguaina - { 689, 166, 222901, 13, }, // America/Argentina/Buenos_Aires - { 689, 91, 222914, 9, }, // America/Argentina/Catamarca - { 689, 270, 222923, 7, }, // America/Argentina/Cordoba - { 689, 441, 222930, 5, }, // America/Argentina/Jujuy - { 689, 7462, 222935, 8, }, // America/Argentina/La_Rioja - { 689, 565, 222943, 7, }, // America/Argentina/Mendoza - { 689, 7489, 222950, 13, }, // America/Argentina/Rio_Gallegos - { 689, 7520, 222963, 5, }, // America/Argentina/Salta - { 689, 7544, 222968, 8, }, // America/Argentina/San_Juan - { 689, 5580, 222976, 8, }, // America/Argentina/San_Luis - { 689, 7571, 222984, 6, }, // America/Argentina/Tucuman - { 689, 7597, 222990, 7, }, // America/Argentina/Ushuaia - { 689, 5640, 222997, 5, }, // America/Aruba - { 689, 4252, 223002, 8, }, // America/Asuncion - { 689, 237, 223010, 8, }, // America/Atikokan - { 689, 3679, 223018, 5, }, // America/Bahia - { 689, 7623, 223023, 13, }, // America/Bahia_Banderas - { 689, 5654, 223036, 8, }, // America/Barbados - { 689, 7646, 223044, 5, }, // America/Belem - { 689, 5407, 223049, 5, }, // America/Belize - { 689, 7660, 223054, 12, }, // America/Blanc-Sablon - { 689, 7681, 223066, 9, }, // America/Boa_Vista - { 689, 4361, 223075, 6, }, // America/Bogota - { 689, 7699, 223081, 5, }, // America/Boise - { 689, 7713, 223086, 10, }, // America/Cambridge_Bay - { 689, 7735, 223096, 12, }, // America/Campo_Grande - { 689, 3868, 223108, 6, }, // America/Cancun - { 689, 4694, 223114, 7, }, // America/Caracas - { 689, 4345, 223121, 5, }, // America/Cayenne - { 689, 5496, 223126, 6, }, // America/Cayman - { 689, 2260, 223132, 6, }, // America/Chicago - { 689, 7756, 223138, 9, }, // America/Chihuahua + { 689, 5211, 222726, 6, }, // Africa/Luanda + { 689, 4939, 222732, 9, }, // Africa/Lubumbashi + { 689, 5001, 222741, 6, }, // Africa/Lusaka + { 689, 5322, 222747, 6, }, // Africa/Malabo + { 689, 4987, 222753, 6, }, // Africa/Maputo + { 689, 5197, 222759, 6, }, // Africa/Maseru + { 689, 5182, 222765, 7, }, // Africa/Mbabane + { 689, 5113, 222772, 8, }, // Africa/Mogadishu + { 689, 7034, 222780, 8, }, // Africa/Monrovia + { 689, 3853, 222788, 7, }, // Africa/Nairobi + { 689, 5271, 222795, 7, }, // Africa/Ndjamena + { 689, 5354, 222802, 6, }, // Africa/Niamey + { 689, 6803, 222808, 6, }, // Africa/Nouakchott + { 689, 6727, 222814, 7, }, // Africa/Ouagadougou + { 689, 5225, 222821, 10, }, // Africa/Porto-Novo + { 689, 4435, 222831, 7, }, // Africa/Sao_Tome + { 689, 2866, 222838, 7, }, // Africa/Tripoli + { 689, 6554, 222845, 5, }, // Africa/Tunis + { 689, 4152, 222850, 7, }, // Africa/Windhoek + { 689, 132, 222857, 4, }, // America/Adak + { 689, 3346, 222861, 7, }, // America/Anchorage + { 689, 5607, 222868, 8, }, // America/Anguilla + { 689, 5624, 222876, 7, }, // America/Antigua + { 689, 4554, 222883, 9, }, // America/Araguaina + { 689, 166, 222892, 13, }, // America/Argentina/Buenos_Aires + { 689, 91, 222905, 9, }, // America/Argentina/Catamarca + { 689, 270, 222914, 7, }, // America/Argentina/Cordoba + { 689, 441, 222921, 5, }, // America/Argentina/Jujuy + { 689, 7462, 222926, 8, }, // America/Argentina/La_Rioja + { 689, 565, 222934, 7, }, // America/Argentina/Mendoza + { 689, 7489, 222941, 13, }, // America/Argentina/Rio_Gallegos + { 689, 7520, 222954, 5, }, // America/Argentina/Salta + { 689, 7544, 222959, 8, }, // America/Argentina/San_Juan + { 689, 5580, 222967, 8, }, // America/Argentina/San_Luis + { 689, 7571, 222975, 6, }, // America/Argentina/Tucuman + { 689, 7597, 222981, 7, }, // America/Argentina/Ushuaia + { 689, 5640, 222988, 5, }, // America/Aruba + { 689, 4252, 222993, 8, }, // America/Asuncion + { 689, 237, 223001, 8, }, // America/Atikokan + { 689, 3679, 223009, 5, }, // America/Bahia + { 689, 7623, 223014, 13, }, // America/Bahia_Banderas + { 689, 5654, 223027, 8, }, // America/Barbados + { 689, 7646, 223035, 5, }, // America/Belem + { 689, 5407, 223040, 5, }, // America/Belize + { 689, 7660, 223045, 12, }, // America/Blanc-Sablon + { 689, 7681, 223057, 9, }, // America/Boa_Vista + { 689, 4361, 223066, 6, }, // America/Bogota + { 689, 7699, 223072, 5, }, // America/Boise + { 689, 7713, 223077, 10, }, // America/Cambridge_Bay + { 689, 7735, 223087, 12, }, // America/Campo_Grande + { 689, 3868, 223099, 6, }, // America/Cancun + { 689, 4694, 223105, 7, }, // America/Caracas + { 689, 4345, 223112, 5, }, // America/Cayenne + { 689, 5496, 223117, 6, }, // America/Cayman + { 689, 2260, 223123, 6, }, // America/Chicago + { 689, 7756, 223129, 9, }, // America/Chihuahua { 689, 7774, 53, 13, }, // America/Ciudad_Juarez - { 689, 5422, 223147, 10, }, // America/Costa_Rica - { 689, 7796, 223157, 7, }, // America/Creston - { 689, 3791, 223164, 6, }, // America/Cuiaba - { 689, 5723, 223170, 7, }, // America/Curacao - { 689, 7812, 223177, 11, }, // America/Danmarkshavn - { 689, 7833, 223188, 5, }, // America/Dawson - { 689, 7848, 223193, 11, }, // America/Dawson_Creek - { 689, 805, 223204, 6, }, // America/Denver - { 689, 3465, 223210, 7, }, // America/Detroit - { 689, 5739, 223217, 8, }, // America/Dominica - { 689, 893, 223225, 8, }, // America/Edmonton - { 689, 7869, 223233, 8, }, // America/Eirunepe - { 689, 5441, 223241, 11, }, // America/El_Salvador - { 689, 7886, 223252, 11, }, // America/Fort_Nelson - { 689, 7906, 223263, 9, }, // America/Fortaleza - { 689, 7924, 223272, 8, }, // America/Glace_Bay - { 689, 6881, 223280, 7, }, // America/Goose_Bay - { 689, 4612, 223287, 10, }, // America/Grand_Turk - { 689, 5770, 223297, 7, }, // America/Grenada - { 689, 5786, 223304, 10, }, // America/Guadeloupe - { 689, 3760, 223314, 9, }, // America/Guatemala - { 689, 4841, 223323, 8, }, // America/Guayaquil - { 689, 6932, 223331, 6, }, // America/Guyana - { 689, 1939, 223337, 8, }, // America/Halifax - { 689, 2281, 223345, 6, }, // America/Havana + { 689, 5422, 223138, 10, }, // America/Costa_Rica + { 689, 7796, 223148, 7, }, // America/Creston + { 689, 3791, 223155, 6, }, // America/Cuiaba + { 689, 5723, 223161, 7, }, // America/Curacao + { 689, 7812, 223168, 11, }, // America/Danmarkshavn + { 689, 7833, 223179, 5, }, // America/Dawson + { 689, 7848, 223184, 11, }, // America/Dawson_Creek + { 689, 805, 223195, 6, }, // America/Denver + { 689, 3465, 223201, 7, }, // America/Detroit + { 689, 5739, 223208, 8, }, // America/Dominica + { 689, 893, 223216, 8, }, // America/Edmonton + { 689, 7869, 223224, 8, }, // America/Eirunepe + { 689, 5441, 223232, 11, }, // America/El_Salvador + { 689, 7886, 223243, 11, }, // America/Fort_Nelson + { 689, 7906, 223254, 9, }, // America/Fortaleza + { 689, 7924, 223263, 8, }, // America/Glace_Bay + { 689, 6881, 223271, 7, }, // America/Goose_Bay + { 689, 4612, 223278, 10, }, // America/Grand_Turk + { 689, 5770, 223288, 7, }, // America/Grenada + { 689, 5786, 223295, 10, }, // America/Guadeloupe + { 689, 3760, 223305, 9, }, // America/Guatemala + { 689, 4841, 223314, 8, }, // America/Guayaquil + { 689, 6932, 223322, 6, }, // America/Guyana + { 689, 1939, 223328, 8, }, // America/Halifax + { 689, 2281, 223336, 6, }, // America/Havana { 689, 7942, 6920, 8, }, // America/Hermosillo - { 689, 348, 223351, 12, }, // America/Indiana/Indianapolis - { 689, 481, 223363, 14, }, // America/Indiana/Knox - { 689, 7961, 223377, 17, }, // America/Indiana/Marengo - { 689, 7985, 223394, 20, }, // America/Indiana/Petersburg - { 689, 8012, 223414, 19, }, // America/Indiana/Tell_City - { 689, 8038, 223433, 14, }, // America/Indiana/Vevay - { 689, 8060, 223447, 17, }, // America/Indiana/Vincennes - { 689, 8086, 223464, 17, }, // America/Indiana/Winamac - { 689, 8110, 223481, 6, }, // America/Inuvik - { 689, 660, 223487, 7, }, // America/Iqaluit - { 689, 2799, 223494, 7, }, // America/Jamaica - { 689, 5380, 223501, 5, }, // America/Juneau - { 689, 521, 223506, 9, }, // America/Kentucky/Louisville - { 689, 8125, 223515, 19, }, // America/Kentucky/Monticello - { 689, 5704, 223534, 10, }, // America/Kralendijk - { 689, 4376, 223544, 6, }, // America/La_Paz + { 689, 348, 223342, 12, }, // America/Indiana/Indianapolis + { 689, 481, 223354, 14, }, // America/Indiana/Knox + { 689, 7961, 223368, 17, }, // America/Indiana/Marengo + { 689, 7985, 223385, 20, }, // America/Indiana/Petersburg + { 689, 8012, 223405, 19, }, // America/Indiana/Tell_City + { 689, 8038, 223424, 14, }, // America/Indiana/Vevay + { 689, 8060, 223438, 17, }, // America/Indiana/Vincennes + { 689, 8086, 223455, 17, }, // America/Indiana/Winamac + { 689, 8110, 223472, 6, }, // America/Inuvik + { 689, 660, 223478, 7, }, // America/Iqaluit + { 689, 2799, 223485, 7, }, // America/Jamaica + { 689, 5380, 223492, 5, }, // America/Juneau + { 689, 521, 223497, 9, }, // America/Kentucky/Louisville + { 689, 8125, 223506, 19, }, // America/Kentucky/Monticello + { 689, 5704, 223525, 10, }, // America/Kralendijk + { 689, 4376, 223535, 6, }, // America/La_Paz { 689, 7169, 157373, 4, }, // America/Lima - { 689, 3239, 223550, 11, }, // America/Los_Angeles - { 689, 5932, 223561, 21, }, // America/Lower_Princes - { 689, 8153, 223582, 5, }, // America/Maceio - { 689, 8168, 223587, 7, }, // America/Managua - { 689, 1908, 223594, 6, }, // America/Manaus - { 689, 5897, 223600, 7, }, // America/Marigot - { 689, 5805, 223607, 8, }, // America/Martinique - { 689, 8184, 223615, 9, }, // America/Matamoros - { 689, 2917, 223624, 8, }, // America/Mazatlan - { 689, 8202, 223632, 8, }, // America/Menominee - { 689, 8220, 223640, 6, }, // America/Merida - { 689, 8235, 223646, 10, }, // America/Metlakatla - { 689, 2949, 223656, 12, }, // America/Mexico_City - { 689, 4391, 223668, 7, }, // America/Miquelon - { 689, 8254, 223675, 7, }, // America/Moncton - { 689, 8270, 223682, 8, }, // America/Monterrey - { 689, 4098, 223690, 10, }, // America/Montevideo - { 689, 5824, 223700, 10, }, // America/Montserrat - { 689, 5481, 223710, 5, }, // America/Nassau - { 689, 2379, 223715, 9, }, // America/New_York + { 689, 3239, 223541, 11, }, // America/Los_Angeles + { 689, 5932, 223552, 21, }, // America/Lower_Princes + { 689, 8153, 223573, 5, }, // America/Maceio + { 689, 8168, 223578, 7, }, // America/Managua + { 689, 1908, 223585, 6, }, // America/Manaus + { 689, 5897, 223591, 7, }, // America/Marigot + { 689, 5805, 223598, 8, }, // America/Martinique + { 689, 8184, 223606, 9, }, // America/Matamoros + { 689, 2917, 223615, 8, }, // America/Mazatlan + { 689, 8202, 223623, 8, }, // America/Menominee + { 689, 8220, 223631, 6, }, // America/Merida + { 689, 8235, 223637, 10, }, // America/Metlakatla + { 689, 2949, 223647, 12, }, // America/Mexico_City + { 689, 4391, 223659, 7, }, // America/Miquelon + { 689, 8254, 223666, 7, }, // America/Moncton + { 689, 8270, 223673, 8, }, // America/Monterrey + { 689, 4098, 223681, 10, }, // America/Montevideo + { 689, 5824, 223691, 10, }, // America/Montserrat + { 689, 5481, 223701, 5, }, // America/Nassau + { 689, 2379, 223706, 9, }, // America/New_York { 689, 8288, 7120, 3, }, // America/Nome - { 689, 1850, 223724, 7, }, // America/Noronha - { 689, 8301, 223731, 20, }, // America/North_Dakota/Beulah - { 689, 8329, 223751, 19, }, // America/North_Dakota/Center - { 689, 8357, 223770, 23, }, // America/North_Dakota/New_Salem - { 689, 393, 223793, 3, }, // America/Nuuk - { 689, 8388, 223796, 7, }, // America/Ojinaga - { 689, 2356, 223803, 6, }, // America/Panama - { 689, 6173, 223809, 10, }, // America/Paramaribo - { 689, 2973, 223819, 6, }, // America/Phoenix - { 689, 3945, 223825, 14, }, // America/Port-au-Prince - { 689, 5954, 223839, 13, }, // America/Port_of_Spain - { 689, 8404, 223852, 11, }, // America/Porto_Velho - { 689, 5843, 223863, 11, }, // America/Puerto_Rico - { 689, 4030, 223874, 12, }, // America/Punta_Arenas - { 689, 8424, 223886, 13, }, // America/Rankin_Inlet - { 689, 8445, 223899, 6, }, // America/Recife - { 689, 1995, 223905, 6, }, // America/Regina - { 689, 8460, 223911, 8, }, // America/Resolute - { 689, 695, 223919, 10, }, // America/Rio_Branco - { 689, 8477, 223929, 6, }, // America/Santarem - { 689, 2201, 223935, 8, }, // America/Santiago - { 689, 6111, 223943, 13, }, // America/Santo_Domingo - { 689, 1878, 223956, 9, }, // America/Sao_Paulo - { 689, 6899, 223965, 11, }, // America/Scoresbysund - { 689, 8494, 223976, 5, }, // America/Sitka - { 689, 8508, 223981, 14, }, // America/St_Barthelemy - { 689, 2061, 223995, 9, }, // America/St_Johns - { 689, 5863, 224004, 10, }, // America/St_Kitts - { 689, 5880, 224014, 10, }, // America/St_Lucia - { 689, 855, 224024, 10, }, // America/St_Thomas - { 689, 5913, 224034, 12, }, // America/St_Vincent - { 689, 8530, 224046, 13, }, // America/Swift_Current - { 689, 5461, 224059, 4, }, // America/Tegucigalpa - { 689, 5756, 224063, 4, }, // America/Thule - { 689, 313, 224067, 7, }, // America/Tijuana - { 689, 608, 224074, 7, }, // America/Toronto - { 689, 5688, 224081, 7, }, // America/Tortola - { 689, 2093, 224088, 8, }, // America/Vancouver - { 689, 2144, 224096, 9, }, // America/Whitehorse - { 689, 734, 224105, 8, }, // America/Winnipeg - { 689, 8552, 224113, 7, }, // America/Yakutat - { 689, 6001, 224120, 5, }, // Antarctica/Casey - { 689, 6094, 224125, 5, }, // Antarctica/Davis - { 689, 6133, 224130, 17, }, // Antarctica/DumontDUrville - { 689, 8568, 224147, 7, }, // Antarctica/Macquarie - { 689, 7066, 224154, 6, }, // Antarctica/Mawson - { 689, 7113, 224160, 9, }, // Antarctica/McMurdo - { 689, 8589, 224169, 6, }, // Antarctica/Palmer - { 689, 7226, 224175, 6, }, // Antarctica/Rothera - { 689, 7295, 224181, 5, }, // Antarctica/Syowa - { 689, 8607, 224186, 5, }, // Antarctica/Troll - { 689, 7374, 224191, 6, }, // Antarctica/Vostok - { 689, 1429, 224197, 10, }, // Arctic/Longyearbyen - { 689, 5570, 224207, 4, }, // Asia/Aden - { 689, 5395, 224211, 6, }, // Asia/Almaty - { 689, 3968, 224217, 5, }, // Asia/Amman - { 689, 5511, 224222, 6, }, // Asia/Anadyr - { 689, 5523, 224228, 5, }, // Asia/Aqtau - { 689, 5368, 224233, 7, }, // Asia/Aqtobe - { 689, 964, 224240, 7, }, // Asia/Ashgabat - { 689, 8624, 224247, 6, }, // Asia/Atyrau - { 689, 3607, 224253, 6, }, // Asia/Baghdad - { 689, 5534, 224259, 7, }, // Asia/Bahrain - { 689, 3653, 224266, 4, }, // Asia/Baku - { 689, 4466, 224270, 7, }, // Asia/Bangkok - { 689, 3571, 224277, 7, }, // Asia/Barnaul - { 689, 4086, 224284, 6, }, // Asia/Beirut - { 689, 3778, 224290, 6, }, // Asia/Bishkek - { 689, 5989, 224296, 6, }, // Asia/Brunei - { 689, 4601, 224302, 4, }, // Asia/Chita - { 689, 4511, 224306, 7, }, // Asia/Colombo - { 689, 4540, 224313, 8, }, // Asia/Damascus - { 689, 1093, 222867, 4, }, // Asia/Dhaka - { 689, 6192, 224321, 4, }, // Asia/Dili - { 689, 3596, 224325, 5, }, // Asia/Dubai - { 689, 6159, 224330, 7, }, // Asia/Dushanbe - { 689, 8636, 224337, 9, }, // Asia/Famagusta - { 689, 8651, 224346, 4, }, // Asia/Gaza - { 689, 4795, 224350, 6, }, // Asia/Hebron - { 689, 1259, 224356, 15, }, // Asia/Ho_Chi_Minh - { 689, 2704, 224371, 9, }, // Asia/Hong_Kong + { 689, 1850, 223715, 7, }, // America/Noronha + { 689, 8301, 223722, 20, }, // America/North_Dakota/Beulah + { 689, 8329, 223742, 19, }, // America/North_Dakota/Center + { 689, 8357, 223761, 23, }, // America/North_Dakota/New_Salem + { 689, 393, 223784, 3, }, // America/Nuuk + { 689, 8388, 223787, 7, }, // America/Ojinaga + { 689, 2356, 223794, 6, }, // America/Panama + { 689, 6173, 223800, 10, }, // America/Paramaribo + { 689, 2973, 223810, 6, }, // America/Phoenix + { 689, 3945, 223816, 14, }, // America/Port-au-Prince + { 689, 5954, 223830, 13, }, // America/Port_of_Spain + { 689, 8404, 223843, 11, }, // America/Porto_Velho + { 689, 5843, 223854, 11, }, // America/Puerto_Rico + { 689, 4030, 223865, 12, }, // America/Punta_Arenas + { 689, 8424, 223877, 13, }, // America/Rankin_Inlet + { 689, 8445, 223890, 6, }, // America/Recife + { 689, 1995, 223896, 6, }, // America/Regina + { 689, 8460, 223902, 8, }, // America/Resolute + { 689, 695, 223910, 10, }, // America/Rio_Branco + { 689, 8477, 223920, 6, }, // America/Santarem + { 689, 2201, 223926, 8, }, // America/Santiago + { 689, 6111, 223934, 13, }, // America/Santo_Domingo + { 689, 1878, 223947, 9, }, // America/Sao_Paulo + { 689, 6899, 223956, 11, }, // America/Scoresbysund + { 689, 8494, 223967, 5, }, // America/Sitka + { 689, 8508, 223972, 14, }, // America/St_Barthelemy + { 689, 2061, 223986, 9, }, // America/St_Johns + { 689, 5863, 223995, 10, }, // America/St_Kitts + { 689, 5880, 224005, 10, }, // America/St_Lucia + { 689, 855, 224015, 10, }, // America/St_Thomas + { 689, 5913, 224025, 12, }, // America/St_Vincent + { 689, 8530, 224037, 13, }, // America/Swift_Current + { 689, 5461, 224050, 4, }, // America/Tegucigalpa + { 689, 5756, 224054, 4, }, // America/Thule + { 689, 313, 224058, 7, }, // America/Tijuana + { 689, 608, 224065, 7, }, // America/Toronto + { 689, 5688, 224072, 7, }, // America/Tortola + { 689, 2093, 224079, 8, }, // America/Vancouver + { 689, 2144, 224087, 9, }, // America/Whitehorse + { 689, 734, 224096, 8, }, // America/Winnipeg + { 689, 8552, 224104, 7, }, // America/Yakutat + { 689, 6001, 224111, 5, }, // Antarctica/Casey + { 689, 6094, 224116, 5, }, // Antarctica/Davis + { 689, 6133, 224121, 17, }, // Antarctica/DumontDUrville + { 689, 8568, 224138, 7, }, // Antarctica/Macquarie + { 689, 7066, 224145, 6, }, // Antarctica/Mawson + { 689, 7113, 224151, 9, }, // Antarctica/McMurdo + { 689, 8589, 224160, 6, }, // Antarctica/Palmer + { 689, 7226, 224166, 6, }, // Antarctica/Rothera + { 689, 7295, 224172, 5, }, // Antarctica/Syowa + { 689, 8607, 224177, 5, }, // Antarctica/Troll + { 689, 7374, 224182, 6, }, // Antarctica/Vostok + { 689, 1429, 224188, 10, }, // Arctic/Longyearbyen + { 689, 5570, 224198, 4, }, // Asia/Aden + { 689, 5395, 224202, 6, }, // Asia/Almaty + { 689, 3968, 224208, 5, }, // Asia/Amman + { 689, 5511, 224213, 6, }, // Asia/Anadyr + { 689, 5523, 224219, 5, }, // Asia/Aqtau + { 689, 5368, 224224, 7, }, // Asia/Aqtobe + { 689, 964, 224231, 7, }, // Asia/Ashgabat + { 689, 8624, 224238, 6, }, // Asia/Atyrau + { 689, 3607, 224244, 6, }, // Asia/Baghdad + { 689, 5534, 224250, 7, }, // Asia/Bahrain + { 689, 3653, 224257, 4, }, // Asia/Baku + { 689, 4466, 224261, 7, }, // Asia/Bangkok + { 689, 3571, 224268, 7, }, // Asia/Barnaul + { 689, 4086, 224275, 6, }, // Asia/Beirut + { 689, 3778, 224281, 6, }, // Asia/Bishkek + { 689, 5989, 224287, 6, }, // Asia/Brunei + { 689, 4601, 224293, 4, }, // Asia/Chita + { 689, 4511, 224297, 7, }, // Asia/Colombo + { 689, 4540, 224304, 8, }, // Asia/Damascus + { 689, 1093, 222858, 4, }, // Asia/Dhaka + { 689, 6192, 224312, 4, }, // Asia/Dili + { 689, 3596, 224316, 5, }, // Asia/Dubai + { 689, 6159, 224321, 7, }, // Asia/Dushanbe + { 689, 8636, 224328, 9, }, // Asia/Famagusta + { 689, 8651, 224337, 4, }, // Asia/Gaza + { 689, 4795, 224341, 6, }, // Asia/Hebron + { 689, 1259, 224347, 15, }, // Asia/Ho_Chi_Minh + { 689, 2704, 224362, 9, }, // Asia/Hong_Kong { 689, 4771, 26836, 4, }, // Asia/Hovd - { 689, 4184, 224380, 7, }, // Asia/Irkutsk + { 689, 4184, 224371, 7, }, // Asia/Irkutsk { 689, 7006, 4248, 7, }, // Asia/Jakarta - { 689, 6992, 224387, 8, }, // Asia/Jayapura - { 689, 1290, 224395, 9, }, // Asia/Jerusalem - { 689, 3560, 224404, 5, }, // Asia/Kabul - { 689, 4316, 224409, 8, }, // Asia/Kamchatka - { 689, 4239, 224417, 6, }, // Asia/Karachi - { 689, 1185, 224423, 8, }, // Asia/Kathmandu - { 689, 8661, 224431, 7, }, // Asia/Khandyga - { 689, 992, 224438, 7, }, // Asia/Kolkata - { 689, 4197, 224445, 11, }, // Asia/Krasnoyarsk - { 689, 4859, 224456, 12, }, // Asia/Kuala_Lumpur - { 689, 5976, 224468, 6, }, // Asia/Kuching - { 689, 5547, 224474, 6, }, // Asia/Kuwait - { 689, 1211, 224480, 4, }, // Asia/Macau - { 689, 4017, 224484, 7, }, // Asia/Magadan - { 689, 1349, 224491, 7, }, // Asia/Makassar - { 689, 7182, 224498, 6, }, // Asia/Manila - { 689, 6920, 224504, 6, }, // Asia/Muscat - { 689, 2554, 224510, 8, }, // Asia/Nicosia - { 689, 8675, 224518, 12, }, // Asia/Novokuznetsk - { 689, 4135, 224530, 11, }, // Asia/Novosibirsk + { 689, 6992, 224378, 8, }, // Asia/Jayapura + { 689, 1290, 224386, 9, }, // Asia/Jerusalem + { 689, 3560, 224395, 5, }, // Asia/Kabul + { 689, 4316, 224400, 8, }, // Asia/Kamchatka + { 689, 4239, 224408, 6, }, // Asia/Karachi + { 689, 1185, 224414, 8, }, // Asia/Kathmandu + { 689, 8661, 224422, 7, }, // Asia/Khandyga + { 689, 992, 224429, 7, }, // Asia/Kolkata + { 689, 4197, 224436, 11, }, // Asia/Krasnoyarsk + { 689, 4859, 224447, 12, }, // Asia/Kuala_Lumpur + { 689, 5976, 224459, 6, }, // Asia/Kuching + { 689, 5547, 224465, 6, }, // Asia/Kuwait + { 689, 1211, 224471, 4, }, // Asia/Macau + { 689, 4017, 224475, 7, }, // Asia/Magadan + { 689, 1349, 224482, 7, }, // Asia/Makassar + { 689, 7182, 224489, 6, }, // Asia/Manila + { 689, 6920, 224495, 6, }, // Asia/Muscat + { 689, 2554, 224501, 8, }, // Asia/Nicosia + { 689, 8675, 224509, 12, }, // Asia/Novokuznetsk + { 689, 4135, 224521, 11, }, // Asia/Novosibirsk { 689, 4229, 123801, 4, }, // Asia/Omsk { 689, 7145, 91266, 4, }, // Asia/Oral - { 689, 6961, 224541, 9, }, // Asia/Phnom_Penh - { 689, 8693, 224550, 9, }, // Asia/Pontianak - { 689, 4214, 224559, 9, }, // Asia/Pyongyang + { 689, 6961, 224532, 9, }, // Asia/Phnom_Penh + { 689, 8693, 224541, 9, }, // Asia/Pontianak + { 689, 4214, 224550, 9, }, // Asia/Pyongyang { 689, 5559, 210375, 5, }, // Asia/Qatar - { 689, 8708, 224568, 7, }, // Asia/Qostanay - { 689, 4269, 224575, 8, }, // Asia/Qyzylorda - { 689, 3584, 224583, 5, }, // Asia/Riyadh - { 689, 4408, 224588, 7, }, // Asia/Sakhalin - { 689, 7245, 224595, 9, }, // Asia/Samarkand - { 689, 3279, 224604, 4, }, // Asia/Seoul - { 689, 1053, 224608, 6, }, // Asia/Shanghai - { 689, 3300, 224614, 8, }, // Asia/Singapore - { 689, 4297, 224622, 13, }, // Asia/Srednekolymsk - { 689, 3263, 224635, 6, }, // Asia/Taipei - { 689, 4781, 224641, 7, }, // Asia/Tashkent - { 689, 3915, 224648, 7, }, // Asia/Tbilisi - { 689, 2772, 224655, 6, }, // Asia/Tehran - { 689, 1317, 224661, 6, }, // Asia/Thimphu - { 689, 2821, 224667, 5, }, // Asia/Tokyo - { 689, 4572, 224672, 5, }, // Asia/Tomsk - { 689, 1021, 224677, 9, }, // Asia/Ulaanbaatar - { 689, 1159, 224686, 6, }, // Asia/Urumqi - { 689, 8722, 224692, 9, }, // Asia/Ust-Nera - { 689, 6977, 224701, 9, }, // Asia/Vientiane - { 689, 4710, 224710, 11, }, // Asia/Vladivostok - { 689, 4828, 224721, 7, }, // Asia/Yakutsk - { 689, 1235, 224728, 6, }, // Asia/Yangon - { 689, 3883, 224734, 13, }, // Asia/Yekaterinburg - { 689, 3747, 224747, 7, }, // Asia/Yerevan - { 689, 3663, 224754, 6, }, // Atlantic/Azores - { 689, 5671, 224760, 7, }, // Atlantic/Bermuda - { 689, 6628, 224767, 6, }, // Atlantic/Canary - { 689, 3727, 224773, 9, }, // Atlantic/Cape_Verde - { 689, 1395, 224782, 4, }, // Atlantic/Faroe - { 689, 8736, 224786, 7, }, // Atlantic/Madeira - { 689, 2748, 224793, 9, }, // Atlantic/Reykjavik - { 689, 7272, 224802, 11, }, // Atlantic/South_Georgia - { 689, 6821, 224813, 11, }, // Atlantic/St_Helena - { 689, 6644, 224824, 6, }, // Atlantic/Stanley - { 689, 1670, 224830, 8, }, // Australia/Adelaide - { 689, 1635, 224838, 8, }, // Australia/Brisbane - { 689, 1799, 224846, 11, }, // Australia/Broken_Hill - { 689, 1583, 224857, 6, }, // Australia/Darwin - { 689, 3637, 224863, 5, }, // Australia/Eucla - { 689, 1516, 224868, 6, }, // Australia/Hobart - { 689, 8753, 224874, 9, }, // Australia/Lindeman - { 689, 1547, 224883, 9, }, // Australia/Lord_Howe - { 689, 1727, 224892, 8, }, // Australia/Melbourne - { 689, 1762, 224900, 4, }, // Australia/Perth - { 689, 1463, 224904, 5, }, // Australia/Sydney - { 689, 6441, 224909, 9, }, // Europe/Amsterdam - { 689, 6216, 224918, 7, }, // Europe/Andorra - { 689, 3620, 224925, 9, }, // Europe/Astrakhan - { 689, 2300, 224934, 5, }, // Europe/Athens - { 689, 6336, 224939, 8, }, // Europe/Belgrade - { 689, 4757, 224947, 6, }, // Europe/Berlin - { 689, 6488, 224953, 10, }, // Europe/Bratislava - { 689, 2167, 224963, 8, }, // Europe/Brussels - { 689, 3928, 224971, 8, }, // Europe/Bucharest - { 689, 3806, 224979, 8, }, // Europe/Budapest - { 689, 8772, 224987, 8, }, // Europe/Busingen - { 689, 2583, 224995, 7, }, // Europe/Chisinau - { 689, 6289, 225002, 10, }, // Europe/Copenhagen - { 689, 2338, 225012, 5, }, // Europe/Dublin - { 689, 6307, 225017, 9, }, // Europe/Gibraltar - { 689, 8788, 225026, 6, }, // Europe/Guernsey - { 689, 6612, 225032, 8, }, // Europe/Helsinki - { 689, 8804, 225040, 11, }, // Europe/Isle_of_Man - { 689, 1130, 225051, 8, }, // Europe/Istanbul - { 689, 8823, 225059, 5, }, // Europe/Jersey - { 689, 3979, 225064, 11, }, // Europe/Kaliningrad - { 689, 8929, 225075, 5, }, // Europe/Kirov - { 689, 2527, 225080, 4, }, // Europe/Kyiv - { 689, 3213, 225084, 6, }, // Europe/Lisbon - { 689, 6506, 225090, 9, }, // Europe/Ljubljana - { 689, 2501, 225099, 4, }, // Europe/London - { 689, 6365, 225103, 8, }, // Europe/Luxembourg - { 689, 4892, 225111, 6, }, // Europe/Madrid - { 689, 6397, 225117, 5, }, // Europe/Malta - { 689, 6582, 225122, 8, }, // Europe/Mariehamn - { 689, 3693, 225130, 5, }, // Europe/Minsk - { 689, 6410, 225135, 6, }, // Europe/Monaco - { 689, 3537, 225141, 5, }, // Europe/Moscow - { 689, 6458, 225146, 4, }, // Europe/Oslo - { 689, 4284, 225150, 5, }, // Europe/Paris - { 689, 6424, 225155, 9, }, // Europe/Podgorica - { 689, 6275, 225164, 4, }, // Europe/Prague - { 689, 8837, 225168, 4, }, // Europe/Riga + { 689, 8708, 224559, 7, }, // Asia/Qostanay + { 689, 4269, 224566, 8, }, // Asia/Qyzylorda + { 689, 3584, 224574, 5, }, // Asia/Riyadh + { 689, 4408, 224579, 7, }, // Asia/Sakhalin + { 689, 7245, 224586, 9, }, // Asia/Samarkand + { 689, 3279, 224595, 4, }, // Asia/Seoul + { 689, 1053, 224599, 6, }, // Asia/Shanghai + { 689, 3300, 224605, 8, }, // Asia/Singapore + { 689, 4297, 224613, 13, }, // Asia/Srednekolymsk + { 689, 3263, 224626, 6, }, // Asia/Taipei + { 689, 4781, 224632, 7, }, // Asia/Tashkent + { 689, 3915, 224639, 7, }, // Asia/Tbilisi + { 689, 2772, 224646, 6, }, // Asia/Tehran + { 689, 1317, 224652, 6, }, // Asia/Thimphu + { 689, 2821, 224658, 5, }, // Asia/Tokyo + { 689, 4572, 224663, 5, }, // Asia/Tomsk + { 689, 1021, 224668, 9, }, // Asia/Ulaanbaatar + { 689, 1159, 224677, 6, }, // Asia/Urumqi + { 689, 8722, 224683, 9, }, // Asia/Ust-Nera + { 689, 6977, 224692, 9, }, // Asia/Vientiane + { 689, 4710, 224701, 11, }, // Asia/Vladivostok + { 689, 4828, 224712, 7, }, // Asia/Yakutsk + { 689, 1235, 224719, 6, }, // Asia/Yangon + { 689, 3883, 224725, 13, }, // Asia/Yekaterinburg + { 689, 3747, 224738, 7, }, // Asia/Yerevan + { 689, 3663, 224745, 6, }, // Atlantic/Azores + { 689, 5671, 224751, 7, }, // Atlantic/Bermuda + { 689, 6628, 224758, 6, }, // Atlantic/Canary + { 689, 3727, 224764, 9, }, // Atlantic/Cape_Verde + { 689, 1395, 224773, 4, }, // Atlantic/Faroe + { 689, 8736, 224777, 7, }, // Atlantic/Madeira + { 689, 2748, 224784, 9, }, // Atlantic/Reykjavik + { 689, 7272, 224793, 11, }, // Atlantic/South_Georgia + { 689, 6821, 224804, 11, }, // Atlantic/St_Helena + { 689, 6644, 224815, 6, }, // Atlantic/Stanley + { 689, 1670, 224821, 8, }, // Australia/Adelaide + { 689, 1635, 224829, 8, }, // Australia/Brisbane + { 689, 1799, 224837, 11, }, // Australia/Broken_Hill + { 689, 1583, 224848, 6, }, // Australia/Darwin + { 689, 3637, 224854, 5, }, // Australia/Eucla + { 689, 1516, 224859, 6, }, // Australia/Hobart + { 689, 8753, 224865, 9, }, // Australia/Lindeman + { 689, 1547, 224874, 9, }, // Australia/Lord_Howe + { 689, 1727, 224883, 8, }, // Australia/Melbourne + { 689, 1762, 224891, 4, }, // Australia/Perth + { 689, 1463, 224895, 5, }, // Australia/Sydney + { 689, 6441, 224900, 9, }, // Europe/Amsterdam + { 689, 6216, 224909, 7, }, // Europe/Andorra + { 689, 3620, 224916, 9, }, // Europe/Astrakhan + { 689, 2300, 224925, 5, }, // Europe/Athens + { 689, 6336, 224930, 8, }, // Europe/Belgrade + { 689, 4757, 224938, 6, }, // Europe/Berlin + { 689, 6488, 224944, 10, }, // Europe/Bratislava + { 689, 2167, 224954, 8, }, // Europe/Brussels + { 689, 3928, 224962, 8, }, // Europe/Bucharest + { 689, 3806, 224970, 8, }, // Europe/Budapest + { 689, 8772, 224978, 8, }, // Europe/Busingen + { 689, 2583, 224986, 7, }, // Europe/Chisinau + { 689, 6289, 224993, 10, }, // Europe/Copenhagen + { 689, 2338, 225003, 5, }, // Europe/Dublin + { 689, 6307, 225008, 9, }, // Europe/Gibraltar + { 689, 8788, 225017, 6, }, // Europe/Guernsey + { 689, 6612, 225023, 8, }, // Europe/Helsinki + { 689, 8804, 225031, 11, }, // Europe/Isle_of_Man + { 689, 1130, 225042, 8, }, // Europe/Istanbul + { 689, 8823, 225050, 5, }, // Europe/Jersey + { 689, 3979, 225055, 11, }, // Europe/Kaliningrad + { 689, 8929, 225066, 5, }, // Europe/Kirov + { 689, 2527, 225071, 4, }, // Europe/Kyiv + { 689, 3213, 225075, 6, }, // Europe/Lisbon + { 689, 6506, 225081, 9, }, // Europe/Ljubljana + { 689, 2501, 225090, 4, }, // Europe/London + { 689, 6365, 225094, 8, }, // Europe/Luxembourg + { 689, 4892, 225102, 6, }, // Europe/Madrid + { 689, 6397, 225108, 5, }, // Europe/Malta + { 689, 6582, 225113, 8, }, // Europe/Mariehamn + { 689, 3693, 225121, 5, }, // Europe/Minsk + { 689, 6410, 225126, 6, }, // Europe/Monaco + { 689, 3537, 225132, 5, }, // Europe/Moscow + { 689, 6458, 225137, 4, }, // Europe/Oslo + { 689, 4284, 225141, 5, }, // Europe/Paris + { 689, 6424, 225146, 9, }, // Europe/Podgorica + { 689, 6275, 225155, 4, }, // Europe/Prague + { 689, 8837, 225159, 4, }, // Europe/Riga { 689, 6324, 27088, 3, }, // Europe/Rome - { 689, 4331, 225172, 6, }, // Europe/Samara - { 689, 6470, 225178, 10, }, // Europe/San_Marino - { 689, 6245, 225188, 8, }, // Europe/Sarajevo - { 689, 4451, 225196, 7, }, // Europe/Saratov - { 689, 8849, 225203, 10, }, // Europe/Simferopol - { 689, 6383, 225213, 5, }, // Europe/Skopje - { 689, 6599, 225218, 6, }, // Europe/Sofia - { 689, 6523, 225224, 7, }, // Europe/Stockholm - { 689, 8867, 225231, 5, }, // Europe/Tallinn - { 689, 6202, 225236, 6, }, // Europe/Tirane - { 689, 8882, 225242, 9, }, // Europe/Ulyanovsk - { 689, 6352, 225251, 5, }, // Europe/Vaduz - { 689, 6567, 225256, 7, }, // Europe/Vatican - { 689, 6231, 225263, 6, }, // Europe/Vienna - { 689, 8899, 225269, 7, }, // Europe/Vilnius - { 689, 4727, 225276, 9, }, // Europe/Volgograd - { 689, 3190, 225285, 5, }, // Europe/Warsaw - { 689, 6261, 225290, 11, }, // Europe/Zagreb - { 689, 6540, 225301, 5, }, // Europe/Zurich - { 689, 5078, 225306, 9, }, // Indian/Antananarivo - { 689, 6947, 225315, 6, }, // Indian/Chagos - { 689, 6046, 225321, 8, }, // Indian/Christmas - { 689, 6063, 225329, 5, }, // Indian/Cocos - { 689, 5029, 225334, 6, }, // Indian/Comoro - { 689, 6661, 225340, 9, }, // Indian/Kerguelen - { 689, 7260, 225349, 4, }, // Indian/Mahe - { 689, 7050, 225353, 8, }, // Indian/Maldives - { 689, 4069, 225361, 9, }, // Indian/Mauritius - { 689, 5098, 225370, 5, }, // Indian/Mayotte - { 689, 7211, 225375, 7, }, // Indian/Reunion - { 689, 4422, 225382, 4, }, // Pacific/Apia - { 689, 932, 225386, 6, }, // Pacific/Auckland - { 689, 3706, 225392, 10, }, // Pacific/Bougainville - { 689, 3015, 225402, 5, }, // Pacific/Chatham - { 689, 3157, 225407, 3, }, // Pacific/Chuuk - { 689, 2237, 225410, 5, }, // Pacific/Easter - { 689, 7360, 225415, 5, }, // Pacific/Efate - { 689, 7327, 225420, 7, }, // Pacific/Fakaofo - { 689, 3902, 225427, 4, }, // Pacific/Fiji - { 689, 7343, 225431, 8, }, // Pacific/Funafuti - { 689, 6678, 225439, 9, }, // Pacific/Galapagos - { 689, 6696, 225448, 7, }, // Pacific/Gambier - { 689, 3822, 225455, 11, }, // Pacific/Guadalcanal - { 689, 6018, 223591, 4, }, // Pacific/Guam - { 689, 3049, 225466, 6, }, // Pacific/Kanton - { 689, 3998, 225472, 10, }, // Pacific/Kiritimati - { 689, 7019, 225482, 6, }, // Pacific/Kosrae - { 689, 2842, 225488, 9, }, // Pacific/Kwajalein - { 689, 4877, 225497, 6, }, // Pacific/Majuro - { 689, 4051, 225503, 8, }, // Pacific/Marquesas - { 689, 8914, 225511, 6, }, // Pacific/Midway - { 689, 7084, 225517, 5, }, // Pacific/Nauru - { 689, 7132, 225522, 4, }, // Pacific/Niue - { 689, 4168, 225526, 6, }, // Pacific/Norfolk - { 689, 7098, 225532, 5, }, // Pacific/Noumea - { 689, 3126, 225537, 11, }, // Pacific/Pago_Pago - { 689, 7155, 225548, 5, }, // Pacific/Palau - { 689, 7194, 225553, 7, }, // Pacific/Pitcairn - { 689, 3096, 225560, 6, }, // Pacific/Pohnpei - { 689, 4807, 225566, 12, }, // Pacific/Port_Moresby - { 689, 6076, 225578, 9, }, // Pacific/Rarotonga - { 689, 6031, 225587, 6, }, // Pacific/Saipan - { 689, 7312, 225593, 6, }, // Pacific/Tahiti - { 689, 6712, 225599, 6, }, // Pacific/Tarawa - { 689, 4583, 225605, 9, }, // Pacific/Tongatapu - { 689, 7392, 225614, 3, }, // Pacific/Wake - { 689, 7405, 225617, 6, }, // Pacific/Wallis + { 689, 4331, 225163, 6, }, // Europe/Samara + { 689, 6470, 225169, 10, }, // Europe/San_Marino + { 689, 6245, 225179, 8, }, // Europe/Sarajevo + { 689, 4451, 225187, 7, }, // Europe/Saratov + { 689, 8849, 225194, 10, }, // Europe/Simferopol + { 689, 6383, 225204, 5, }, // Europe/Skopje + { 689, 6599, 225209, 6, }, // Europe/Sofia + { 689, 6523, 225215, 7, }, // Europe/Stockholm + { 689, 8867, 225222, 5, }, // Europe/Tallinn + { 689, 6202, 225227, 6, }, // Europe/Tirane + { 689, 8882, 225233, 9, }, // Europe/Ulyanovsk + { 689, 6352, 225242, 5, }, // Europe/Vaduz + { 689, 6567, 225247, 7, }, // Europe/Vatican + { 689, 6231, 225254, 6, }, // Europe/Vienna + { 689, 8899, 225260, 7, }, // Europe/Vilnius + { 689, 4727, 225267, 9, }, // Europe/Volgograd + { 689, 3190, 225276, 5, }, // Europe/Warsaw + { 689, 6261, 225281, 11, }, // Europe/Zagreb + { 689, 6540, 225292, 5, }, // Europe/Zurich + { 689, 5078, 225297, 9, }, // Indian/Antananarivo + { 689, 6947, 225306, 6, }, // Indian/Chagos + { 689, 6046, 225312, 8, }, // Indian/Christmas + { 689, 6063, 225320, 5, }, // Indian/Cocos + { 689, 5029, 225325, 6, }, // Indian/Comoro + { 689, 6661, 225331, 9, }, // Indian/Kerguelen + { 689, 7260, 225340, 4, }, // Indian/Mahe + { 689, 7050, 225344, 8, }, // Indian/Maldives + { 689, 4069, 225352, 9, }, // Indian/Mauritius + { 689, 5098, 225361, 5, }, // Indian/Mayotte + { 689, 7211, 225366, 7, }, // Indian/Reunion + { 689, 4422, 225373, 4, }, // Pacific/Apia + { 689, 932, 225377, 6, }, // Pacific/Auckland + { 689, 3706, 225383, 10, }, // Pacific/Bougainville + { 689, 3015, 225393, 5, }, // Pacific/Chatham + { 689, 3157, 225398, 3, }, // Pacific/Chuuk + { 689, 2237, 225401, 5, }, // Pacific/Easter + { 689, 7360, 225406, 5, }, // Pacific/Efate + { 689, 7327, 225411, 7, }, // Pacific/Fakaofo + { 689, 3902, 225418, 4, }, // Pacific/Fiji + { 689, 7343, 225422, 8, }, // Pacific/Funafuti + { 689, 6678, 225430, 9, }, // Pacific/Galapagos + { 689, 6696, 225439, 7, }, // Pacific/Gambier + { 689, 3822, 225446, 11, }, // Pacific/Guadalcanal + { 689, 6018, 223582, 4, }, // Pacific/Guam + { 689, 3049, 225457, 6, }, // Pacific/Kanton + { 689, 3998, 225463, 10, }, // Pacific/Kiritimati + { 689, 7019, 225473, 6, }, // Pacific/Kosrae + { 689, 2842, 225479, 9, }, // Pacific/Kwajalein + { 689, 4877, 225488, 6, }, // Pacific/Majuro + { 689, 4051, 225494, 8, }, // Pacific/Marquesas + { 689, 8914, 225502, 6, }, // Pacific/Midway + { 689, 7084, 225508, 5, }, // Pacific/Nauru + { 689, 7132, 225513, 4, }, // Pacific/Niue + { 689, 4168, 225517, 6, }, // Pacific/Norfolk + { 689, 7098, 225523, 5, }, // Pacific/Noumea + { 689, 3126, 225528, 11, }, // Pacific/Pago_Pago + { 689, 7155, 225539, 5, }, // Pacific/Palau + { 689, 7194, 225544, 7, }, // Pacific/Pitcairn + { 689, 3096, 225551, 6, }, // Pacific/Pohnpei + { 689, 4807, 225557, 12, }, // Pacific/Port_Moresby + { 689, 6076, 225569, 9, }, // Pacific/Rarotonga + { 689, 6031, 225578, 6, }, // Pacific/Saipan + { 689, 7312, 225584, 6, }, // Pacific/Tahiti + { 689, 6712, 225590, 6, }, // Pacific/Tarawa + { 689, 4583, 225596, 9, }, // Pacific/Tongatapu + { 689, 7392, 225605, 3, }, // Pacific/Wake + { 689, 7405, 225608, 6, }, // Pacific/Wallis { 690, 6788, 29964, 7, }, // Africa/Abidjan Kuvi/Devanagari/India { 690, 6760, 88252, 5, }, // Africa/Accra { 690, 5059, 88257, 10, }, // Africa/Addis_Ababa @@ -50854,7 +50854,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 14, 88276, 7, }, // Africa/Asmara { 690, 44, 88283, 6, }, // Africa/Bamako { 690, 5257, 88289, 6, }, // Africa/Bangui - { 690, 6746, 225623, 9, }, // Africa/Banjul + { 690, 6746, 225614, 9, }, // Africa/Banjul { 690, 7435, 88301, 5, }, // Africa/Bissau { 690, 4957, 88306, 9, }, // Africa/Blantyre { 690, 5287, 88315, 11, }, // Africa/Brazzaville @@ -50868,31 +50868,31 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 5043, 88368, 6, }, // Africa/Djibouti { 690, 5243, 88374, 5, }, // Africa/Douala { 690, 5166, 88379, 8, }, // Africa/El_Aaiun - { 690, 6853, 225632, 9, }, // Africa/Freetown + { 690, 6853, 225623, 9, }, // Africa/Freetown { 690, 4906, 88396, 7, }, // Africa/Gaborone { 690, 5015, 88403, 5, }, // Africa/Harare { 690, 4479, 88408, 10, }, // Africa/Johannesburg { 690, 4499, 30154, 4, }, // Africa/Juba { 690, 5151, 88418, 6, }, // Africa/Kampala - { 690, 4524, 225641, 7, }, // Africa/Khartoum + { 690, 4524, 225632, 7, }, // Africa/Khartoum { 690, 4973, 88424, 6, }, // Africa/Kigali - { 690, 5306, 225648, 7, }, // Africa/Kinshasa + { 690, 5306, 225639, 7, }, // Africa/Kinshasa { 690, 4744, 88437, 5, }, // Africa/Lagos { 690, 5336, 88442, 10, }, // Africa/Libreville { 690, 6869, 88452, 3, }, // Africa/Lome { 690, 5211, 88455, 6, }, // Africa/Luanda - { 690, 4939, 225655, 9, }, // Africa/Lubumbashi + { 690, 4939, 225646, 9, }, // Africa/Lubumbashi { 690, 5001, 30221, 6, }, // Africa/Lusaka { 690, 5322, 88470, 5, }, // Africa/Malabo { 690, 4987, 88475, 6, }, // Africa/Maputo { 690, 5197, 30239, 6, }, // Africa/Maseru - { 690, 5182, 225664, 9, }, // Africa/Mbabane - { 690, 5113, 225673, 8, }, // Africa/Mogadishu + { 690, 5182, 225655, 9, }, // Africa/Mbabane + { 690, 5113, 225664, 8, }, // Africa/Mogadishu { 690, 7034, 88496, 9, }, // Africa/Monrovia - { 690, 3853, 225681, 7, }, // Africa/Nairobi + { 690, 3853, 225672, 7, }, // Africa/Nairobi { 690, 5271, 88513, 8, }, // Africa/Ndjamena { 690, 5354, 88521, 6, }, // Africa/Niamey - { 690, 6803, 225688, 7, }, // Africa/Nouakchott + { 690, 6803, 225679, 7, }, // Africa/Nouakchott { 690, 6727, 88534, 7, }, // Africa/Ouagadougou { 690, 5225, 88541, 11, }, // Africa/Porto-Novo { 690, 4435, 88552, 7, }, // Africa/Sao_Tome @@ -50912,45 +50912,45 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 565, 88633, 8, }, // America/Argentina/Mendoza { 690, 7489, 88641, 12, }, // America/Argentina/Rio_Gallegos { 690, 7520, 30437, 6, }, // America/Argentina/Salta - { 690, 7544, 225695, 11, }, // America/Argentina/San_Juan - { 690, 5580, 225706, 10, }, // America/Argentina/San_Luis + { 690, 7544, 225686, 11, }, // America/Argentina/San_Juan + { 690, 5580, 225697, 10, }, // America/Argentina/San_Luis { 690, 7571, 88669, 6, }, // America/Argentina/Tucuman - { 690, 7597, 225716, 7, }, // America/Argentina/Ushuaia + { 690, 7597, 225707, 7, }, // America/Argentina/Ushuaia { 690, 5640, 88682, 5, }, // America/Aruba - { 690, 4252, 225723, 8, }, // America/Asuncion + { 690, 4252, 225714, 8, }, // America/Asuncion { 690, 237, 88695, 8, }, // America/Atikokan { 690, 3679, 88703, 5, }, // America/Bahia { 690, 7623, 88708, 15, }, // America/Bahia_Banderas { 690, 5654, 88723, 8, }, // America/Barbados { 690, 7646, 30526, 5, }, // America/Belem { 690, 5407, 88731, 6, }, // America/Belize - { 690, 7660, 225731, 12, }, // America/Blanc-Sablon + { 690, 7660, 225722, 12, }, // America/Blanc-Sablon { 690, 7681, 88750, 10, }, // America/Boa_Vista { 690, 4361, 88760, 6, }, // America/Bogota { 690, 7699, 88766, 5, }, // America/Boise - { 690, 7713, 225743, 12, }, // America/Cambridge_Bay - { 690, 7735, 225755, 16, }, // America/Campo_Grande - { 690, 3868, 225771, 8, }, // America/Cancun + { 690, 7713, 225734, 12, }, // America/Cambridge_Bay + { 690, 7735, 225746, 16, }, // America/Campo_Grande + { 690, 3868, 225762, 8, }, // America/Cancun { 690, 4694, 88805, 6, }, // America/Caracas { 690, 4345, 30609, 5, }, // America/Cayenne { 690, 5496, 138409, 7, }, // America/Cayman - { 690, 2260, 225779, 6, }, // America/Chicago + { 690, 2260, 225770, 6, }, // America/Chicago { 690, 7756, 88817, 8, }, // America/Chihuahua { 690, 5422, 88841, 11, }, // America/Costa_Rica { 690, 7796, 30642, 8, }, // America/Creston { 690, 3791, 88852, 7, }, // America/Cuiaba { 690, 5723, 88859, 7, }, // America/Curacao - { 690, 7812, 225785, 11, }, // America/Danmarkshavn + { 690, 7812, 225776, 11, }, // America/Danmarkshavn { 690, 7833, 88877, 4, }, // America/Dawson { 690, 7848, 88881, 10, }, // America/Dawson_Creek { 690, 805, 88891, 5, }, // America/Denver { 690, 3465, 88896, 8, }, // America/Detroit { 690, 5739, 88904, 8, }, // America/Dominica { 690, 893, 88912, 6, }, // America/Edmonton - { 690, 7869, 225796, 8, }, // America/Eirunepe + { 690, 7869, 225787, 8, }, // America/Eirunepe { 690, 5441, 88918, 11, }, // America/El_Salvador - { 690, 7886, 225804, 13, }, // America/Fort_Nelson - { 690, 7906, 225817, 12, }, // America/Fortaleza + { 690, 7886, 225795, 13, }, // America/Fort_Nelson + { 690, 7906, 225808, 12, }, // America/Fortaleza { 690, 7924, 30760, 8, }, // America/Glace_Bay { 690, 6881, 113910, 6, }, // America/Goose_Bay { 690, 4612, 88974, 11, }, // America/Grand_Turk @@ -50959,7 +50959,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 3760, 30806, 10, }, // America/Guatemala { 690, 4841, 88994, 9, }, // America/Guayaquil { 690, 6932, 89003, 5, }, // America/Guyana - { 690, 1939, 225829, 9, }, // America/Halifax + { 690, 1939, 225820, 9, }, // America/Halifax { 690, 2281, 89018, 5, }, // America/Havana { 690, 7942, 89023, 11, }, // America/Hermosillo { 690, 348, 89034, 13, }, // America/Indiana/Indianapolis @@ -50971,20 +50971,20 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 8060, 89131, 18, }, // America/Indiana/Vincennes { 690, 8086, 89149, 17, }, // America/Indiana/Winamac { 690, 8110, 30999, 6, }, // America/Inuvik - { 690, 660, 225838, 8, }, // America/Iqaluit + { 690, 660, 225829, 8, }, // America/Iqaluit { 690, 2799, 138734, 6, }, // America/Jamaica { 690, 5380, 89178, 7, }, // America/Juneau { 690, 521, 89185, 8, }, // America/Kentucky/Louisville { 690, 8125, 89193, 17, }, // America/Kentucky/Monticello - { 690, 5704, 225846, 13, }, // America/Kralendijk + { 690, 5704, 225837, 13, }, // America/Kralendijk { 690, 4376, 89222, 7, }, // America/La_Paz { 690, 7169, 31064, 4, }, // America/Lima { 690, 3239, 89229, 11, }, // America/Los_Angeles { 690, 5932, 89240, 22, }, // America/Lower_Princes { 690, 8153, 89262, 5, }, // America/Maceio { 690, 8168, 89267, 7, }, // America/Managua - { 690, 1908, 225859, 4, }, // America/Manaus - { 690, 5897, 225863, 7, }, // America/Marigot + { 690, 1908, 225850, 4, }, // America/Manaus + { 690, 5897, 225854, 7, }, // America/Marigot { 690, 5805, 89285, 9, }, // America/Martinique { 690, 8184, 89294, 9, }, // America/Matamoros { 690, 2917, 89303, 9, }, // America/Mazatlan @@ -51001,43 +51001,43 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 2379, 89392, 9, }, // America/New_York { 690, 8288, 89314, 3, }, // America/Nome { 690, 1850, 89401, 8, }, // America/Noronha - { 690, 8301, 225870, 19, }, // America/North_Dakota/Beulah - { 690, 8329, 225889, 18, }, // America/North_Dakota/Center - { 690, 8357, 225907, 23, }, // America/North_Dakota/New_Salem + { 690, 8301, 225861, 19, }, // America/North_Dakota/Beulah + { 690, 8329, 225880, 18, }, // America/North_Dakota/Center + { 690, 8357, 225898, 23, }, // America/North_Dakota/New_Salem { 690, 393, 89472, 3, }, // America/Nuuk - { 690, 8388, 225930, 9, }, // America/Ojinaga + { 690, 8388, 225921, 9, }, // America/Ojinaga { 690, 2356, 89484, 5, }, // America/Panama { 690, 6173, 89489, 10, }, // America/Paramaribo - { 690, 2973, 225939, 8, }, // America/Phoenix + { 690, 2973, 225930, 8, }, // America/Phoenix { 690, 3945, 89507, 14, }, // America/Port-au-Prince - { 690, 5954, 225947, 15, }, // America/Port_of_Spain + { 690, 5954, 225938, 15, }, // America/Port_of_Spain { 690, 8404, 89536, 13, }, // America/Porto_Velho { 690, 5843, 89549, 11, }, // America/Puerto_Rico { 690, 4030, 89560, 12, }, // America/Punta_Arenas { 690, 8424, 89572, 12, }, // America/Rankin_Inlet - { 690, 8445, 225962, 7, }, // America/Recife + { 690, 8445, 225953, 7, }, // America/Recife { 690, 1995, 31431, 6, }, // America/Regina { 690, 8460, 89591, 9, }, // America/Resolute { 690, 695, 89600, 12, }, // America/Rio_Branco - { 690, 8477, 225969, 9, }, // America/Santarem - { 690, 2201, 225978, 8, }, // America/Santiago + { 690, 8477, 225960, 9, }, // America/Santarem + { 690, 2201, 225969, 8, }, // America/Santiago { 690, 6111, 89629, 13, }, // America/Santo_Domingo { 690, 1878, 89642, 9, }, // America/Sao_Paulo { 690, 6899, 89651, 13, }, // America/Scoresbysund { 690, 8494, 89664, 6, }, // America/Sitka - { 690, 8508, 225986, 15, }, // America/St_Barthelemy + { 690, 8508, 225977, 15, }, // America/St_Barthelemy { 690, 2061, 114496, 10, }, // America/St_Johns { 690, 5863, 89694, 10, }, // America/St_Kitts { 690, 5880, 89704, 11, }, // America/St_Lucia - { 690, 855, 226001, 9, }, // America/St_Thomas + { 690, 855, 225992, 9, }, // America/St_Thomas { 690, 5913, 89724, 12, }, // America/St_Vincent - { 690, 8530, 226010, 13, }, // America/Swift_Current + { 690, 8530, 226001, 13, }, // America/Swift_Current { 690, 5461, 89749, 11, }, // America/Tegucigalpa { 690, 5756, 129890, 4, }, // America/Thule { 690, 313, 89766, 7, }, // America/Tijuana { 690, 608, 89773, 6, }, // America/Toronto { 690, 5688, 89779, 8, }, // America/Tortola - { 690, 2093, 226023, 10, }, // America/Vancouver + { 690, 2093, 226014, 10, }, // America/Vancouver { 690, 2144, 89794, 11, }, // America/Whitehorse { 690, 734, 89805, 7, }, // America/Winnipeg { 690, 8552, 89812, 7, }, // America/Yakutat @@ -51046,37 +51046,37 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 6133, 89824, 19, }, // Antarctica/DumontDUrville { 690, 8568, 89843, 7, }, // Antarctica/Macquarie { 690, 7066, 89850, 4, }, // Antarctica/Mawson - { 690, 7113, 226033, 11, }, // Antarctica/McMurdo + { 690, 7113, 226024, 11, }, // Antarctica/McMurdo { 690, 8589, 89863, 4, }, // Antarctica/Palmer { 690, 7226, 89867, 6, }, // Antarctica/Rothera { 690, 7295, 89873, 6, }, // Antarctica/Syowa { 690, 8607, 89879, 5, }, // Antarctica/Troll { 690, 7374, 89884, 7, }, // Antarctica/Vostok - { 690, 1429, 226044, 12, }, // Arctic/Longyearbyen + { 690, 1429, 226035, 12, }, // Arctic/Longyearbyen { 690, 5570, 89904, 4, }, // Asia/Aden { 690, 5395, 89908, 7, }, // Asia/Almaty { 690, 3968, 89915, 6, }, // Asia/Amman { 690, 5511, 89921, 6, }, // Asia/Anadyr { 690, 5523, 31778, 6, }, // Asia/Aqtau { 690, 5368, 114670, 7, }, // Asia/Aqtobe - { 690, 964, 226056, 8, }, // Asia/Ashgabat + { 690, 964, 226047, 8, }, // Asia/Ashgabat { 690, 8624, 89933, 5, }, // Asia/Atyrau { 690, 3607, 89938, 5, }, // Asia/Baghdad { 690, 5534, 89943, 5, }, // Asia/Bahrain { 690, 3653, 88857, 4, }, // Asia/Baku - { 690, 4466, 226064, 9, }, // Asia/Bangkok + { 690, 4466, 226055, 9, }, // Asia/Bangkok { 690, 3571, 89954, 6, }, // Asia/Barnaul { 690, 4086, 89960, 5, }, // Asia/Beirut - { 690, 3778, 226073, 7, }, // Asia/Bishkek - { 690, 5989, 226080, 8, }, // Asia/Brunei - { 690, 4601, 226088, 6, }, // Asia/Chita + { 690, 3778, 226064, 7, }, // Asia/Bishkek + { 690, 5989, 226071, 8, }, // Asia/Brunei + { 690, 4601, 226079, 6, }, // Asia/Chita { 690, 4511, 89978, 6, }, // Asia/Colombo { 690, 4540, 89984, 7, }, // Asia/Damascus { 690, 1093, 89991, 4, }, // Asia/Dhaka { 690, 6192, 89995, 4, }, // Asia/Dili - { 690, 3596, 226094, 5, }, // Asia/Dubai - { 690, 6159, 226099, 7, }, // Asia/Dushanbe - { 690, 8636, 226106, 11, }, // Asia/Famagusta + { 690, 3596, 226085, 5, }, // Asia/Dubai + { 690, 6159, 226090, 7, }, // Asia/Dushanbe + { 690, 8636, 226097, 11, }, // Asia/Famagusta { 690, 8651, 90021, 5, }, // Asia/Gaza { 690, 4795, 90026, 7, }, // Asia/Hebron { 690, 1259, 90033, 16, }, // Asia/Ho_Chi_Minh @@ -51085,12 +51085,12 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 4184, 90063, 10, }, // Asia/Irkutsk { 690, 7006, 90073, 7, }, // Asia/Jakarta { 690, 6992, 31943, 7, }, // Asia/Jayapura - { 690, 1290, 226117, 8, }, // Asia/Jerusalem + { 690, 1290, 226108, 8, }, // Asia/Jerusalem { 690, 3560, 90086, 5, }, // Asia/Kabul { 690, 4316, 90091, 7, }, // Asia/Kamchatka { 690, 4239, 31972, 5, }, // Asia/Karachi { 690, 1185, 90098, 8, }, // Asia/Kathmandu - { 690, 8661, 226125, 7, }, // Asia/Khandyga + { 690, 8661, 226116, 7, }, // Asia/Khandyga { 690, 992, 90113, 7, }, // Asia/Kolkata { 690, 4197, 90120, 15, }, // Asia/Krasnoyarsk { 690, 4859, 90135, 10, }, // Asia/Kuala_Lumpur @@ -51106,22 +51106,22 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 4135, 90184, 13, }, // Asia/Novosibirsk { 690, 4229, 90197, 6, }, // Asia/Omsk { 690, 7145, 90203, 3, }, // Asia/Oral - { 690, 6961, 226132, 10, }, // Asia/Phnom_Penh + { 690, 6961, 226123, 10, }, // Asia/Phnom_Penh { 690, 8693, 90215, 9, }, // Asia/Pontianak { 690, 4214, 90224, 10, }, // Asia/Pyongyang { 690, 5559, 90234, 3, }, // Asia/Qatar { 690, 8708, 90237, 8, }, // Asia/Qostanay - { 690, 4269, 226142, 10, }, // Asia/Qyzylorda + { 690, 4269, 226133, 10, }, // Asia/Qyzylorda { 690, 3584, 90256, 5, }, // Asia/Riyadh - { 690, 4408, 226152, 7, }, // Asia/Sakhalin + { 690, 4408, 226143, 7, }, // Asia/Sakhalin { 690, 7245, 90267, 6, }, // Asia/Samarkand { 690, 3279, 90273, 4, }, // Asia/Seoul - { 690, 1053, 226159, 6, }, // Asia/Shanghai + { 690, 1053, 226150, 6, }, // Asia/Shanghai { 690, 3300, 32190, 8, }, // Asia/Singapore { 690, 4297, 90282, 16, }, // Asia/Srednekolymsk - { 690, 3263, 226165, 8, }, // Asia/Taipei - { 690, 4781, 226173, 6, }, // Asia/Tashkent - { 690, 3915, 226179, 9, }, // Asia/Tbilisi + { 690, 3263, 226156, 8, }, // Asia/Taipei + { 690, 4781, 226164, 6, }, // Asia/Tashkent + { 690, 3915, 226170, 9, }, // Asia/Tbilisi { 690, 2772, 32236, 6, }, // Asia/Tehran { 690, 1317, 90317, 5, }, // Asia/Thimphu { 690, 2821, 90322, 6, }, // Asia/Tokyo @@ -51132,19 +51132,19 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 6977, 90360, 9, }, // Asia/Vientiane { 690, 4710, 90369, 13, }, // Asia/Vladivostok { 690, 4828, 32305, 9, }, // Asia/Yakutsk - { 690, 1235, 226188, 6, }, // Asia/Yangon + { 690, 1235, 226179, 6, }, // Asia/Yangon { 690, 3883, 90382, 13, }, // Asia/Yekaterinburg { 690, 3747, 90395, 7, }, // Asia/Yerevan { 690, 3663, 90402, 7, }, // Atlantic/Azores { 690, 5671, 90409, 6, }, // Atlantic/Bermuda - { 690, 6628, 226194, 8, }, // Atlantic/Canary + { 690, 6628, 226185, 8, }, // Atlantic/Canary { 690, 3727, 90421, 8, }, // Atlantic/Cape_Verde - { 690, 1395, 226202, 6, }, // Atlantic/Faroe + { 690, 1395, 226193, 6, }, // Atlantic/Faroe { 690, 8736, 90434, 5, }, // Atlantic/Madeira { 690, 2748, 90439, 9, }, // Atlantic/Reykjavik - { 690, 7272, 226208, 18, }, // Atlantic/South_Georgia + { 690, 7272, 226199, 18, }, // Atlantic/South_Georgia { 690, 6821, 90463, 11, }, // Atlantic/St_Helena - { 690, 6644, 226226, 9, }, // Atlantic/Stanley + { 690, 6644, 226217, 9, }, // Atlantic/Stanley { 690, 1670, 90481, 6, }, // Australia/Adelaide { 690, 1635, 90487, 8, }, // Australia/Brisbane { 690, 1799, 90495, 10, }, // Australia/Broken_Hill @@ -51158,8 +51158,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 1463, 32494, 5, }, // Australia/Sydney { 690, 6441, 90549, 10, }, // Europe/Amsterdam { 690, 6216, 90559, 6, }, // Europe/Andorra - { 690, 3620, 226235, 10, }, // Europe/Astrakhan - { 690, 2300, 226245, 6, }, // Europe/Athens + { 690, 3620, 226226, 10, }, // Europe/Astrakhan + { 690, 2300, 226236, 6, }, // Europe/Athens { 690, 6336, 32532, 8, }, // Europe/Belgrade { 690, 4757, 90580, 6, }, // Europe/Berlin { 690, 6488, 90586, 12, }, // Europe/Bratislava @@ -51173,7 +51173,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 6307, 90657, 10, }, // Europe/Gibraltar { 690, 8788, 90667, 6, }, // Europe/Guernsey { 690, 6612, 90673, 8, }, // Europe/Helsinki - { 690, 8804, 226251, 13, }, // Europe/Isle_of_Man + { 690, 8804, 226242, 13, }, // Europe/Isle_of_Man { 690, 1130, 90692, 9, }, // Europe/Istanbul { 690, 8823, 90701, 5, }, // Europe/Jersey { 690, 3979, 90706, 12, }, // Europe/Kaliningrad @@ -51199,9 +51199,9 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 6470, 90814, 10, }, // Europe/San_Marino { 690, 6245, 90824, 8, }, // Europe/Sarajevo { 690, 4451, 90832, 7, }, // Europe/Saratov - { 690, 8849, 226264, 12, }, // Europe/Simferopol - { 690, 6383, 226276, 8, }, // Europe/Skopje - { 690, 6599, 226284, 7, }, // Europe/Sofia + { 690, 8849, 226255, 12, }, // Europe/Simferopol + { 690, 6383, 226267, 8, }, // Europe/Skopje + { 690, 6599, 226275, 7, }, // Europe/Sofia { 690, 6523, 90866, 8, }, // Europe/Stockholm { 690, 8867, 90874, 5, }, // Europe/Tallinn { 690, 6202, 90879, 6, }, // Europe/Tirane @@ -51213,7 +51213,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 4727, 90922, 11, }, // Europe/Volgograd { 690, 3190, 90933, 5, }, // Europe/Warsaw { 690, 6261, 90938, 8, }, // Europe/Zagreb - { 690, 6540, 226291, 9, }, // Europe/Zurich + { 690, 6540, 226282, 9, }, // Europe/Zurich { 690, 5078, 90955, 11, }, // Indian/Antananarivo { 690, 6947, 115401, 5, }, // Indian/Chagos { 690, 6046, 90971, 7, }, // Indian/Christmas @@ -51222,38 +51222,38 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 6661, 90989, 7, }, // Indian/Kerguelen { 690, 7260, 32983, 4, }, // Indian/Mahe { 690, 7050, 90996, 6, }, // Indian/Maldives - { 690, 4069, 226300, 6, }, // Indian/Mauritius + { 690, 4069, 226291, 6, }, // Indian/Mauritius { 690, 5098, 91008, 8, }, // Indian/Mayotte { 690, 7211, 91016, 8, }, // Indian/Reunion { 690, 4422, 91024, 5, }, // Pacific/Apia - { 690, 932, 226306, 6, }, // Pacific/Auckland + { 690, 932, 226297, 6, }, // Pacific/Auckland { 690, 3706, 91035, 8, }, // Pacific/Bougainville - { 690, 3015, 226312, 6, }, // Pacific/Chatham + { 690, 3015, 226303, 6, }, // Pacific/Chatham { 690, 3157, 91047, 2, }, // Pacific/Chuuk - { 690, 2237, 226318, 6, }, // Pacific/Easter - { 690, 7360, 226324, 5, }, // Pacific/Efate - { 690, 7327, 226329, 9, }, // Pacific/Fakaofo - { 690, 3902, 226338, 5, }, // Pacific/Fiji - { 690, 7343, 226343, 12, }, // Pacific/Funafuti + { 690, 2237, 226309, 6, }, // Pacific/Easter + { 690, 7360, 226315, 5, }, // Pacific/Efate + { 690, 7327, 226320, 9, }, // Pacific/Fakaofo + { 690, 3902, 226329, 5, }, // Pacific/Fiji + { 690, 7343, 226334, 12, }, // Pacific/Funafuti { 690, 6678, 91085, 9, }, // Pacific/Galapagos - { 690, 6696, 226355, 9, }, // Pacific/Gambier + { 690, 6696, 226346, 9, }, // Pacific/Gambier { 690, 3822, 91101, 10, }, // Pacific/Guadalcanal { 690, 6018, 31112, 4, }, // Pacific/Guam - { 690, 3049, 226364, 5, }, // Pacific/Kanton + { 690, 3049, 226355, 5, }, // Pacific/Kanton { 690, 3998, 33132, 10, }, // Pacific/Kiritimati { 690, 7019, 91126, 6, }, // Pacific/Kosrae { 690, 2842, 91132, 10, }, // Pacific/Kwajalein { 690, 4877, 91142, 6, }, // Pacific/Majuro { 690, 4051, 91148, 8, }, // Pacific/Marquesas { 690, 8914, 91156, 5, }, // Pacific/Midway - { 690, 7084, 226369, 6, }, // Pacific/Nauru + { 690, 7084, 226360, 6, }, // Pacific/Nauru { 690, 7132, 91165, 4, }, // Pacific/Niue - { 690, 4168, 226375, 7, }, // Pacific/Norfolk - { 690, 7098, 226382, 6, }, // Pacific/Noumea + { 690, 4168, 226366, 7, }, // Pacific/Norfolk + { 690, 7098, 226373, 6, }, // Pacific/Noumea { 690, 3126, 91182, 9, }, // Pacific/Pago_Pago { 690, 7155, 91191, 4, }, // Pacific/Palau { 690, 7194, 137202, 8, }, // Pacific/Pitcairn - { 690, 3096, 226388, 7, }, // Pacific/Pohnpei + { 690, 3096, 226379, 7, }, // Pacific/Pohnpei { 690, 4807, 91201, 14, }, // Pacific/Port_Moresby { 690, 6076, 91215, 9, }, // Pacific/Rarotonga { 690, 6031, 91224, 6, }, // Pacific/Saipan @@ -51263,7 +51263,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 690, 7392, 33268, 3, }, // Pacific/Wake { 690, 7405, 33271, 5, }, // Pacific/Wallis { 691, 6788, 148234, 7, }, // Africa/Abidjan Kuvi/Odia/India - { 691, 6760, 226395, 5, }, // Africa/Accra + { 691, 6760, 226386, 5, }, // Africa/Accra { 691, 5059, 148246, 12, }, // Africa/Addis_Ababa { 691, 7420, 148258, 8, }, // Africa/Algiers { 691, 14, 148266, 5, }, // Africa/Asmara @@ -51272,217 +51272,217 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 691, 6746, 148284, 7, }, // Africa/Banjul { 691, 7435, 148291, 5, }, // Africa/Bissau { 691, 4957, 148296, 13, }, // Africa/Blantyre - { 691, 5287, 226400, 12, }, // Africa/Brazzaville - { 691, 4922, 226412, 10, }, // Africa/Bujumbura + { 691, 5287, 226391, 12, }, // Africa/Brazzaville + { 691, 4922, 226403, 10, }, // Africa/Bujumbura { 691, 2320, 148331, 4, }, // Africa/Cairo { 691, 4117, 148336, 12, }, // Africa/Casablanca { 691, 7449, 148348, 5, }, // Africa/Ceuta - { 691, 6773, 226422, 7, }, // Africa/Conakry + { 691, 6773, 226413, 7, }, // Africa/Conakry { 691, 6840, 148361, 4, }, // Africa/Dakar { 691, 5130, 148365, 15, }, // Africa/Dar_es_Salaam - { 691, 5043, 226429, 5, }, // Africa/Djibouti + { 691, 5043, 226420, 5, }, // Africa/Djibouti { 691, 5243, 148386, 4, }, // Africa/Douala { 691, 5166, 148390, 9, }, // Africa/El_Aaiun - { 691, 6853, 226434, 10, }, // Africa/Freetown - { 691, 4906, 226444, 8, }, // Africa/Gaborone + { 691, 6853, 226425, 10, }, // Africa/Freetown + { 691, 4906, 226435, 8, }, // Africa/Gaborone { 691, 5015, 148418, 5, }, // Africa/Harare - { 691, 4479, 226452, 10, }, // Africa/Johannesburg + { 691, 4479, 226443, 10, }, // Africa/Johannesburg { 691, 4499, 148434, 4, }, // Africa/Juba { 691, 5151, 148438, 8, }, // Africa/Kampala - { 691, 4524, 226462, 7, }, // Africa/Khartoum + { 691, 4524, 226453, 7, }, // Africa/Khartoum { 691, 4973, 148453, 6, }, // Africa/Kigali { 691, 5306, 148459, 8, }, // Africa/Kinshasa - { 691, 4744, 226469, 6, }, // Africa/Lagos - { 691, 5336, 226475, 12, }, // Africa/Libreville - { 691, 6869, 226487, 4, }, // Africa/Lome + { 691, 4744, 226460, 6, }, // Africa/Lagos + { 691, 5336, 226466, 12, }, // Africa/Libreville + { 691, 6869, 226478, 4, }, // Africa/Lome { 691, 5211, 148491, 7, }, // Africa/Luanda { 691, 4939, 148498, 10, }, // Africa/Lubumbashi { 691, 5001, 148508, 6, }, // Africa/Lusaka { 691, 5322, 148514, 5, }, // Africa/Malabo { 691, 4987, 148520, 6, }, // Africa/Maputo { 691, 5197, 148526, 6, }, // Africa/Maseru - { 691, 5182, 226491, 9, }, // Africa/Mbabane - { 691, 5113, 226500, 8, }, // Africa/Mogadishu - { 691, 7034, 226508, 7, }, // Africa/Monrovia - { 691, 3853, 226515, 6, }, // Africa/Nairobi + { 691, 5182, 226482, 9, }, // Africa/Mbabane + { 691, 5113, 226491, 8, }, // Africa/Mogadishu + { 691, 7034, 226499, 7, }, // Africa/Monrovia + { 691, 3853, 226506, 6, }, // Africa/Nairobi { 691, 5271, 148561, 6, }, // Africa/Ndjamena { 691, 5354, 148567, 5, }, // Africa/Niamey - { 691, 6803, 226521, 6, }, // Africa/Nouakchott - { 691, 6727, 226527, 6, }, // Africa/Ouagadougou - { 691, 5225, 226533, 7, }, // Africa/Porto-Novo - { 691, 4435, 226540, 7, }, // Africa/Sao_Tome - { 691, 2866, 226547, 7, }, // Africa/Tripoli + { 691, 6803, 226512, 6, }, // Africa/Nouakchott + { 691, 6727, 226518, 6, }, // Africa/Ouagadougou + { 691, 5225, 226524, 7, }, // Africa/Porto-Novo + { 691, 4435, 226531, 7, }, // Africa/Sao_Tome + { 691, 2866, 226538, 7, }, // Africa/Tripoli { 691, 6554, 148614, 7, }, // Africa/Tunis - { 691, 4152, 226554, 8, }, // Africa/Windhoek + { 691, 4152, 226545, 8, }, // Africa/Windhoek { 691, 132, 148631, 5, }, // America/Adak { 691, 3346, 148636, 8, }, // America/Anchorage { 691, 5607, 148644, 8, }, // America/Anguilla { 691, 5624, 148652, 8, }, // America/Antigua { 691, 4554, 148660, 8, }, // America/Araguaina - { 691, 166, 226562, 13, }, // America/Argentina/Buenos_Aires - { 691, 91, 226575, 10, }, // America/Argentina/Catamarca - { 691, 270, 226585, 6, }, // America/Argentina/Cordoba - { 691, 441, 226591, 5, }, // America/Argentina/Jujuy - { 691, 7462, 226596, 9, }, // America/Argentina/La_Rioja - { 691, 565, 226605, 7, }, // America/Argentina/Mendoza - { 691, 7489, 226612, 12, }, // America/Argentina/Rio_Gallegos - { 691, 7520, 226624, 6, }, // America/Argentina/Salta - { 691, 7544, 226630, 11, }, // America/Argentina/San_Juan - { 691, 5580, 226641, 9, }, // America/Argentina/San_Luis - { 691, 7571, 226650, 6, }, // America/Argentina/Tucuman - { 691, 7597, 226656, 7, }, // America/Argentina/Ushuaia - { 691, 5640, 226663, 5, }, // America/Aruba + { 691, 166, 226553, 13, }, // America/Argentina/Buenos_Aires + { 691, 91, 226566, 10, }, // America/Argentina/Catamarca + { 691, 270, 226576, 6, }, // America/Argentina/Cordoba + { 691, 441, 226582, 5, }, // America/Argentina/Jujuy + { 691, 7462, 226587, 9, }, // America/Argentina/La_Rioja + { 691, 565, 226596, 7, }, // America/Argentina/Mendoza + { 691, 7489, 226603, 12, }, // America/Argentina/Rio_Gallegos + { 691, 7520, 226615, 6, }, // America/Argentina/Salta + { 691, 7544, 226621, 11, }, // America/Argentina/San_Juan + { 691, 5580, 226632, 9, }, // America/Argentina/San_Luis + { 691, 7571, 226641, 6, }, // America/Argentina/Tucuman + { 691, 7597, 226647, 7, }, // America/Argentina/Ushuaia + { 691, 5640, 226654, 5, }, // America/Aruba { 691, 4252, 148781, 9, }, // America/Asuncion { 691, 237, 148790, 9, }, // America/Atikokan { 691, 3679, 148799, 5, }, // America/Bahia { 691, 7623, 148804, 18, }, // America/Bahia_Banderas - { 691, 5654, 226668, 7, }, // America/Barbados + { 691, 5654, 226659, 7, }, // America/Barbados { 691, 7646, 148832, 5, }, // America/Belem { 691, 5407, 148837, 6, }, // America/Belize - { 691, 7660, 226675, 14, }, // America/Blanc-Sablon - { 691, 7681, 226689, 10, }, // America/Boa_Vista - { 691, 4361, 226699, 4, }, // America/Bogota - { 691, 7699, 226703, 4, }, // America/Boise + { 691, 7660, 226666, 14, }, // America/Blanc-Sablon + { 691, 7681, 226680, 10, }, // America/Boa_Vista + { 691, 4361, 226690, 4, }, // America/Bogota + { 691, 7699, 226694, 4, }, // America/Boise { 691, 7713, 148879, 13, }, // America/Cambridge_Bay - { 691, 7735, 226707, 14, }, // America/Campo_Grande + { 691, 7735, 226698, 14, }, // America/Campo_Grande { 691, 3868, 148907, 7, }, // America/Cancun { 691, 4694, 148914, 8, }, // America/Caracas { 691, 4345, 148922, 8, }, // America/Cayenne { 691, 5496, 148930, 9, }, // America/Cayman - { 691, 2260, 226721, 5, }, // America/Chicago + { 691, 2260, 226712, 5, }, // America/Chicago { 691, 7756, 148945, 8, }, // America/Chihuahua - { 691, 5422, 226726, 10, }, // America/Costa_Rica - { 691, 7796, 226736, 9, }, // America/Creston + { 691, 5422, 226717, 10, }, // America/Costa_Rica + { 691, 7796, 226727, 9, }, // America/Creston { 691, 3791, 148989, 5, }, // America/Cuiaba { 691, 5723, 148994, 5, }, // America/Curacao { 691, 7812, 149000, 13, }, // America/Danmarkshavn { 691, 7833, 149013, 5, }, // America/Dawson { 691, 7848, 149018, 12, }, // America/Dawson_Creek - { 691, 805, 226745, 7, }, // America/Denver - { 691, 3465, 226752, 8, }, // America/Detroit - { 691, 5739, 226760, 7, }, // America/Dominica - { 691, 893, 226767, 9, }, // America/Edmonton + { 691, 805, 226736, 7, }, // America/Denver + { 691, 3465, 226743, 8, }, // America/Detroit + { 691, 5739, 226751, 7, }, // America/Dominica + { 691, 893, 226758, 9, }, // America/Edmonton { 691, 7869, 149063, 7, }, // America/Eirunepe - { 691, 5441, 226776, 13, }, // America/El_Salvador - { 691, 7886, 226789, 11, }, // America/Fort_Nelson - { 691, 7906, 226800, 8, }, // America/Fortaleza + { 691, 5441, 226767, 13, }, // America/El_Salvador + { 691, 7886, 226780, 11, }, // America/Fort_Nelson + { 691, 7906, 226791, 8, }, // America/Fortaleza { 691, 7924, 149106, 9, }, // America/Glace_Bay { 691, 6881, 149115, 7, }, // America/Goose_Bay { 691, 4612, 149122, 14, }, // America/Grand_Turk { 691, 5770, 149136, 8, }, // America/Grenada - { 691, 5786, 226808, 9, }, // America/Guadeloupe - { 691, 3760, 226817, 9, }, // America/Guatemala + { 691, 5786, 226799, 9, }, // America/Guadeloupe + { 691, 3760, 226808, 9, }, // America/Guatemala { 691, 4841, 149163, 9, }, // America/Guayaquil { 691, 6932, 149172, 5, }, // America/Guyana { 691, 1939, 149177, 12, }, // America/Halifax - { 691, 2281, 226826, 5, }, // America/Havana - { 691, 7942, 226831, 8, }, // America/Hermosillo - { 691, 348, 226839, 13, }, // America/Indiana/Indianapolis + { 691, 2281, 226817, 5, }, // America/Havana + { 691, 7942, 226822, 8, }, // America/Hermosillo + { 691, 348, 226830, 13, }, // America/Indiana/Indianapolis { 691, 481, 149218, 17, }, // America/Indiana/Knox - { 691, 7961, 226852, 16, }, // America/Indiana/Marengo + { 691, 7961, 226843, 16, }, // America/Indiana/Marengo { 691, 7985, 149252, 22, }, // America/Indiana/Petersburg { 691, 8012, 149274, 19, }, // America/Indiana/Tell_City - { 691, 8038, 226868, 15, }, // America/Indiana/Vevay + { 691, 8038, 226859, 15, }, // America/Indiana/Vevay { 691, 8060, 149308, 21, }, // America/Indiana/Vincennes { 691, 8086, 149329, 18, }, // America/Indiana/Winamac - { 691, 8110, 226883, 7, }, // America/Inuvik + { 691, 8110, 226874, 7, }, // America/Inuvik { 691, 660, 149354, 10, }, // America/Iqaluit { 691, 2799, 149364, 7, }, // America/Jamaica { 691, 5380, 149371, 6, }, // America/Juneau - { 691, 521, 226890, 10, }, // America/Kentucky/Louisville - { 691, 8125, 226900, 20, }, // America/Kentucky/Monticello - { 691, 5704, 226920, 13, }, // America/Kralendijk + { 691, 521, 226881, 10, }, // America/Kentucky/Louisville + { 691, 8125, 226891, 20, }, // America/Kentucky/Monticello + { 691, 5704, 226911, 13, }, // America/Kralendijk { 691, 4376, 149420, 6, }, // America/La_Paz { 691, 7169, 149428, 4, }, // America/Lima { 691, 3239, 149432, 13, }, // America/Los_Angeles { 691, 5932, 149445, 23, }, // America/Lower_Princes - { 691, 8153, 226933, 5, }, // America/Maceio + { 691, 8153, 226924, 5, }, // America/Maceio { 691, 8168, 149473, 7, }, // America/Managua { 691, 1908, 149480, 8, }, // America/Manaus - { 691, 5897, 226938, 7, }, // America/Marigot + { 691, 5897, 226929, 7, }, // America/Marigot { 691, 5805, 149496, 12, }, // America/Martinique - { 691, 8184, 226945, 8, }, // America/Matamoros - { 691, 2917, 226953, 9, }, // America/Mazatlan + { 691, 8184, 226936, 8, }, // America/Matamoros + { 691, 2917, 226944, 9, }, // America/Mazatlan { 691, 8202, 149527, 8, }, // America/Menominee { 691, 8220, 149535, 6, }, // America/Merida { 691, 8235, 149541, 10, }, // America/Metlakatla { 691, 2949, 149551, 13, }, // America/Mexico_City - { 691, 4391, 226962, 9, }, // America/Miquelon - { 691, 8254, 226971, 7, }, // America/Moncton - { 691, 8270, 226978, 7, }, // America/Monterrey - { 691, 4098, 226985, 10, }, // America/Montevideo - { 691, 5824, 226995, 10, }, // America/Montserrat + { 691, 4391, 226953, 9, }, // America/Miquelon + { 691, 8254, 226962, 7, }, // America/Moncton + { 691, 8270, 226969, 7, }, // America/Monterrey + { 691, 4098, 226976, 10, }, // America/Montevideo + { 691, 5824, 226986, 10, }, // America/Montserrat { 691, 5481, 149611, 5, }, // America/Nassau - { 691, 2379, 227005, 10, }, // America/New_York + { 691, 2379, 226996, 10, }, // America/New_York { 691, 8288, 149627, 4, }, // America/Nome - { 691, 1850, 227015, 5, }, // America/Noronha - { 691, 8301, 227020, 19, }, // America/North_Dakota/Beulah - { 691, 8329, 227039, 20, }, // America/North_Dakota/Center - { 691, 8357, 227059, 24, }, // America/North_Dakota/New_Salem + { 691, 1850, 227006, 5, }, // America/Noronha + { 691, 8301, 227011, 19, }, // America/North_Dakota/Beulah + { 691, 8329, 227030, 20, }, // America/North_Dakota/Center + { 691, 8357, 227050, 24, }, // America/North_Dakota/New_Salem { 691, 393, 149705, 5, }, // America/Nuuk - { 691, 8388, 227083, 7, }, // America/Ojinaga + { 691, 8388, 227074, 7, }, // America/Ojinaga { 691, 2356, 149717, 6, }, // America/Panama { 691, 6173, 149723, 9, }, // America/Paramaribo - { 691, 2973, 227090, 7, }, // America/Phoenix - { 691, 3945, 227097, 17, }, // America/Port-au-Prince - { 691, 5954, 227114, 16, }, // America/Port_of_Spain + { 691, 2973, 227081, 7, }, // America/Phoenix + { 691, 3945, 227088, 17, }, // America/Port-au-Prince + { 691, 5954, 227105, 16, }, // America/Port_of_Spain { 691, 8404, 149776, 11, }, // America/Porto_Velho - { 691, 5843, 227130, 10, }, // America/Puerto_Rico + { 691, 5843, 227121, 10, }, // America/Puerto_Rico { 691, 4030, 149799, 15, }, // America/Punta_Arenas { 691, 8424, 149814, 14, }, // America/Rankin_Inlet - { 691, 8445, 227140, 6, }, // America/Recife + { 691, 8445, 227131, 6, }, // America/Recife { 691, 1995, 149834, 6, }, // America/Regina { 691, 8460, 149840, 8, }, // America/Resolute - { 691, 695, 227146, 11, }, // America/Rio_Branco - { 691, 8477, 227157, 9, }, // America/Santarem + { 691, 695, 227137, 11, }, // America/Rio_Branco + { 691, 8477, 227148, 9, }, // America/Santarem { 691, 2201, 149871, 8, }, // America/Santiago - { 691, 6111, 227166, 12, }, // America/Santo_Domingo + { 691, 6111, 227157, 12, }, // America/Santo_Domingo { 691, 1878, 149895, 9, }, // America/Sao_Paulo - { 691, 6899, 227178, 14, }, // America/Scoresbysund + { 691, 6899, 227169, 14, }, // America/Scoresbysund { 691, 8494, 149921, 5, }, // America/Sitka - { 691, 8508, 227192, 16, }, // America/St_Barthelemy + { 691, 8508, 227183, 16, }, // America/St_Barthelemy { 691, 2061, 149944, 12, }, // America/St_Johns - { 691, 5863, 227208, 13, }, // America/St_Kitts + { 691, 5863, 227199, 13, }, // America/St_Kitts { 691, 5880, 149969, 13, }, // America/St_Lucia - { 691, 855, 227221, 13, }, // America/St_Thomas - { 691, 5913, 227234, 17, }, // America/St_Vincent + { 691, 855, 227212, 13, }, // America/St_Thomas + { 691, 5913, 227225, 17, }, // America/St_Vincent { 691, 8530, 150013, 15, }, // America/Swift_Current { 691, 5461, 150028, 11, }, // America/Tegucigalpa - { 691, 5756, 227251, 4, }, // America/Thule + { 691, 5756, 227242, 4, }, // America/Thule { 691, 313, 150043, 7, }, // America/Tijuana - { 691, 608, 227255, 5, }, // America/Toronto - { 691, 5688, 227260, 5, }, // America/Tortola - { 691, 2093, 227265, 9, }, // America/Vancouver + { 691, 608, 227246, 5, }, // America/Toronto + { 691, 5688, 227251, 5, }, // America/Tortola + { 691, 2093, 227256, 9, }, // America/Vancouver { 691, 2144, 150074, 11, }, // America/Whitehorse { 691, 734, 150085, 8, }, // America/Winnipeg { 691, 8552, 150093, 8, }, // America/Yakutat - { 691, 6001, 227274, 4, }, // Antarctica/Casey - { 691, 6094, 227278, 6, }, // Antarctica/Davis - { 691, 6133, 227284, 19, }, // Antarctica/DumontDUrville - { 691, 8568, 227303, 7, }, // Antarctica/Macquarie - { 691, 7066, 227310, 5, }, // Antarctica/Mawson - { 691, 7113, 227315, 10, }, // Antarctica/McMurdo - { 691, 8589, 227325, 5, }, // Antarctica/Palmer - { 691, 7226, 227330, 6, }, // Antarctica/Rothera + { 691, 6001, 227265, 4, }, // Antarctica/Casey + { 691, 6094, 227269, 6, }, // Antarctica/Davis + { 691, 6133, 227275, 19, }, // Antarctica/DumontDUrville + { 691, 8568, 227294, 7, }, // Antarctica/Macquarie + { 691, 7066, 227301, 5, }, // Antarctica/Mawson + { 691, 7113, 227306, 10, }, // Antarctica/McMurdo + { 691, 8589, 227316, 5, }, // Antarctica/Palmer + { 691, 7226, 227321, 6, }, // Antarctica/Rothera { 691, 7295, 150167, 4, }, // Antarctica/Syowa - { 691, 8607, 227336, 4, }, // Antarctica/Troll - { 691, 7374, 227340, 7, }, // Antarctica/Vostok - { 691, 1429, 227347, 10, }, // Arctic/Longyearbyen + { 691, 8607, 227327, 4, }, // Antarctica/Troll + { 691, 7374, 227331, 7, }, // Antarctica/Vostok + { 691, 1429, 227338, 10, }, // Arctic/Longyearbyen { 691, 5570, 150199, 6, }, // Asia/Aden { 691, 5395, 150205, 6, }, // Asia/Almaty { 691, 3968, 150211, 6, }, // Asia/Amman { 691, 5511, 150217, 8, }, // Asia/Anadyr { 691, 5523, 150225, 5, }, // Asia/Aqtau - { 691, 5368, 227357, 6, }, // Asia/Aqtobe - { 691, 964, 227363, 9, }, // Asia/Ashgabat + { 691, 5368, 227348, 6, }, // Asia/Aqtobe + { 691, 964, 227354, 9, }, // Asia/Ashgabat { 691, 8624, 150248, 6, }, // Asia/Atyrau { 691, 3607, 150254, 8, }, // Asia/Baghdad - { 691, 5534, 227372, 6, }, // Asia/Bahrain + { 691, 5534, 227363, 6, }, // Asia/Bahrain { 691, 3653, 148992, 4, }, // Asia/Baku { 691, 4466, 150270, 11, }, // Asia/Bangkok { 691, 3571, 150281, 8, }, // Asia/Barnaul { 691, 4086, 150289, 7, }, // Asia/Beirut - { 691, 3778, 227378, 8, }, // Asia/Bishkek + { 691, 3778, 227369, 8, }, // Asia/Bishkek { 691, 5989, 150304, 7, }, // Asia/Brunei { 691, 4601, 150311, 4, }, // Asia/Chita { 691, 4511, 150315, 6, }, // Asia/Colombo @@ -51490,24 +51490,24 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 691, 1093, 150849, 4, }, // Asia/Dhaka { 691, 6192, 150334, 6, }, // Asia/Dili { 691, 3596, 150340, 5, }, // Asia/Dubai - { 691, 6159, 227386, 7, }, // Asia/Dushanbe - { 691, 8636, 227393, 10, }, // Asia/Famagusta + { 691, 6159, 227377, 7, }, // Asia/Dushanbe + { 691, 8636, 227384, 10, }, // Asia/Famagusta { 691, 8651, 150362, 4, }, // Asia/Gaza { 691, 4795, 150366, 8, }, // Asia/Hebron - { 691, 1259, 227403, 15, }, // Asia/Ho_Chi_Minh + { 691, 1259, 227394, 15, }, // Asia/Ho_Chi_Minh { 691, 2704, 150390, 5, }, // Asia/Hong_Kong - { 691, 4771, 227418, 6, }, // Asia/Hovd + { 691, 4771, 227409, 6, }, // Asia/Hovd { 691, 4184, 150401, 8, }, // Asia/Irkutsk - { 691, 7006, 227424, 7, }, // Asia/Jakarta + { 691, 7006, 227415, 7, }, // Asia/Jakarta { 691, 6992, 150418, 6, }, // Asia/Jayapura { 691, 1290, 150424, 8, }, // Asia/Jerusalem - { 691, 3560, 227431, 5, }, // Asia/Kabul + { 691, 3560, 227422, 5, }, // Asia/Kabul { 691, 4316, 150437, 8, }, // Asia/Kamchatka { 691, 4239, 150445, 5, }, // Asia/Karachi - { 691, 1185, 227436, 9, }, // Asia/Kathmandu - { 691, 8661, 227445, 9, }, // Asia/Khandyga + { 691, 1185, 227427, 9, }, // Asia/Kathmandu + { 691, 8661, 227436, 9, }, // Asia/Khandyga { 691, 992, 150468, 7, }, // Asia/Kolkata - { 691, 4197, 227454, 12, }, // Asia/Krasnoyarsk + { 691, 4197, 227445, 12, }, // Asia/Krasnoyarsk { 691, 4859, 150488, 12, }, // Asia/Kuala_Lumpur { 691, 5976, 150500, 5, }, // Asia/Kuching { 691, 5547, 150505, 4, }, // Asia/Kuwait @@ -51516,83 +51516,83 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 691, 1349, 150522, 9, }, // Asia/Makassar { 691, 7182, 150531, 6, }, // Asia/Manila { 691, 6920, 150537, 8, }, // Asia/Muscat - { 691, 2554, 227466, 6, }, // Asia/Nicosia - { 691, 8675, 227472, 11, }, // Asia/Novokuznetsk - { 691, 4135, 227483, 10, }, // Asia/Novosibirsk + { 691, 2554, 227457, 6, }, // Asia/Nicosia + { 691, 8675, 227463, 11, }, // Asia/Novokuznetsk + { 691, 4135, 227474, 10, }, // Asia/Novosibirsk { 691, 4229, 150577, 5, }, // Asia/Omsk - { 691, 7145, 227493, 6, }, // Asia/Oral - { 691, 6961, 227499, 10, }, // Asia/Phnom_Penh - { 691, 8693, 227509, 11, }, // Asia/Pontianak + { 691, 7145, 227484, 6, }, // Asia/Oral + { 691, 6961, 227490, 10, }, // Asia/Phnom_Penh + { 691, 8693, 227500, 11, }, // Asia/Pontianak { 691, 4214, 150611, 11, }, // Asia/Pyongyang { 691, 5559, 150622, 5, }, // Asia/Qatar - { 691, 8708, 227520, 6, }, // Asia/Qostanay - { 691, 4269, 227526, 9, }, // Asia/Qyzylorda + { 691, 8708, 227511, 6, }, // Asia/Qostanay + { 691, 4269, 227517, 9, }, // Asia/Qyzylorda { 691, 3584, 150644, 4, }, // Asia/Riyadh - { 691, 4408, 227535, 7, }, // Asia/Sakhalin + { 691, 4408, 227526, 7, }, // Asia/Sakhalin { 691, 7245, 150655, 7, }, // Asia/Samarkand - { 691, 3279, 227542, 4, }, // Asia/Seoul - { 691, 1053, 227546, 5, }, // Asia/Shanghai + { 691, 3279, 227533, 4, }, // Asia/Seoul + { 691, 1053, 227537, 5, }, // Asia/Shanghai { 691, 3300, 150672, 11, }, // Asia/Singapore - { 691, 4297, 227551, 14, }, // Asia/Srednekolymsk + { 691, 4297, 227542, 14, }, // Asia/Srednekolymsk { 691, 3263, 150698, 6, }, // Asia/Taipei - { 691, 4781, 227565, 8, }, // Asia/Tashkent + { 691, 4781, 227556, 8, }, // Asia/Tashkent { 691, 3915, 150712, 8, }, // Asia/Tbilisi { 691, 2772, 150720, 8, }, // Asia/Tehran - { 691, 1317, 227573, 6, }, // Asia/Thimphu - { 691, 2821, 227579, 4, }, // Asia/Tokyo - { 691, 4572, 227583, 5, }, // Asia/Tomsk + { 691, 1317, 227564, 6, }, // Asia/Thimphu + { 691, 2821, 227570, 4, }, // Asia/Tokyo + { 691, 4572, 227574, 5, }, // Asia/Tomsk { 691, 1021, 150745, 12, }, // Asia/Ulaanbaatar { 691, 1159, 150757, 6, }, // Asia/Urumqi - { 691, 8722, 227588, 11, }, // Asia/Ust-Nera - { 691, 6977, 227599, 11, }, // Asia/Vientiane - { 691, 4710, 227610, 13, }, // Asia/Vladivostok + { 691, 8722, 227579, 11, }, // Asia/Ust-Nera + { 691, 6977, 227590, 11, }, // Asia/Vientiane + { 691, 4710, 227601, 13, }, // Asia/Vladivostok { 691, 4828, 150798, 8, }, // Asia/Yakutsk { 691, 1235, 150806, 9, }, // Asia/Yangon { 691, 3883, 150815, 14, }, // Asia/Yekaterinburg - { 691, 3747, 227623, 8, }, // Asia/Yerevan - { 691, 3663, 227631, 6, }, // Atlantic/Azores - { 691, 5671, 227637, 6, }, // Atlantic/Bermuda + { 691, 3747, 227614, 8, }, // Asia/Yerevan + { 691, 3663, 227622, 6, }, // Atlantic/Azores + { 691, 5671, 227628, 6, }, // Atlantic/Bermuda { 691, 6628, 150851, 6, }, // Atlantic/Canary - { 691, 3727, 227643, 11, }, // Atlantic/Cape_Verde - { 691, 1395, 227654, 3, }, // Atlantic/Faroe + { 691, 3727, 227634, 11, }, // Atlantic/Cape_Verde + { 691, 1395, 227645, 3, }, // Atlantic/Faroe { 691, 8736, 150873, 7, }, // Atlantic/Madeira - { 691, 2748, 227657, 9, }, // Atlantic/Reykjavik + { 691, 2748, 227648, 9, }, // Atlantic/Reykjavik { 691, 7272, 150890, 13, }, // Atlantic/South_Georgia { 691, 6821, 150903, 14, }, // Atlantic/St_Helena - { 691, 6644, 227666, 8, }, // Atlantic/Stanley - { 691, 1670, 227674, 7, }, // Australia/Adelaide - { 691, 1635, 227681, 8, }, // Australia/Brisbane - { 691, 1799, 227689, 10, }, // Australia/Broken_Hill - { 691, 1583, 227699, 8, }, // Australia/Darwin + { 691, 6644, 227657, 8, }, // Atlantic/Stanley + { 691, 1670, 227665, 7, }, // Australia/Adelaide + { 691, 1635, 227672, 8, }, // Australia/Brisbane + { 691, 1799, 227680, 10, }, // Australia/Broken_Hill + { 691, 1583, 227690, 8, }, // Australia/Darwin { 691, 3637, 150965, 5, }, // Australia/Eucla { 691, 1516, 150970, 7, }, // Australia/Hobart - { 691, 8753, 227707, 9, }, // Australia/Lindeman - { 691, 1547, 227716, 10, }, // Australia/Lord_Howe - { 691, 1727, 227726, 7, }, // Australia/Melbourne - { 691, 1762, 227733, 4, }, // Australia/Perth + { 691, 8753, 227698, 9, }, // Australia/Lindeman + { 691, 1547, 227707, 10, }, // Australia/Lord_Howe + { 691, 1727, 227717, 7, }, // Australia/Melbourne + { 691, 1762, 227724, 4, }, // Australia/Perth { 691, 1463, 151017, 5, }, // Australia/Sydney - { 691, 6441, 227737, 12, }, // Europe/Amsterdam - { 691, 6216, 227749, 6, }, // Europe/Andorra - { 691, 3620, 227755, 10, }, // Europe/Astrakhan - { 691, 2300, 227765, 6, }, // Europe/Athens - { 691, 6336, 227771, 9, }, // Europe/Belgrade + { 691, 6441, 227728, 12, }, // Europe/Amsterdam + { 691, 6216, 227740, 6, }, // Europe/Andorra + { 691, 3620, 227746, 10, }, // Europe/Astrakhan + { 691, 2300, 227756, 6, }, // Europe/Athens + { 691, 6336, 227762, 9, }, // Europe/Belgrade { 691, 4757, 151065, 7, }, // Europe/Berlin - { 691, 6488, 227780, 11, }, // Europe/Bratislava - { 691, 2167, 227791, 10, }, // Europe/Brussels - { 691, 3928, 227801, 9, }, // Europe/Bucharest - { 691, 3806, 227810, 9, }, // Europe/Budapest + { 691, 6488, 227771, 11, }, // Europe/Bratislava + { 691, 2167, 227782, 10, }, // Europe/Brussels + { 691, 3928, 227792, 9, }, // Europe/Bucharest + { 691, 3806, 227801, 9, }, // Europe/Budapest { 691, 8772, 151111, 9, }, // Europe/Busingen - { 691, 2583, 227819, 7, }, // Europe/Chisinau - { 691, 6289, 227826, 10, }, // Europe/Copenhagen + { 691, 2583, 227810, 7, }, // Europe/Chisinau + { 691, 6289, 227817, 10, }, // Europe/Copenhagen { 691, 2338, 151137, 6, }, // Europe/Dublin { 691, 6307, 151143, 11, }, // Europe/Gibraltar { 691, 8788, 151154, 7, }, // Europe/Guernsey { 691, 6612, 151161, 8, }, // Europe/Helsinki - { 691, 8804, 227836, 15, }, // Europe/Isle_of_Man + { 691, 8804, 227827, 15, }, // Europe/Isle_of_Man { 691, 1130, 151182, 9, }, // Europe/Istanbul { 691, 8823, 151191, 5, }, // Europe/Jersey { 691, 3979, 151196, 13, }, // Europe/Kaliningrad - { 691, 8929, 227851, 4, }, // Europe/Kirov + { 691, 8929, 227842, 4, }, // Europe/Kirov { 691, 2527, 151214, 5, }, // Europe/Kyiv { 691, 3213, 151219, 7, }, // Europe/Lisbon { 691, 6506, 151226, 10, }, // Europe/Ljubljana @@ -51600,61 +51600,61 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 691, 6365, 151242, 9, }, // Europe/Luxembourg { 691, 4892, 151251, 8, }, // Europe/Madrid { 691, 6397, 151259, 5, }, // Europe/Malta - { 691, 6582, 227855, 9, }, // Europe/Mariehamn + { 691, 6582, 227846, 9, }, // Europe/Mariehamn { 691, 3693, 151274, 6, }, // Europe/Minsk - { 691, 6410, 227864, 4, }, // Europe/Monaco + { 691, 6410, 227855, 4, }, // Europe/Monaco { 691, 3537, 150537, 4, }, // Europe/Moscow - { 691, 6458, 227868, 4, }, // Europe/Oslo + { 691, 6458, 227859, 4, }, // Europe/Oslo { 691, 4284, 151295, 6, }, // Europe/Paris - { 691, 6424, 227872, 7, }, // Europe/Podgorica + { 691, 6424, 227863, 7, }, // Europe/Podgorica { 691, 6275, 151310, 6, }, // Europe/Prague { 691, 8837, 151316, 4, }, // Europe/Riga - { 691, 6324, 227879, 3, }, // Europe/Rome + { 691, 6324, 227870, 3, }, // Europe/Rome { 691, 4331, 151324, 6, }, // Europe/Samara { 691, 6470, 151330, 11, }, // Europe/San_Marino - { 691, 6245, 227882, 7, }, // Europe/Sarajevo - { 691, 4451, 227889, 7, }, // Europe/Saratov - { 691, 8849, 227896, 9, }, // Europe/Simferopol - { 691, 6383, 227905, 6, }, // Europe/Skopje - { 691, 6599, 227911, 5, }, // Europe/Sofia - { 691, 6523, 227916, 10, }, // Europe/Stockholm + { 691, 6245, 227873, 7, }, // Europe/Sarajevo + { 691, 4451, 227880, 7, }, // Europe/Saratov + { 691, 8849, 227887, 9, }, // Europe/Simferopol + { 691, 6383, 227896, 6, }, // Europe/Skopje + { 691, 6599, 227902, 5, }, // Europe/Sofia + { 691, 6523, 227907, 10, }, // Europe/Stockholm { 691, 8867, 151389, 7, }, // Europe/Tallinn - { 691, 6202, 227926, 7, }, // Europe/Tirane - { 691, 8882, 227933, 10, }, // Europe/Ulyanovsk - { 691, 6352, 227943, 5, }, // Europe/Vaduz - { 691, 6567, 227948, 8, }, // Europe/Vatican - { 691, 6231, 227956, 5, }, // Europe/Vienna - { 691, 8899, 227961, 8, }, // Europe/Vilnius - { 691, 4727, 227969, 9, }, // Europe/Volgograd + { 691, 6202, 227917, 7, }, // Europe/Tirane + { 691, 8882, 227924, 10, }, // Europe/Ulyanovsk + { 691, 6352, 227934, 5, }, // Europe/Vaduz + { 691, 6567, 227939, 8, }, // Europe/Vatican + { 691, 6231, 227947, 5, }, // Europe/Vienna + { 691, 8899, 227952, 8, }, // Europe/Vilnius + { 691, 4727, 227960, 9, }, // Europe/Volgograd { 691, 3190, 151450, 6, }, // Europe/Warsaw { 691, 6261, 151456, 8, }, // Europe/Zagreb { 691, 6540, 151464, 6, }, // Europe/Zurich { 691, 5078, 151470, 12, }, // Indian/Antananarivo { 691, 6947, 151483, 7, }, // Indian/Chagos - { 691, 6046, 227978, 12, }, // Indian/Christmas - { 691, 6063, 227990, 5, }, // Indian/Cocos - { 691, 5029, 227995, 3, }, // Indian/Comoro - { 691, 6661, 227998, 8, }, // Indian/Kerguelen + { 691, 6046, 227969, 12, }, // Indian/Christmas + { 691, 6063, 227981, 5, }, // Indian/Cocos + { 691, 5029, 227986, 3, }, // Indian/Comoro + { 691, 6661, 227989, 8, }, // Indian/Kerguelen { 691, 7260, 151522, 4, }, // Indian/Mahe { 691, 7050, 151526, 8, }, // Indian/Maldives - { 691, 4069, 228006, 6, }, // Indian/Mauritius - { 691, 5098, 228012, 5, }, // Indian/Mayotte + { 691, 4069, 227997, 6, }, // Indian/Mauritius + { 691, 5098, 228003, 5, }, // Indian/Mayotte { 691, 7211, 151547, 10, }, // Indian/Reunion { 691, 4422, 151557, 4, }, // Pacific/Apia { 691, 932, 151561, 7, }, // Pacific/Auckland - { 691, 3706, 228017, 12, }, // Pacific/Bougainville - { 691, 3015, 228029, 7, }, // Pacific/Chatham + { 691, 3706, 228008, 12, }, // Pacific/Bougainville + { 691, 3015, 228020, 7, }, // Pacific/Chatham { 691, 3157, 151588, 5, }, // Pacific/Chuuk { 691, 2237, 151593, 7, }, // Pacific/Easter { 691, 7360, 151600, 6, }, // Pacific/Efate - { 691, 7327, 228036, 5, }, // Pacific/Fakaofo - { 691, 3902, 228041, 4, }, // Pacific/Fiji + { 691, 7327, 228027, 5, }, // Pacific/Fakaofo + { 691, 3902, 228032, 4, }, // Pacific/Fiji { 691, 7343, 151617, 8, }, // Pacific/Funafuti - { 691, 6678, 228045, 8, }, // Pacific/Galapagos + { 691, 6678, 228036, 8, }, // Pacific/Galapagos { 691, 6696, 151634, 10, }, // Pacific/Gambier { 691, 3822, 151644, 11, }, // Pacific/Guadalcanal { 691, 6018, 149477, 4, }, // Pacific/Guam - { 691, 3049, 228053, 6, }, // Pacific/Kanton + { 691, 3049, 228044, 6, }, // Pacific/Kanton { 691, 3998, 151673, 10, }, // Pacific/Kiritimati { 691, 7019, 151683, 6, }, // Pacific/Kosrae { 691, 2842, 151689, 11, }, // Pacific/Kwajalein @@ -51663,18 +51663,18 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 691, 8914, 151719, 7, }, // Pacific/Midway { 691, 7084, 151726, 5, }, // Pacific/Nauru { 691, 7132, 151731, 4, }, // Pacific/Niue - { 691, 4168, 228059, 6, }, // Pacific/Norfolk - { 691, 7098, 228065, 5, }, // Pacific/Noumea + { 691, 4168, 228050, 6, }, // Pacific/Norfolk + { 691, 7098, 228056, 5, }, // Pacific/Noumea { 691, 3126, 151747, 9, }, // Pacific/Pago_Pago { 691, 7155, 151756, 5, }, // Pacific/Palau { 691, 7194, 151761, 10, }, // Pacific/Pitcairn - { 691, 3096, 228070, 6, }, // Pacific/Pohnpei - { 691, 4807, 228076, 13, }, // Pacific/Port_Moresby - { 691, 6076, 228089, 8, }, // Pacific/Rarotonga + { 691, 3096, 228061, 6, }, // Pacific/Pohnpei + { 691, 4807, 228067, 13, }, // Pacific/Port_Moresby + { 691, 6076, 228080, 8, }, // Pacific/Rarotonga { 691, 6031, 151803, 7, }, // Pacific/Saipan { 691, 7312, 151810, 6, }, // Pacific/Tahiti { 691, 6712, 151816, 5, }, // Pacific/Tarawa - { 691, 4583, 228097, 9, }, // Pacific/Tongatapu + { 691, 4583, 228088, 9, }, // Pacific/Tongatapu { 691, 7392, 151831, 4, }, // Pacific/Wake { 691, 7405, 151835, 7, }, // Pacific/Wallis { 692, 6788, 186476, 9, }, // Africa/Abidjan Kuvi/Telugu/India @@ -51731,7 +51731,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 692, 4152, 186868, 9, }, // Africa/Windhoek { 692, 132, 186877, 5, }, // America/Adak { 692, 3346, 186882, 8, }, // America/Anchorage - { 692, 5607, 228106, 10, }, // America/Anguilla + { 692, 5607, 228097, 10, }, // America/Anguilla { 692, 5624, 186900, 8, }, // America/Antigua { 692, 4554, 186908, 11, }, // America/Araguaina { 692, 166, 186919, 16, }, // America/Argentina/Buenos_Aires @@ -51975,7 +51975,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 692, 7272, 189115, 15, }, // Atlantic/South_Georgia { 692, 6821, 189130, 14, }, // Atlantic/St_Helena { 692, 6644, 189144, 8, }, // Atlantic/Stanley - { 692, 1670, 228116, 36, }, // Australia/Adelaide + { 692, 1670, 228107, 36, }, // Australia/Adelaide { 692, 1635, 189159, 13, }, // Australia/Brisbane { 692, 1799, 189172, 13, }, // Australia/Broken_Hill { 692, 1583, 189185, 8, }, // Australia/Darwin @@ -52069,7 +52069,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 692, 6696, 189891, 9, }, // Pacific/Gambier { 692, 3822, 189900, 13, }, // Pacific/Guadalcanal { 692, 6018, 189913, 6, }, // Pacific/Guam - { 692, 3049, 228152, 6, }, // Pacific/Kanton + { 692, 3049, 228143, 6, }, // Pacific/Kanton { 692, 3998, 189936, 10, }, // Pacific/Kiritimati { 692, 7019, 189946, 6, }, // Pacific/Kosrae { 692, 2842, 189952, 10, }, // Pacific/Kwajalein @@ -52137,12 +52137,12 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 695, 14, 0, 6, }, // Africa/Asmara Swampy Cree/Canadian Aboriginal/Canada { 695, 4435, 6, 8, }, // Africa/Sao_Tome { 695, 4252, 14, 8, }, // America/Asuncion - { 695, 237, 228158, 6, }, // America/Atikokan + { 695, 237, 228149, 6, }, // America/Atikokan { 695, 7623, 30, 17, }, // America/Bahia_Banderas { 695, 3868, 47, 6, }, // America/Cancun { 695, 7774, 53, 13, }, // America/Ciudad_Juarez { 695, 5723, 66, 7, }, // America/Curacao - { 695, 893, 228164, 6, }, // America/Edmonton + { 695, 893, 228155, 6, }, // America/Edmonton { 695, 481, 73, 13, }, // America/Indiana/Knox { 695, 7961, 86, 16, }, // America/Indiana/Marengo { 695, 7985, 102, 19, }, // America/Indiana/Petersburg @@ -52150,8 +52150,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 695, 8038, 139, 14, }, // America/Indiana/Vevay { 695, 8060, 153, 18, }, // America/Indiana/Vincennes { 695, 8086, 171, 16, }, // America/Indiana/Winamac - { 695, 8110, 228170, 4, }, // America/Inuvik - { 695, 660, 228174, 6, }, // America/Iqaluit + { 695, 8110, 228161, 4, }, // America/Inuvik + { 695, 660, 228165, 6, }, // America/Iqaluit { 695, 8125, 187, 20, }, // America/Kentucky/Monticello { 695, 5932, 207, 22, }, // America/Lower_Princes { 695, 8220, 229, 6, }, // America/Merida @@ -52167,8 +52167,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { { 695, 5880, 370, 9, }, // America/St_Lucia { 695, 855, 379, 10, }, // America/St_Thomas { 695, 5913, 389, 11, }, // America/St_Vincent - { 695, 8530, 228180, 7, }, // America/Swift_Current - { 695, 734, 228187, 4, }, // America/Winnipeg + { 695, 8530, 228171, 7, }, // America/Swift_Current + { 695, 734, 228178, 4, }, // America/Winnipeg { 695, 6133, 400, 16, }, // Antarctica/DumontDUrville { 695, 1259, 432, 11, }, // Asia/Ho_Chi_Minh { 695, 1185, 448, 9, }, // Asia/Kathmandu @@ -102034,603 +102034,603 @@ static inline constexpr char16_t exemplarCityTable[] = { 0x62, 0x69, 0x69, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x254, 0x14b, 0x67, 0x61, 0x53, 0x61, 0x269, 0x70, 0x61, 0x6e, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x61, 0x54, 0x254, 0x14b, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x75, 0x57, -0x65, 0x65, 0x6b, 0x905, 0x932, 0x20, 0x906, 0x907, 0x92f, 0x942, 0x928, 0x3c, -0x92e, 0x91c, 0x93c, 0x93e, 0x91f, 0x932, 0x93e, 0x928, 0x921, 0x92c, 0x908, 0x915, -0x93e, 0x92c, 0x932, 0x926, 0x916, 0x923, 0x940, 0x20, 0x91c, 0x949, 0x930, 0x94d, -0x91c, 0x93f, 0x92f, 0x93e, 0x90f, 0x92e, 0x94d, 0x938, 0x94d, 0x91f, 0x930, 0x921, -0x92e, 0x92a, 0x948, 0x930, 0x938, 0x915, 0x94d, 0x930, 0x93f, 0x938, 0x92e, 0x93f, -0x938, 0x915, 0x948, 0x902, 0x91f, 0x928, 0x92a, 0x93e, 0x917, 0x94b, 0x20, 0x917, -0x902, 0x917, 0x94b, 0x41, 0x6c, 0x6a, 0x65, 0x72, 0x69, 0x41, 0x7a, 0x6d, -0x61, 0x72, 0x61, 0x42, 0x61, 0x6e, 0x67, 0x68, 0xec, 0x42, 0x69, 0x73, -0xe0, 0x6f, 0x42, 0x75, 0x6a, 0x75, 0x6e, 0x62, 0x75, 0x72, 0x61, 0x43, -0x61, 0x7a, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x4b, 0x61, 0x6e, -0x70, 0x61, 0x6c, 0x61, 0x4c, 0x75, 0x62, 0x75, 0x6e, 0x62, 0x61, 0x73, -0x68, 0x69, 0x4d, 0x61, 0x7a, 0x65, 0x72, 0x75, 0x4e, 0x62, 0x61, 0x62, -0x61, 0x6e, 0x65, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x6f, 0x55, -0x61, 0x67, 0x61, 0x64, 0x75, 0x67, 0xf9, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, -0x20, 0x53, 0x2e, 0x20, 0x54, 0x6f, 0x6d, 0x61, 0x7a, 0x6f, 0x54, 0xf9, -0x6e, 0x65, 0x7a, 0x69, 0x43, 0xf2, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x52, -0x69, 0x6f, 0x20, 0x47, 0xe0, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x42, 0x61, -0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, -0x61, 0x73, 0x43, 0x61, 0x6e, 0x70, 0x6f, 0x20, 0x47, 0x72, 0x61, 0x6e, -0x64, 0x65, 0x43, 0x75, 0x69, 0x61, 0x62, 0xe0, 0x44, 0xe8, 0x6e, 0x76, -0x65, 0x72, 0x44, 0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67, 0x61, 0x49, 0x6e, -0x64, 0x69, 0x61, 0x6e, 0xe0, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x4b, 0x6e, -0x6f, 0x78, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, -0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x28, 0x49, 0x6e, 0x64, -0x69, 0x61, 0x6e, 0x61, 0x29, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, -0x75, 0x72, 0x67, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, -0x29, 0x54, 0x65, 0x6c, 0x6c, 0x20, 0x43, 0x69, 0x74, 0x79, 0x20, 0x28, -0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x56, 0x65, 0x76, 0x61, +0x65, 0x65, 0x6b, 0x92e, 0x91c, 0x93c, 0x93e, 0x91f, 0x932, 0x93e, 0x928, 0x921, +0x92c, 0x908, 0x915, 0x93e, 0x92c, 0x932, 0x926, 0x916, 0x923, 0x940, 0x20, 0x91c, +0x949, 0x930, 0x94d, 0x91c, 0x93f, 0x92f, 0x93e, 0x90f, 0x92e, 0x94d, 0x938, 0x94d, +0x91f, 0x930, 0x921, 0x92e, 0x92a, 0x948, 0x930, 0x938, 0x915, 0x94d, 0x930, 0x93f, +0x938, 0x92e, 0x93f, 0x938, 0x915, 0x948, 0x902, 0x91f, 0x928, 0x92a, 0x93e, 0x917, +0x94b, 0x20, 0x917, 0x902, 0x917, 0x94b, 0x41, 0x6c, 0x6a, 0x65, 0x72, 0x69, +0x41, 0x7a, 0x6d, 0x61, 0x72, 0x61, 0x42, 0x61, 0x6e, 0x67, 0x68, 0xec, +0x42, 0x69, 0x73, 0xe0, 0x6f, 0x42, 0x75, 0x6a, 0x75, 0x6e, 0x62, 0x75, +0x72, 0x61, 0x43, 0x61, 0x7a, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, +0x4b, 0x61, 0x6e, 0x70, 0x61, 0x6c, 0x61, 0x4c, 0x75, 0x62, 0x75, 0x6e, +0x62, 0x61, 0x73, 0x68, 0x69, 0x4d, 0x61, 0x7a, 0x65, 0x72, 0x75, 0x4e, +0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, +0x73, 0x6f, 0x55, 0x61, 0x67, 0x61, 0x64, 0x75, 0x67, 0xf9, 0xcc, 0x7a, +0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20, 0x54, 0x6f, 0x6d, 0x61, 0x7a, +0x6f, 0x54, 0xf9, 0x6e, 0x65, 0x7a, 0x69, 0x43, 0xf2, 0x72, 0x64, 0x6f, +0x62, 0x61, 0x52, 0x69, 0x6f, 0x20, 0x47, 0xe0, 0x6c, 0x65, 0x67, 0x6f, +0x73, 0x42, 0x61, 0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6e, +0x64, 0x65, 0x72, 0x61, 0x73, 0x43, 0x61, 0x6e, 0x70, 0x6f, 0x20, 0x47, +0x72, 0x61, 0x6e, 0x64, 0x65, 0x43, 0x75, 0x69, 0x61, 0x62, 0xe0, 0x44, +0xe8, 0x6e, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67, +0x61, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0xe0, 0x70, 0x6f, 0x6c, 0x69, +0x73, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, +0x6e, 0x61, 0x29, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x28, +0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x50, 0x65, 0x74, 0x65, +0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, +0x61, 0x6e, 0x61, 0x29, 0x54, 0x65, 0x6c, 0x6c, 0x20, 0x43, 0x69, 0x74, 0x79, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x56, -0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x28, 0x49, 0x6e, -0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, -0x63, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x4a, -0x61, 0x6d, 0xe0, 0x65, 0x67, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, -0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x28, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, -0x6b, 0x79, 0x29, 0x4c, 0x6f, 0x73, 0x20, 0xc0, 0x6e, 0x67, 0x65, 0x6c, -0x65, 0x73, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x67, 0x61, 0x53, -0x69, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, 0x4d, 0xe8, 0x73, -0x65, 0x67, 0x6f, 0x4d, 0x69, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x6e, 0x42, -0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, -0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x43, 0x65, 0x6e, 0x74, 0x65, -0x72, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f, -0x74, 0x61, 0x29, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x61, 0x6c, 0x65, 0x6d, -0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f, 0x74, -0x61, 0x29, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x50, 0x72, 0xec, 0x6e, -0x73, 0x69, 0x70, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x64, 0x65, -0x20, 0x53, 0x70, 0x61, 0x67, 0x6e, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x50, -0x6f, 0x6c, 0x6f, 0x53, 0x2e, 0x20, 0x42, 0x61, 0x72, 0x74, 0x6f, 0x6c, -0x6f, 0x6d, 0xe8, 0x6f, 0x53, 0x2e, 0x20, 0x4a, 0x6f, 0x61, 0x6e, 0x69, -0x53, 0x2e, 0x20, 0x43, 0x72, 0x69, 0x73, 0x74, 0x6f, 0x66, 0x65, 0x72, -0x53, 0x2e, 0x20, 0x4c, 0x75, 0x73, 0xec, 0x61, 0x53, 0x2e, 0x20, 0x56, -0x69, 0x6e, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, -0x20, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x41, 0x6e, -0xe0, 0x64, 0x79, 0x72, 0x41, 0x6b, 0x74, 0xe0, 0x75, 0x41, 0x7a, 0x67, -0x61, 0x62, 0x61, 0x64, 0x41, 0x74, 0x79, 0x72, 0xe0, 0x75, 0x43, 0x6f, -0x6c, 0x6f, 0x6e, 0x62, 0x6f, 0x44, 0x75, 0x62, 0xe0, 0x69, 0x44, 0x75, -0x73, 0x61, 0x6e, 0x62, 0xe9, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, -0xf9, 0x48, 0xe0, 0x6e, 0x64, 0x69, 0x67, 0x61, 0x4b, 0x72, 0x61, 0x7a, -0x6e, 0x61, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x4b, 0x75, 0x61, 0x6c, 0x61, -0x20, 0x4c, 0x75, 0x6e, 0x70, 0x75, 0x72, 0x4d, 0x61, 0x63, 0xe0, 0x6f, -0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x69, 0x65, 0x74, 0x73, -0x6b, 0x4b, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0xe0, 0x69, 0x53, 0x68, 0x61, -0x6e, 0x67, 0x68, 0xe0, 0x69, 0x5a, 0x72, 0xe9, 0x64, 0x6e, 0x65, 0x6b, -0x6f, 0x6c, 0x69, 0x6d, 0x73, 0x6b, 0x54, 0x69, 0x6e, 0x70, 0x75, 0x55, -0x6c, 0x61, 0x6e, 0x20, 0x42, 0xe0, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x74, -0x2d, 0x47, 0x6e, 0x65, 0x72, 0x61, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, -0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4a, 0xe8, 0x72, 0x65, -0x76, 0x61, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x7a, 0x6f, -0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x61, 0x6e, 0x61, -0x72, 0x69, 0x65, 0x43, 0x61, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x6f, -0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x46, 0xe0, 0x72, 0x6f, 0x65, 0xcc, -0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x64, 0xe8, 0x69, 0x72, 0x61, -0x52, 0x65, 0x6b, 0x69, 0x61, 0x76, 0x69, 0x6b, 0x47, 0x65, 0x6f, 0x72, -0x67, 0x69, 0x61, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, 0x73, 0x75, 0x64, -0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20, 0x45, 0x6c, 0x65, -0x6e, 0x61, 0x41, 0x64, 0x65, 0x6c, 0xe0, 0x69, 0x64, 0x65, 0x42, 0x72, -0x69, 0x7a, 0x62, 0x61, 0x6e, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, -0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 0xc0, 0x6d, 0x73, -0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x74, 0x69, 0x7a, -0x6c, 0x61, 0x76, 0x61, 0x4a, 0x69, 0x62, 0x69, 0x6c, 0x74, 0x65, 0x72, -0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x61, -0x6e, 0x4c, 0x75, 0x62, 0x6c, 0x69, 0x61, 0x6e, 0x61, 0x4c, 0x75, 0x73, -0x65, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4f, 0x7a, 0x6c, 0x6f, 0x50, -0x61, 0x72, 0x69, 0x6a, 0x69, 0x53, 0x69, 0x6e, 0x66, 0x65, 0x72, 0xf2, -0x70, 0x6f, 0x6c, 0x69, 0x53, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x6d, 0x61, -0x55, 0x6c, 0x69, 0xe0, 0x6e, 0x6f, 0x73, 0x6b, 0x56, 0x61, 0x74, 0x65, -0x67, 0x61, 0x6e, 0x43, 0x69, 0x61, 0x67, 0x6f, 0x73, 0xcc, 0x7a, 0x6f, -0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x61, 0x64, 0x61, 0x6c, 0x65, -0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0xcc, -0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65, 0xcc, -0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, -0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x73, -0x69, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x69, 0x6f, -0x74, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52, 0x65, 0x75, 0x6e, -0x69, 0x6f, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x42, 0x6f, 0x75, -0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0xcc, 0x7a, 0x6f, -0x6c, 0x65, 0x20, 0x43, 0x69, 0x61, 0x74, 0x65, 0x6d, 0xcc, 0x7a, 0x6f, -0x6c, 0x65, 0x20, 0x43, 0x68, 0x75, 0x75, 0x6b, 0xcc, 0x7a, 0x6f, 0x6c, -0x61, 0x20, 0x64, 0x65, 0x20, 0x50, 0x61, 0x73, 0x63, 0x75, 0x61, 0xcc, -0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x45, 0x66, 0x61, 0x74, 0x65, 0x41, 0x74, -0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x41, -0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, -0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x47, 0x61, 0x6d, 0x62, 0x69, -0x65, 0x72, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x47, 0x75, 0x61, 0x64, -0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x41, 0x74, 0x6f, 0x6c, 0x6f, -0x20, 0x43, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x41, 0x74, 0x6f, 0x6c, 0x6f, -0x20, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0xcc, -0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4b, 0x6f, 0x73, 0x72, 0x61, 0x65, 0x41, -0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65, -0x69, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x72, 0x63, -0x68, 0x65, 0x7a, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4d, 0x69, -0x64, 0x77, 0x61, 0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x61, -0x75, 0x72, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x69, 0x75, -0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x6f, 0x72, 0x66, 0x6f, -0x6c, 0x6b, 0x50, 0x61, 0x6c, 0xe0, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, -0x20, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0xcc, 0x7a, 0x6f, -0x6c, 0x61, 0x20, 0x50, 0x6f, 0x6e, 0x70, 0xe8, 0x69, 0x50, 0x6f, 0x72, -0x74, 0x6f, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0xcc, 0x7a, -0x6f, 0x6c, 0x61, 0x20, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, -0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x61, 0x69, 0x70, 0xe0, -0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x74, 0x69, -0x41, 0x74, 0x6f, 0x6c, 0x6c, 0x6f, 0x20, 0x54, 0x61, 0x72, 0x61, 0x77, -0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x6f, 0x6e, 0x67, 0x61, -0x74, 0x61, 0x70, 0x75, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x57, 0x61, -0x6b, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x57, 0x61, 0x6c, 0x6c, -0x69, 0x73, 0x61, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x65, 0x63, 0x72, -0x61, 0x61, 0x1e0d, 0x69, 0x73, 0x20, 0x61, 0x62, 0x61, 0x62, 0x61, 0x61, -0x6c, 0x6a, 0x12b, 0x79, 0x72, 0x73, 0x61, 0x73, 0x6d, 0x61, 0x72, 0x61, -0x62, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x62, 0x61, 0x6e, 0x67, 0x75, 0x69, -0x62, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x62, 0x69, 0x73, 0x73, 0x61, 0x75, -0x62, 0x6c, 0x61, 0x6e, 0x1e6d, 0x61, 0x65, 0x72, 0x62, 0x72, 0x61, 0x6a, -0x61, 0x76, 0x69, 0x6c, 0x6c, 0x62, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, -0x72, 0x61, 0x6b, 0x61, 0x69, 0x72, 0x6f, 0x6b, 0x61, 0x73, 0x61, 0x62, -0x6c, 0x61, 0x6e, 0x6b, 0x61, 0x73, 0x65, 0x75, 0x1e6d, 0x61, 0x6b, 0x6f, -0x6e, 0x61, 0x6b, 0x72, 0x12b, 0x1e0d, 0x6b, 0x61, 0x72, 0x64, 0x61, 0x72, -0x20, 0x65, 0x73, 0x20, 0x73, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x64, 0x75, -0x61, 0x6c, 0x61, 0x65, 0x6c, 0x20, 0x61, 0x61, 0x69, 0x79, 0x75, 0x6e, -0x70, 0x72, 0x12b, 0x1e6d, 0x61, 0x75, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x72, -0x6f, 0x6e, 0x68, 0x72, 0x61, 0x72, 0x65, 0x6a, 0x6f, 0x68, 0x61, 0x6e, -0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x6a, 0x75, 0x62, 0x61, 0x6b, -0x6d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x72, 0x1e6d, 0x6f, 0x75, 0x6d, -0x6b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x6b, 0x69, 0x6e, 0x73, 0x61, 0x73, -0x61, 0x6c, 0x61, 0x67, 0x6f, 0x73, 0x6c, 0x69, 0x62, 0x72, 0x65, 0x76, -0x69, 0x6c, 0x6c, 0x6c, 0x75, 0x61, 0x6e, 0x1e0d, 0x61, 0x6c, 0x75, 0x62, -0x75, 0x6d, 0x62, 0x61, 0x73, 0x69, 0x6c, 0x75, 0x73, 0x61, 0x6b, 0x61, -0x6d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x6d, 0x61, 0x70, 0x75, 0x1e6d, 0x75, -0x6d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x62, 0x61, 0x62, 0x61, 0x6e, -0x65, 0x6d, 0x6f, 0x67, 0x61, 0x1e0d, 0x69, 0x73, 0x75, 0x6d, 0x6f, 0x6e, -0x72, 0x6f, 0x76, 0x69, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, -0x6e, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x6d, -0x65, 0x6e, 0x75, 0x65, 0x6b, 0x73, 0x61, 0x76, 0x61, 0x67, 0x64, 0x75, -0x67, 0x75, 0x70, 0x6f, 0x72, 0x1e6d, 0x6f, 0x2d, 0x1e47, 0x6f, 0x76, 0x6f, -0x73, 0x61, 0x6f, 0x20, 0x1e6d, 0x6f, 0x6d, 0x74, 0x72, 0x69, 0x70, 0x6f, -0x6c, 0x69, 0x1e6d, 0x75, 0x6e, 0x69, 0x73, 0x76, 0x69, 0x6e, 0x64, 0x68, -0x75, 0x6b, 0x61, 0x1e0d, 0x61, 0x6b, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x61, -0x6a, 0x65, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x65, 0x6e, 0x1e6d, -0x69, 0x67, 0x75, 0x61, 0x61, 0x72, 0x61, 0x67, 0x76, 0x61, 0x69, 0x6e, -0x61, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x61, 0x69, 0x72, -0x65, 0x73, 0x6b, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6b, -0x6f, 0x72, 0x1e0d, 0x61, 0x62, 0x61, 0x68, 0x75, 0x68, 0x75, 0x65, 0x6c, -0x61, 0x20, 0x72, 0x69, 0x6f, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x1e0d, 0x6f, -0x6a, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x20, 0x67, 0x61, 0x6c, 0x6c, 0x65, -0x67, 0x6f, 0x73, 0x73, 0x61, 0x6c, 0x1e6d, 0x61, 0x73, 0x61, 0x6e, 0x20, -0x68, 0x75, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x20, 0x6c, 0x75, 0x69, 0x73, -0x1e6d, 0x75, 0x6b, 0x16b, 0x6d, 0x6e, 0x75, 0x73, 0x76, 0x61, 0x69, 0x79, -0x61, 0x61, 0x72, 0x75, 0x62, 0x61, 0x65, 0x73, 0x75, 0x6e, 0x73, 0x69, -0x6f, 0x6e, 0x65, 0x1e6d, 0x69, 0x6b, 0x6f, 0x6b, 0x65, 0x6e, 0x62, 0x61, -0x68, 0x69, 0x61, 0x62, 0x61, 0x69, 0x61, 0x20, 0x62, 0x61, 0x6e, 0x1e0d, -0x65, 0x72, 0x61, 0x73, 0x62, 0x61, 0x72, 0x62, 0x61, 0x1e0d, 0x6f, 0x73, -0x62, 0x65, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x69, 0x6a, 0x62, 0x6c, -0x61, 0x6e, 0x6b, 0x2d, 0x73, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x62, 0x6f, -0x61, 0x20, 0x76, 0x69, 0x73, 0x74, 0x61, 0x62, 0x6f, 0x67, 0x6f, 0x1e6d, -0x61, 0x62, 0x6f, 0x69, 0x73, 0x12b, 0x6b, 0x65, 0x6d, 0x62, 0x72, 0x69, -0x6a, 0x20, 0x62, 0x65, 0x6b, 0x61, 0x6d, 0x70, 0x6f, 0x20, 0x67, 0x72, -0x61, 0x6e, 0x1e0d, 0x65, 0x6b, 0x61, 0x6e, 0x6b, 0x75, 0x6e, 0x6b, 0x61, -0x72, 0x61, 0x6b, 0x61, 0x73, 0x6b, 0x65, 0x79, 0x65, 0x6e, 0x6b, 0x65, -0x69, 0x6d, 0x61, 0x6e, 0x63, 0x69, 0x6b, 0x61, 0x67, 0x6f, 0x63, 0x68, -0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x6b, 0x6f, 0x73, 0x1e6d, 0x61, -0x20, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x72, 0x65, 0x73, 0x1e6d, 0x6f, 0x6e, -0x6b, 0x75, 0x61, 0x61, 0x62, 0x61, 0x6b, 0x79, 0x75, 0x72, 0x61, 0x73, -0x6f, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x61, 0x76, 0x6e, -0x1e0d, 0x61, 0x6f, 0x73, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73, 0x6f, 0x6e, 0x20, -0x6b, 0x72, 0x12b, 0x6b, 0x1e0d, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x1e0d, 0x65, -0x1e6d, 0x72, 0x6f, 0x69, 0x1e6d, 0x1e0d, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x6b, -0x61, 0x65, 0x1e0d, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x6e, 0x65, 0x69, 0x72, -0x75, 0x6e, 0x65, 0x70, 0x65, 0x65, 0x6c, 0x20, 0x73, 0x61, 0x6c, 0x76, -0x61, 0x1e0d, 0x6f, 0x72, 0x70, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x65, -0x6c, 0x73, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x6a, 0x61, -0x67, 0x6c, 0x61, 0x73, 0x20, 0x62, 0x61, 0x79, 0x67, 0x6f, 0x6f, 0x73, -0x20, 0x62, 0x65, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x20, 0x1e6d, 0x75, 0x72, -0x6b, 0x67, 0x72, 0x65, 0x6e, 0x61, 0x1e0d, 0x61, 0x67, 0x75, 0x61, 0x1e0d, -0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d, -0x61, 0x6c, 0x61, 0x67, 0x75, 0x61, 0x6a, 0x61, 0x6b, 0x69, 0x6c, 0x67, -0x75, 0x79, 0x61, 0x6e, 0x61, 0x68, 0x65, 0x6c, 0x69, 0x70, 0x61, 0x6b, -0x73, 0x68, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x1e0d, 0x69, 0x61, -0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x6e, 0x6f, 0x6b, 0x73, 0x2c, -0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x72, -0x65, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, -0x6e, 0x61, 0x70, 0x69, 0x1e6d, 0x74, 0x72, 0x73, 0x62, 0x65, 0x72, 0x67, -0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x1e6d, 0x65, -0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, -0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x76, 0x69, 0x2c, 0x20, 0x69, -0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x6e, 0x63, 0x65, -0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, -0x76, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x6b, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, -0x69, 0x79, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x16b, 0x76, 0x69, 0x6b, 0x69, -0x6b, 0x61, 0x6c, 0x75, 0x69, 0x1e6d, 0x6a, 0x61, 0x6d, 0x61, 0x69, 0x6b, -0x61, 0x6a, 0x75, 0x6e, 0x6f, 0x76, 0x6c, 0x6f, 0x75, 0x69, 0x76, 0x69, -0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x69, 0x73, 0x65, 0x6c, 0x6c, -0x6f, 0x2c, 0x20, 0x6b, 0x65, 0x6e, 0x1e6d, 0x75, 0x6b, 0x12b, 0x6b, 0x72, -0x65, 0x6c, 0x65, 0x6e, 0x1e0d, 0x65, 0x69, 0x6b, 0x6c, 0x61, 0x20, 0x70, -0x61, 0x6a, 0x6c, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x6a, 0x65, 0x6c, 0x65, -0x73, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, -0x2019, 0x73, 0x20, 0x6b, 0x75, 0x76, 0x61, 0x1e6d, 0x61, 0x72, 0x6d, 0x61, -0x73, 0x12b, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x6d, 0x61, -0x6e, 0x61, 0x75, 0x73, 0x6d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x1e6d, 0x6d, -0x61, 0x72, 0x1e6d, 0x69, 0x6e, 0x69, 0x6b, 0x6d, 0x61, 0x1e6d, 0x61, 0x6d, -0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x61, 0x73, 0x61, 0x1e6d, 0x6c, 0x61, 0x6e, -0x6d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x12b, 0x6d, 0x65, 0x72, 0x69, -0x1e0d, 0x61, 0x6d, 0x65, 0x1e6d, 0x6c, 0x61, 0x6b, 0x61, 0x1e6d, 0x6c, 0x61, -0x6d, 0x65, 0x6b, 0x73, 0x69, 0x63, 0x6f, 0x20, 0x73, 0x69, 0x1e6d, 0x79, -0x6d, 0x69, 0x6b, 0x76, 0x69, 0x6c, 0xf5, 0x6d, 0x6f, 0x6e, 0x6b, 0x1e6d, -0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x72, 0x72, 0x65, 0x6d, 0x6f, -0x6e, 0x1e6d, 0x65, 0x76, 0x69, 0x64, 0x69, 0x6f, 0x6d, 0x6f, 0x6e, 0x1e6d, -0x73, 0x65, 0x72, 0x72, 0x65, 0x1e6d, 0x6e, 0x61, 0x73, 0x61, 0x75, 0x6e, -0x69, 0x79, 0x75, 0x20, 0x79, 0x6f, 0x72, 0x6b, 0x6e, 0x6f, 0x72, 0x6f, -0x6e, 0x68, 0x61, 0x62, 0x69, 0x79, 0x75, 0x6c, 0x61, 0x2c, 0x20, 0x75, -0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6d, -0x61, 0x1e0d, 0x69, 0x6e, 0x12b, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20, -0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x65, 0x75, 0x20, 0x73, 0x61, -0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d, -0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x16b, 0x6b, 0x6f, 0x6a, 0x69, 0x6e, -0x61, 0x67, 0x61, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x70, 0x61, 0x72, -0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0x6b, -0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, 0x70, 0x72, 0x69, -0x6e, 0x73, 0x65, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x61, 0x70, 0x20, 0x73, -0x70, 0x61, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x1e6d, 0x70, 0x20, 0x76, 0x65, -0x6c, 0x68, 0x6f, 0x70, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x72, 0x69, -0x6b, 0x6f, 0x70, 0x75, 0x1e47, 0x1e6d, 0x61, 0x20, 0x65, 0x72, 0x65, 0x6e, -0x61, 0x73, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x6c, -0x65, 0x64, 0x1e6d, 0x72, 0x65, 0x73, 0x69, 0x70, 0x69, 0x72, 0x65, 0x6a, -0x69, 0x6e, 0x61, 0x72, 0x65, 0x6a, 0x61, 0x6c, 0x79, 0x75, 0x1e6d, 0x72, -0x69, 0x6f, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x6b, 0x6f, 0x73, 0x61, 0x74, -0x61, 0x72, 0x69, 0x73, 0x61, 0x6e, 0x1e6d, 0x69, 0x61, 0x67, 0x6f, 0x73, -0x65, 0x6e, 0x74, 0x6f, 0x20, 0x1e0d, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, -0x73, 0x61, 0x6f, 0x20, 0x70, 0x61, 0x75, 0x6c, 0x6f, 0x69, 0x1e6d, 0x6f, -0x6b, 0x6f, 0x1e6d, 0x6f, 0x72, 0x6d, 0x69, 0x1e6d, 0x73, 0x69, 0x74, 0x6b, -0x61, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x62, 0x61, 0x72, 0x74, 0x65, 0x6c, -0x65, 0x6d, 0x69, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x6a, 0x6f, 0x6e, 0x73, -0x73, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x69, 0x1e6d, 0x1e6d, 0x73, 0x73, 0x65, -0x6e, 0x74, 0x20, 0x6c, 0x75, 0x73, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x1e6d, -0x20, 0x74, 0x6f, 0x6d, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x76, -0x69, 0x6e, 0x73, 0x65, 0x6e, 0x1e6d, 0x73, 0x76, 0x69, 0x70, 0x1e6d, 0x20, -0x6b, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x1e6d, 0x74, 0x65, 0x67, 0x75, 0x74, -0x75, 0x6c, 0x65, 0x74, 0x69, 0x68, 0x76, 0x61, 0x6e, 0x61, 0x1e6d, 0x6f, -0x72, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x1e6d, 0x6f, 0x72, 0x1e6d, 0x6f, 0x6c, 0x61, -0x76, 0x61, 0x6e, 0x6b, 0x16b, 0x76, 0x65, 0x72, 0x76, 0x68, 0x61, 0x69, -0x1e6d, 0x68, 0x6f, 0x72, 0x73, 0x76, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, -0x67, 0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x61, 0x1e6d, 0x6b, 0x65, 0x73, 0x65, -0x65, 0x1e0d, 0x65, 0x76, 0x69, 0x73, 0x1e0d, 0x79, 0x75, 0x6d, 0x6f, 0x6e, -0x74, 0x20, 0x64, 0x65, 0x20, 0x75, 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x6d, -0x65, 0x6b, 0x76, 0x61, 0x72, 0x69, 0x6d, 0x61, 0x76, 0x73, 0x6f, 0x6e, -0x6d, 0x65, 0x6b, 0x20, 0x6d, 0x75, 0x72, 0x1e0d, 0x6f, 0x70, 0x61, 0x6c, -0x6d, 0x65, 0x72, 0x72, 0x6f, 0x74, 0x65, 0x72, 0x61, 0x73, 0x79, 0x6f, -0x76, 0x61, 0x1e6d, 0x72, 0x6f, 0x6c, 0x6c, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f, -0x6b, 0x6c, 0x6e, 0x67, 0x79, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x65, -0x1e0d, 0x65, 0x6e, 0x61, 0x6c, 0x6d, 0x61, 0x1e6d, 0x79, 0x61, 0x6d, 0x6d, -0x61, 0x6e, 0x61, 0x6e, 0x61, 0x1e0d, 0x69, 0x72, 0x61, 0x6b, 0x74, 0x61, -0x75, 0x61, 0x61, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x61, 0x73, 0x67, 0x61, -0x62, 0x61, 0x1e6d, 0x61, 0x74, 0x61, 0x72, 0x61, 0x75, 0x62, 0x61, 0x67, -0x64, 0x61, 0x64, 0x62, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x61, -0x6b, 0x75, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x62, 0x61, 0x72, -0x6e, 0x61, 0x75, 0x6c, 0x62, 0x65, 0x69, 0x72, 0x75, 0x74, 0x62, 0x69, -0x73, 0x6b, 0x65, 0x6b, 0x62, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x63, 0x69, -0x74, 0x61, 0x6b, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x1e0d, 0x61, 0x6d, -0x61, 0x73, 0x6b, 0x75, 0x73, 0x1e0d, 0x69, 0x6c, 0x69, 0x64, 0x75, 0x62, -0x61, 0x69, 0x64, 0x75, 0x73, 0x61, 0x6d, 0x62, 0x65, 0x70, 0x61, 0x6d, -0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x67, 0x61, 0x6a, 0x61, 0x68, 0x65, -0x62, 0x72, 0x6f, 0x6e, 0x68, 0x6f, 0x20, 0x63, 0x69, 0x20, 0x6d, 0x69, -0x6e, 0x68, 0x20, 0x73, 0x69, 0x74, 0x69, 0x68, 0x6f, 0x6e, 0x67, 0x20, -0x6b, 0x6f, 0x6e, 0x67, 0x69, 0x72, 0x6b, 0x75, 0x1e6d, 0x73, 0x6b, 0x6a, -0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x6a, 0x65, 0x72, 0x75, 0x73, -0x61, 0x6c, 0x65, 0x6d, 0x6b, 0x61, 0x62, 0x75, 0x6c, 0x6b, 0x61, 0x6d, -0x63, 0x61, 0x1e6d, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x61, 0x63, 0x12b, 0x6b, -0x61, 0x1e6d, 0x6d, 0x61, 0x6e, 0x1e0d, 0x75, 0x6b, 0x61, 0x6e, 0x64, 0x69, -0x67, 0x61, 0x6b, 0x6f, 0x6c, 0x6b, 0x61, 0x74, 0x61, 0x6b, 0x72, 0x61, -0x73, 0x6e, 0x65, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x6b, 0x75, 0x61, 0x6c, -0x61, 0x20, 0x6c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x6b, 0x75, 0x63, 0x69, -0x6e, 0x67, 0x6b, 0x75, 0x76, 0x61, 0x69, 0x74, 0x6d, 0x6b, 0x61, 0x6f, -0x6d, 0x65, 0x67, 0x61, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x6b, 0x61, 0x73, -0x61, 0x72, 0x6d, 0x61, 0x6e, 0x12b, 0x6c, 0x61, 0x6d, 0x61, 0x73, 0x6b, -0x61, 0x74, 0x6e, 0x69, 0x6b, 0x6f, 0x73, 0x69, 0x79, 0x61, 0x6e, 0x65, -0x76, 0x6f, 0x6b, 0x75, 0x6a, 0x6e, 0x65, 0x1e6d, 0x73, 0x6b, 0x6e, 0x6f, -0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x70, 0x6e, 0x6f, -0x6d, 0x20, 0x70, 0x65, 0x6e, 0x68, 0x70, 0x6f, 0x6e, 0x1e6d, 0x69, 0x61, -0x6e, 0x61, 0x6b, 0x70, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, -0x6b, 0x6f, 0x73, 0x1e6d, 0x61, 0x6e, 0x65, 0x6b, 0x69, 0x6a, 0x75, 0x6f, -0x72, 0x64, 0x61, 0x72, 0x69, 0x79, 0x61, 0x64, 0x73, 0x61, 0x68, 0x61, -0x6c, 0x69, 0x6e, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64, -0x73, 0x65, 0x6f, 0x6c, 0x73, 0x65, 0x6e, 0x67, 0x61, 0x69, 0x73, 0x69, -0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x73, 0x72, 0x65, 0x1e0d, 0x6e, 0x65, -0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x74, 0x61, 0x69, 0x70, 0x65, -0x69, 0x74, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x1e6d, 0x74, 0x62, 0x69, 0x6c, -0x69, 0x73, 0x69, 0x74, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x74, 0x69, 0x6d, -0x70, 0x68, 0x75, 0x1e6d, 0x6f, 0x6b, 0x79, 0x6f, 0x1e6d, 0x6f, 0x6d, 0x73, -0x6b, 0x75, 0x6c, 0x61, 0x6e, 0x62, 0x61, 0x1e6d, 0x61, 0x72, 0x75, 0x72, -0x75, 0x6d, 0x63, 0x69, 0x79, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x65, 0x72, -0x61, 0x76, 0x69, 0x65, 0x6e, 0x1e6d, 0x69, 0x61, 0x61, 0x6e, 0x76, 0x6c, -0x61, 0x1e0d, 0x69, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f, 0x6b, 0x79, 0x61, 0x6b, -0x75, 0x1e6d, 0x73, 0x6b, 0x79, 0x61, 0x6e, 0x67, 0x6f, 0x6e, 0x79, 0x69, -0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x79, -0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x61, 0x6a, 0x6f, 0x72, 0x65, 0x73, -0x62, 0x65, 0x72, 0x6d, 0x16b, 0x64, 0x61, 0x6b, 0x65, 0x6e, 0x65, 0x72, -0x69, 0x6b, 0x65, 0x70, 0x20, 0x76, 0x65, 0x72, 0x1e0d, 0x65, 0x70, 0x65, -0x72, 0x6f, 0x6d, 0x61, 0x1e0d, 0x69, 0x65, 0x72, 0x61, 0x72, 0x65, 0x79, -0x6b, 0x79, 0x61, 0x76, 0x69, 0x6b, 0x64, 0x6b, 0x69, 0x1e47, 0x20, 0x6a, -0x6f, 0x72, 0x6a, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x65, -0x6c, 0x65, 0x6e, 0x61, 0x73, 0x1e6d, 0x61, 0x6e, 0x6c, 0x69, 0x61, 0x65, -0x64, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x62, 0x72, 0x69, 0x73, 0x62, 0x61, -0x6e, 0x65, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x68, 0x69, 0x6c, -0x6c, 0x1e0d, 0x61, 0x72, 0x76, 0x69, 0x6e, 0x79, 0x75, 0x6b, 0x6c, 0x61, -0x68, 0x6f, 0x62, 0x61, 0x72, 0x1e6d, 0x6c, 0x69, 0x6e, 0x1e0d, 0x65, 0x72, -0x6d, 0x61, 0x6e, 0x6c, 0x6f, 0x72, 0x1e0d, 0x20, 0x68, 0x6f, 0x76, 0x65, -0x6d, 0x65, 0x6c, 0x62, 0x6f, 0x72, 0x6e, 0x65, 0x70, 0x65, 0x72, 0x74, -0x73, 0x79, 0x1e0d, 0x6e, 0x12b, 0x61, 0x6d, 0x73, 0x1e6d, 0x65, 0x72, 0x1e0d, -0x61, 0x6d, 0x61, 0x61, 0x1e47, 0x1e0d, 0x6f, 0x72, 0x61, 0x61, 0x61, 0x73, -0x1e6d, 0x72, 0x61, 0x68, 0x61, 0x6e, 0x65, 0x74, 0x65, 0x6e, 0x73, 0x62, -0x65, 0x6c, 0x67, 0x72, 0x61, 0x1e0d, 0x65, 0x62, 0x65, 0x72, 0x6c, 0x69, -0x6e, 0x62, 0x72, 0x61, 0x1e6d, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x62, -0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x62, 0x75, 0x6b, 0x61, 0x72, -0x65, 0x73, 0x74, 0x62, 0x75, 0x1e0d, 0x61, 0x70, 0x65, 0x73, 0x74, 0x62, -0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x6b, 0x69, 0x73, 0x69, 0x6e, -0x61, 0x75, 0x6b, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, -0x1e0d, 0x62, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x1e6d, -0x61, 0x72, 0x67, 0x65, 0x72, 0x6e, 0x73, 0x69, 0x68, 0x65, 0x6c, 0x73, -0x69, 0x6e, 0x6b, 0x69, 0x61, 0x61, 0x69, 0x6c, 0x20, 0x61, 0x70, 0x20, -0x6d, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x6a, -0x65, 0x72, 0x73, 0x69, 0x6b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, -0x72, 0x61, 0x1e0d, 0x6b, 0x69, 0x72, 0x6f, 0x76, 0x6b, 0x69, 0x79, 0x76, -0x6c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x6c, 0x79, 0x75, 0x62, 0x6c, 0x79, -0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x1e0d, 0x6e, 0x6c, 0x6b, 0x73, 0x65, 0x6d, -0x62, 0x72, 0x67, 0x6d, 0x65, 0x1e0d, 0x72, 0x69, 0x1e0d, 0x6d, 0x61, 0x6c, -0x1e6d, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6d, 0x69, -0x6e, 0x73, 0x6b, 0x6d, 0x6f, 0x6e, 0x61, 0x6b, 0x6f, 0x6d, 0x6f, 0x73, -0x6b, 0x6f, 0x6f, 0x73, 0x6c, 0x6f, 0x70, 0x61, 0x72, 0x69, 0x73, 0x70, -0x1e0d, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x73, 0x61, 0x70, 0x72, 0x61, 0x67, -0x72, 0x69, 0x67, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x73, 0x61, -0x6e, 0x20, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x73, 0x61, 0x72, 0x61, -0x6a, 0x65, 0x76, 0x6f, 0x73, 0x61, 0x72, 0x61, 0x1e6d, 0x6f, 0x76, 0x73, -0x69, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x6f, -0x70, 0x69, 0x73, 0x6f, 0x70, 0x69, 0x79, 0x61, 0x73, 0x1e6d, 0x6f, 0x6b, -0x68, 0x6f, 0x6d, 0x74, 0x61, 0x6c, 0x69, 0x6e, 0x1e6d, 0x69, 0x72, 0x61, -0x6e, 0x65, 0x75, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 0x76, -0x61, 0x1e0d, 0x75, 0x6a, 0x76, 0x61, 0x1e6d, 0x69, 0x6b, 0x61, 0x6e, 0x76, -0x69, 0x65, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, -0x76, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x1e0d, 0x76, 0x61, 0x72, -0x73, 0x61, 0x74, 0x65, 0x67, 0x75, 0x73, 0x69, 0x67, 0x61, 0x6c, 0x70, -0x61, 0x6a, 0x75, 0x72, 0x69, 0x63, 0x1e6d, 0x61, 0x6e, 0x61, 0x6e, 0x61, -0x72, 0x69, 0x76, 0x63, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x6b, 0x72, 0x69, -0x73, 0x1e6d, 0x6d, 0x61, 0x73, 0x6b, 0x6f, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, -0x6d, 0x6f, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, 0x65, -0x6e, 0x6d, 0x61, 0x68, 0x65, 0x6d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, -0x73, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x73, 0x69, 0x75, 0x73, 0x6d, 0x61, -0x79, 0x6f, 0x1e6d, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x70, -0x69, 0x61, 0x101, 0x6b, 0x6c, 0x61, 0x6e, 0x1e0d, 0x62, 0x6f, 0x75, 0x67, -0x61, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x63, 0x65, 0x1e6d, 0x61, 0x6d, 0x63, -0x16b, 0x6b, 0x12b, 0x73, 0x74, 0x65, 0x72, 0x69, 0x70, 0x65, 0x1e6d, 0x65, -0x70, 0x61, 0x6b, 0x61, 0x6f, 0x70, 0x6f, 0x70, 0x69, 0x6a, 0x69, 0x70, -0x75, 0x6e, 0x61, 0x70, 0x75, 0x74, 0x69, 0x67, 0x61, 0x6c, 0x61, 0x70, -0x61, 0x67, 0x6f, 0x73, 0x67, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x67, -0x75, 0x61, 0x1e0d, 0x61, 0x6c, 0x6b, 0x65, 0x6e, 0x61, 0x6c, 0x6b, 0x61, -0x6e, 0x1e6d, 0x6f, 0x6e, 0x6b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, -0x74, 0x69, 0x6b, 0x69, 0x73, 0x72, 0x61, 0x65, 0x6b, 0x76, 0x61, 0x6a, -0x61, 0x6c, 0x65, 0x69, 0x6e, 0x6d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x6d, -0x61, 0x72, 0x6b, 0x69, 0x73, 0x61, 0x73, 0x6d, 0x69, 0x1e0d, 0x76, 0x61, -0x79, 0x6e, 0x61, 0x75, 0x72, 0x75, 0x6e, 0x69, 0x75, 0x65, 0x6e, 0x6f, -0x72, 0x70, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x69, 0x65, 0x70, 0x61, 0x6e, -0x67, 0x6f, 0x20, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x70, 0x61, 0x6c, 0x61, -0x75, 0x70, 0x69, 0x1e6d, 0x6b, 0x65, 0x72, 0x6e, 0x70, 0x6f, 0x6e, 0x70, -0x65, 0x69, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x73, -0x62, 0x69, 0x72, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x73, -0x61, 0x69, 0x70, 0x61, 0x6e, 0x1e6d, 0x61, 0x68, 0x69, 0x1e6d, 0x69, 0x74, -0x61, 0x72, 0x61, 0x76, 0x61, 0x1e6d, 0x6f, 0x6e, 0x67, 0x61, 0x1e6d, 0x61, -0x70, 0x75, 0x76, 0x65, 0x6b, 0x76, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x92c, -0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x91c, 0x941, 0x932, 0x92a, 0x93c, 0x94d, 0x930, -0x940, 0x91f, 0x93e, 0x909, 0x928, 0x915, 0x93e, 0x930, 0x94d, 0x924, 0x941, 0x92e, -0x915, 0x93f, 0x902, 0x938, 0x93e, 0x938, 0x93e, 0x932, 0x941, 0x92c, 0x941, 0x92e, -0x92c, 0x93e, 0x938, 0x940, 0x92e, 0x94d, 0x2d, 0x92c, 0x93e, 0x92c, 0x93e, 0x928, -0x947, 0x92e, 0x94b, 0x917, 0x93e, 0x926, 0x93f, 0x938, 0x941, 0x928, 0x93e, 0x907, -0x930, 0x94b, 0x92c, 0x93f, 0x928, 0x941, 0x906, 0x915, 0x91a, 0x949, 0x91f, 0x938, -0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x939, 0x94d, 0x935, 0x93e, 0x928, 0x938, 0x94d, -0x92f, 0x93e, 0x928, 0x20, 0x932, 0x942, 0x924, 0x93f, 0x909, 0x938, 0x941, 0x906, -0x907, 0x92f, 0x93e, 0x90f, 0x938, 0x928, 0x938, 0x93f, 0x92f, 0x949, 0x928, 0x92c, -0x94d, 0x932, 0x93e, 0x902, 0x2d, 0x938, 0x947, 0x92c, 0x932, 0x94b, 0x928, 0x915, -0x947, 0x92e, 0x94d, 0x92c, 0x94d, 0x930, 0x93f, 0x91c, 0x20, 0x92c, 0x947, 0x915, -0x94d, 0x92f, 0x93e, 0x92e, 0x94d, 0x92a, 0x94b, 0x20, 0x917, 0x94d, 0x930, 0x93e, -0x902, 0x921, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x915, 0x941, 0x928, 0x938, -0x93f, 0x915, 0x93e, 0x917, 0x94b, 0x921, 0x947, 0x928, 0x92e, 0x93e, 0x930, 0x94d, -0x915, 0x938, 0x949, 0x928, 0x924, 0x93f, 0x930, 0x941, 0x928, 0x947, 0x92a, 0x947, -0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x928, 0x947, 0x932, 0x94d, 0x938, -0x928, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x93e, 0x932, 0x947, 0x91c, 0x93c, -0x93e, 0x939, 0x947, 0x932, 0x93f, 0x92a, 0x947, 0x915, 0x94d, 0x938, 0x907, 0x915, -0x93e, 0x932, 0x941, 0x924, 0x93f, 0x91f, 0x915, 0x94d, 0x930, 0x93e, 0x932, 0x947, -0x928, 0x94d, 0x921, 0x93f, 0x91c, 0x93f, 0x915, 0x92e, 0x928, 0x94b, 0x938, 0x92e, -0x947, 0x930, 0x93f, 0x917, 0x94b, 0x91f, 0x92c, 0x94d, 0x92f, 0x942, 0x932, 0x93e, -0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, -0x93e, 0x92e, 0x93e, 0x926, 0x93f, 0x928, 0x940, 0x20, 0x909, 0x924, 0x949, 0x930, -0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x928, 0x94d, 0x92f, 0x942, 0x20, -0x938, 0x93e, 0x932, 0x947, 0x92e, 0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949, -0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x913, 0x915, 0x93e, 0x91c, 0x940, 0x928, -0x93e, 0x917, 0x93e, 0x92a, 0x93c, 0x940, 0x928, 0x93f, 0x915, 0x94d, 0x938, 0x92a, -0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x911, 0x92a, 0x93c, 0x20, 0x938, 0x94d, 0x92a, -0x947, 0x928, 0x930, 0x947, 0x938, 0x93e, 0x907, 0x92a, 0x93c, 0x938, 0x947, 0x928, -0x94d, 0x91f, 0x93e, 0x930, 0x947, 0x92e, 0x938, 0x947, 0x902, 0x924, 0x93f, 0x906, -0x917, 0x94b, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x92c, 0x93e, 0x930, 0x94d, 0x924, -0x947, 0x932, 0x947, 0x92e, 0x93f, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x924, 0x949, -0x92e, 0x938, 0x938, 0x94d, 0x935, 0x93f, 0x92a, 0x93c, 0x94d, 0x91f, 0x20, 0x915, -0x930, 0x902, 0x91f, 0x935, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x915, 0x942, 0x935, -0x930, 0x92e, 0x94d, 0x92f, 0x93e, 0x915, 0x92e, 0x941, 0x930, 0x94d, 0x921, 0x94b, -0x932, 0x949, 0x928, 0x94d, 0x917, 0x92f, 0x930, 0x92c, 0x94d, 0x92f, 0x947, 0x928, -0x905, 0x938, 0x94d, 0x917, 0x93e, 0x92c, 0x93e, 0x924, 0x92c, 0x94d, 0x92f, 0x93e, -0x902, 0x917, 0x915, 0x949, 0x915, 0x92c, 0x93f, 0x938, 0x94d, 0x915, 0x947, 0x915, -0x92c, 0x94d, 0x930, 0x942, 0x928, 0x947, 0x924, 0x93f, 0x924, 0x94d, 0x938, 0x93f, -0x924, 0x93e, 0x926, 0x941, 0x92c, 0x924, 0x93f, 0x926, 0x941, 0x938, 0x93e, 0x902, -0x92c, 0x947, 0x92a, 0x93c, 0x93e, 0x92e, 0x93e, 0x917, 0x941, 0x938, 0x94d, 0x924, -0x93e, 0x92f, 0x947, 0x930, 0x941, 0x938, 0x932, 0x947, 0x92e, 0x915, 0x93e, 0x921, -0x93f, 0x902, 0x917, 0x93e, 0x92a, 0x928, 0x949, 0x92e, 0x20, 0x92a, 0x947, 0x928, -0x94d, 0x939, 0x915, 0x93f, 0x91c, 0x93f, 0x932, 0x949, 0x930, 0x94d, 0x921, 0x93e, -0x938, 0x93e, 0x915, 0x93e, 0x932, 0x93f, 0x928, 0x938, 0x902, 0x918, 0x93e, 0x924, -0x93f, 0x924, 0x93e, 0x924, 0x93f, 0x92a, 0x947, 0x924, 0x93f, 0x924, 0x93e, 0x938, -0x915, 0x902, 0x924, 0x91f, 0x94d, 0x2d, 0x92c, 0x93f, 0x932, 0x93f, 0x938, 0x93f, -0x92f, 0x93e, 0x902, 0x917, 0x949, 0x928, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x947, -0x930, 0x940, 0x92a, 0x94d, 0x92f, 0x93e, 0x930, 0x94b, 0x926, 0x93e, 0x945, 0x915, -0x93f, 0x923, 0x93e, 0x945, 0x20, 0x91c, 0x93e, 0x945, 0x930, 0x94d, 0x91c, 0x93f, -0x92f, 0x93e, 0x938, 0x94d, 0x91f, 0x94d, 0x92f, 0x93e, 0x928, 0x932, 0x940, 0x906, -0x938, 0x94d, 0x91f, 0x94d, 0x930, 0x93e, 0x915, 0x93e, 0x928, 0x90f, 0x924, 0x947, -0x928, 0x94d, 0x938, 0x906, 0x907, 0x932, 0x20, 0x911, 0x92a, 0x94d, 0x20, 0x92e, -0x94d, 0x92f, 0x93e, 0x928, 0x938, 0x93f, 0x92e, 0x94d, 0x92a, 0x93c, 0x947, 0x930, -0x94b, 0x92a, 0x94b, 0x932, 0x938, 0x94d, 0x915, 0x94b, 0x92a, 0x94d, 0x92f, 0x947, -0x938, 0x94b, 0x92a, 0x93c, 0x93f, 0x92f, 0x93e, 0x91c, 0x93c, 0x94d, 0x92f, 0x942, -0x930, 0x93f, 0x915, 0x93c, 0x92e, 0x949, 0x930, 0x940, 0x938, 0x938, 0x911, 0x915, -0x932, 0x947, 0x902, 0x921, 0x91a, 0x94d, 0x92f, 0x93e, 0x925, 0x92e, 0x924, 0x93f, -0x938, 0x94d, 0x91f, 0x930, 0x90f, 0x92a, 0x93c, 0x947, 0x91f, 0x92a, 0x93c, 0x93e, -0x915, 0x93e, 0x913, 0x92a, 0x93c, 0x94b, 0x92a, 0x93c, 0x93f, 0x91c, 0x940, 0x92a, -0x93c, 0x94d, 0x92f, 0x942, 0x928, 0x93e, 0x92a, 0x93c, 0x941, 0x91f, 0x940, 0x917, -0x94d, 0x92f, 0x93e, 0x92e, 0x92c, 0x93f, 0x92f, 0x930, 0x915, 0x947, 0x902, 0x91f, -0x928, 0x928, 0x93e, 0x945, 0x909, 0x930, 0x941, 0x928, 0x949, 0x930, 0x92a, 0x93c, -0x949, 0x915, 0x928, 0x949, 0x92e, 0x93f, 0x92f, 0x93e, 0x92a, 0x94b, 0x928, 0x92a, -0x947, 0x924, 0x93f, 0xb0f, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb2c, 0xb4d, 0xb30, 0xb3e, -0xb1c, 0xb3e, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2c, 0xb41, 0xb1c, 0xb42, -0xb2e, 0xb4d, 0xb2c, 0xb41, 0xb30, 0xb3e, 0xb15, 0xb28, 0xb3e, 0xb15, 0xb4d, 0xb30, -0xb3f, 0xb1c, 0xb3f, 0xb2c, 0xb1f, 0xb3f, 0xb2a, 0xb4d, 0xb30, 0xb3f, 0xb1f, 0xb3e, -0xb09, 0xb28, 0xb4d, 0x200c, 0xb17, 0xb3e, 0xb2c, 0xb30, 0xb4d, 0xb23, 0xb4d, 0xb23, -0xb1c, 0xb39, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb2c, 0xb30, 0xb4d, 0xb17, 0xb15, 0xb30, -0xb1f, 0xb09, 0xb2e, 0xb4d, 0x200c, 0xb32, 0xb3e, 0xb17, 0xb38, 0xb4d, 0x200c, 0xb32, -0xb3f, 0xb2c, 0xb4d, 0xb30, 0xb47, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb32, -0xb2e, 0xb4d, 0x200c, 0xb2e, 0xb4d, 0x2d, 0xb2c, 0xb3e, 0xb2c, 0xb3e, 0xb28, 0xb47, -0xb2e, 0xb4b, 0xb17, 0xb3e, 0xb21, 0xb3f, 0xb38, 0xb41, 0xb2e, 0xb28, 0xb30, 0xb4b, -0xb2c, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07, 0xb30, 0xb2c, 0xb3f, 0xb28, 0xb41, 0xb06, -0xb15, 0xb1a, 0xb1f, 0xb05, 0xb17, 0xb3e, 0xb21, 0xb17, 0xb41, 0xb2a, 0xb30, 0xb4d, -0xb1f, 0x2d, 0xb28, 0xb71, 0xb38, 0xb3e, 0xb05, 0x20, 0xb1f, 0xb2e, 0xb47, 0xb24, -0xb4d, 0xb30, 0xb3f, 0xb2a, 0xb32, 0xb3f, 0xb71, 0xb3f, 0xb23, 0xb4d, 0xb21, 0xb39, -0xb15, 0xb4d, 0xb2c, 0xb41, 0xb0f, 0xb28, 0xb38, 0xb4d, 0x20, 0xb06, 0xb07, 0xb30, -0xb47, 0xb38, 0xb4d, 0xb15, 0xb3e, 0xb3c, 0xb1f, 0xb3e, 0xb2e, 0xb3e, 0xb15, 0xb3e, -0xb01, 0xb15, 0xb4b, 0xb21, 0xb4b, 0xb2c, 0xb3e, 0xb1c, 0xb41, 0xb1c, 0xb4b, 0xb0f, -0xb32, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb4d, 0xb05, 0xb1c, 0xb3e, 0xb2e, 0xb47, 0xb23, -0xb4d, 0xb21, 0xb1c, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb4b, 0x20, 0xb17, 0xb3e, 0xb32, -0xb47, 0xb17, 0xb4b, 0xb38, 0xb38, 0xb3e, 0xb32, 0xb4d, 0xb1f, 0xb3e, 0xb38, 0xb3e, -0xb5f, 0xb3e, 0xb28, 0xb4d, 0x20, 0xb71, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb5f, 0xb3e, -0xb28, 0x20, 0xb32, 0xb41, 0xb07, 0xb38, 0xb1f, 0xb4b, 0xb15, 0xb41, 0xb2e, 0xb28, -0xb09, 0xb38, 0xb41, 0xb06, 0xb07, 0xb5f, 0xb3e, 0xb05, 0xb30, 0xb41, 0xb2c, 0xb3e, -0xb2c, 0xb3e, 0xb30, 0xb2c, 0xb3e, 0xb21, 0xb38, 0xb2c, 0xb4d, 0xb32, 0xb3e, 0xb19, -0xb4d, 0xb15, 0x2d, 0xb38, 0xb3e, 0xb2c, 0xb32, 0xb28, 0xb4d, 0xb2c, 0xb4b, 0xb06, -0x20, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb2c, 0xb17, 0xb1f, 0xb3e, 0xb2c, -0xb07, 0xb38, 0xb47, 0xb15, 0xb3e, 0xb2e, 0xb4d, 0xb2a, 0x20, 0xb17, 0xb4d, 0xb30, -0xb3e, 0xb23, 0xb4d, 0xb21, 0xb47, 0xb38, 0xb3f, 0xb15, 0xb3e, 0xb17, 0xb15, 0xb37, -0xb4d, 0xb1f, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb15, 0xb4d, 0xb30, 0xb47, -0xb38, 0xb4d, 0x200d, 0xb1f, 0xb28, 0xb21, 0xb47, 0xb28, 0xb71, 0xb3f, 0xb30, 0xb4d, -0xb21, 0xb47, 0xb1f, 0xb4d, 0xb30, 0xb07, 0xb1f, 0xb4d, 0xb21, 0xb2e, 0xb3f, 0xb28, -0xb3f, 0xb15, 0xb3e, 0xb0f, 0xb21, 0xb4d, 0x200d, 0xb2e, 0xb28, 0xb1f, 0xb28, 0xb4d, -0xb0f, 0xb32, 0xb4d, 0x20, 0xb38, 0xb3e, 0xb32, 0xb71, 0xb3e, 0xb21, 0xb4b, 0xb30, -0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0x20, 0xb28, 0xb47, 0xb32, 0xb38, 0xb28, 0xb4d, -0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb32, 0xb47, 0xb1c, 0xb3e, 0xb17, 0xb41, 0xb06, 0xb21, -0xb47, 0xb32, 0xb09, 0xb2a, 0xb47, 0xb17, 0xb41, 0xb06, 0xb24, 0xb47, 0xb2e, 0xb3e, -0xb32, 0xb3e, 0xb39, 0xb3e, 0xb71, 0xb28, 0xb3e, 0xb39, 0xb47, 0xb30, 0xb2e, 0xb38, -0xb3f, 0xb32, 0xb4b, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb2a, -0xb32, 0xb3f, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb30, 0xb47, 0xb28, 0xb17, 0x2c, 0x20, -0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb71, 0xb47, 0xb71, 0xb3e, -0xb5f, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07, -0xb28, 0xb41, 0xb71, 0xb3f, 0xb15, 0xb4d, 0xb32, 0xb09, 0xb07, 0xb38, 0xb71, 0xb3f, -0xb32, 0xb4d, 0xb32, 0xb47, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb38, 0xb47, 0xb32, -0x2c, 0x20, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb09, 0xb15, 0xb3f, 0xb15, 0xb47, -0xb15, 0xb4d, 0xb30, 0xb3e, 0xb32, 0xb47, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb1c, 0xb3f, -0xb15, 0xb2e, 0xb3e, 0xb38, 0xb3f, 0xb05, 0xb2e, 0xb3e, 0xb30, 0xb3f, 0xb17, 0xb1f, -0xb4d, 0xb2e, 0xb3e, 0xb1f, 0xb3e, 0xb2e, 0xb30, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb1c, -0xb3e, 0xb1f, 0xb32, 0xb3e, 0xb28, 0xb4d, 0xb2e, 0xb3f, 0xb15, 0xb4d, 0xb35, 0xb47, -0xb32, 0xb28, 0xb4d, 0xb2e, 0xb3e, 0xb28, 0xb15, 0xb1f, 0xb28, 0xb4d, 0xb2e, 0xb28, -0xb1f, 0xb47, 0xb30, 0xb3f, 0xb0f, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb47, 0xb2d, 0xb3f, -0xb21, 0xb3f, 0xb05, 0xb2e, 0xb28, 0xb1f, 0xb38, 0xb47, 0xb30, 0xb30, 0xb3e, 0xb1f, -0xb4d, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20, 0xb5f, 0xb30, 0xb4d, 0xb15, 0xb4d, 0xb28, -0xb30, 0xb39, 0xb4d, 0xb28, 0xb2c, 0xb47, 0xb09, 0xb32, 0xb3e, 0xb39, 0x2c, 0x20, -0xb09, 0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb15, -0xb47, 0xb28, 0xb4d, 0xb26, 0xb4d, 0xb30, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24, -0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20, -0xb38, 0xb3e, 0xb32, 0xb47, 0xb2e, 0xb4d, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24, -0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb05, 0xb1c, 0xb3f, 0xb28, 0xb3e, -0xb17, 0xb3e, 0xb2a, 0xb07, 0xb28, 0xb3f, 0xb15, 0xb4d, 0xb38, 0xb2a, 0xb30, 0xb4d, -0xb1f, 0x2d, 0xb0f, 0xb5f, 0xb41, 0x2d, 0xb2a, 0xb4d, 0xb30, 0xb3f, 0xb28, 0xb4d, -0x200d, 0xb38, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb05, 0xb2b, 0xb4d, 0x20, -0xb38, 0xb4d, 0xb2a, 0xb47, 0xb28, 0xb4d, 0xb2a, 0xb41, 0xb0f, 0xb30, 0xb4d, 0xb24, -0x20, 0xb30, 0xb3f, 0xb15, 0xb30, 0xb47, 0xb38, 0xb3f, 0xb2a, 0xb3f, 0xb30, 0xb3f, -0xb5f, 0x20, 0xb2c, 0xb4d, 0xb30, 0xb3e, 0xb19, 0xb4d, 0xb15, 0xb38, 0xb3e, 0xb28, -0xb4d, 0xb24, 0xb30, 0xb47, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb23, 0xb4d, 0xb1f, 0x20, -0xb21, 0xb2e, 0xb3f, 0xb19, 0xb4d, 0xb17, 0xb07, 0xb1f, 0xb4d, 0xb1f, 0xb15, 0xb4d, -0xb35, 0xb30, 0xb1f, 0xb30, 0xb2e, 0xb3f, 0xb1f, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d, -0xb1f, 0x20, 0xb2c, 0xb3e, 0xb30, 0xb4d, 0xb24, 0xb47, 0xb32, 0xb47, 0xb2e, 0xb3f, -0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb15, 0xb3f, 0xb1f, 0xb4d, 0x200d, -0xb38, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20, 0xb25, 0xb2e, 0xb3e, -0xb38, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20, 0xb71, 0xb3f, -0xb28, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0xb24, 0xb41, 0xb32, 0xb47, 0xb1f, -0xb30, 0xb23, 0xb4d, 0xb1f, 0xb1f, 0xb30, 0xb1f, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb19, -0xb4d, 0xb15, 0xb41, 0xb71, 0xb30, 0xb4d, 0xb15, 0xb47, 0xb38, 0xb3f, 0xb21, 0xb47, -0xb71, 0xb3f, 0xb38, 0xb4d, 0xb21, 0xb4d, 0xb5f, 0xb41, 0xb2e, 0xb3e, 0xb23, 0xb4d, -0xb1f, 0x20, 0xb21, 0xb3f, 0x20, 0xb09, 0xb30, 0xb71, 0xb3f, 0xb32, 0xb47, 0xb2e, -0xb15, 0xb4d, 0xb71, 0xb3e, 0xb30, 0xb3f, 0xb2e, 0xb3e, 0xb01, 0xb38, 0xb28, 0xb2e, -0xb4d, 0xb5f, 0xb3e, 0xb15, 0xb2e, 0xb41, 0xb30, 0xb4d, 0xb21, 0xb2a, 0xb3e, 0xb01, -0xb2e, 0xb30, 0xb30, 0xb4b, 0xb24, 0xb47, 0xb30, 0xb3e, 0xb1f, 0xb4b, 0xb32, 0xb4d, -0xb71, 0xb4b, 0xb38, 0xb4d, 0xb24, 0xb15, 0xb4b, 0xb33, 0xb19, 0xb4d, 0xb16, 0xb5f, -0xb3e, 0xb30, 0xb2c, 0xb47, 0xb28, 0xb06, 0xb15, 0xb4d, 0xb1f, 0xb2c, 0xb47, 0xb06, -0xb38, 0xb4d, 0x200d, 0xb17, 0xb3e, 0xb2c, 0xb1f, 0xb4d, 0xb2c, 0xb39, 0xb3e, 0xb30, -0xb47, 0xb28, 0xb2c, 0xb3f, 0xb38, 0xb15, 0xb47, 0xb15, 0xb4d, 0x200c, 0xb26, 0xb41, -0xb38, 0xb3e, 0xb28, 0xb2c, 0xb47, 0xb2a, 0xb3e, 0xb2e, 0xb3e, 0xb17, 0xb41, 0xb38, -0xb4d, 0xb1f, 0xb3e, 0xb39, 0x20, 0xb1a, 0xb3f, 0x20, 0xb2e, 0xb3f, 0xb28, 0xb4d, -0x200c, 0x20, 0xb38, 0xb3f, 0xb1f, 0xb3f, 0xb39, 0xb4b, 0xb71, 0xb21, 0xb4d, 0x200c, -0xb1c, 0xb3e, 0xb15, 0xb30, 0xb4d, 0xb24, 0xb3e, 0xb15, 0xb2c, 0xb41, 0xb32, 0xb4d, -0xb15, 0xb3e, 0xb1f, 0xb2e, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb41, 0xb15, 0xb3e, 0xb28, -0xb21, 0xb4d, 0xb5f, 0xb3e, 0xb17, 0xb3e, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb38, 0xb28, -0xb5f, 0xb3e, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb28, 0xb3f, 0xb15, 0xb38, 0xb3f, 0xb06, -0xb28, 0xb71, 0xb15, 0xb41, 0xb1c, 0xb28, 0xb47, 0xb1f, 0xb38, 0xb4d, 0xb15, 0xb28, -0xb71, 0xb38, 0xb3f, 0xb2c, 0xb3f, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb05, 0xb30, 0xb3e, -0xb32, 0xb4d, 0x200c, 0xb2a, 0xb28, 0xb2e, 0xb4d, 0x200c, 0x20, 0xb2a, 0xb47, 0xb28, -0xb39, 0xb2a, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb15, 0xb4d, 0x200c, -0xb15, 0xb37, 0xb4d, 0xb1f, 0xb28, 0xb47, 0xb15, 0xb40, 0xb1c, 0xb3f, 0xb32, 0xb30, -0xb4d, 0xb21, 0xb3e, 0xb38, 0xb15, 0xb3e, 0xb32, 0xb3f, 0xb28, 0xb4d, 0xb38, 0xb3f, -0xb05, 0xb32, 0xb38, 0xb02, 0xb17, 0xb3e, 0xb07, 0xb38, 0xb4d, 0xb30, 0xb47, 0xb21, -0xb28, 0xb47, 0xb15, 0xb32, 0xb5f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb24, 0xb3e, 0xb38, -0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb24, 0xb3f, 0xb2e, 0xb4d, 0xb2a, 0xb41, 0xb1f, -0xb15, 0xb3f, 0xb05, 0xb1f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb5f, 0xb41, 0xb38, 0xb4d, -0x200d, 0xb1f, 0x2d, 0xb28, 0xb47, 0xb30, 0xb3e, 0xb71, 0xb3f, 0xb0f, 0xb23, 0xb4d, -0xb1f, 0xb3f, 0xb0f, 0xb28, 0xb4d, 0x200c, 0xb71, 0xb4d, 0xb32, 0xb3e, 0xb21, 0xb3f, -0xb71, 0xb37, 0xb4d, 0xb1f, 0xb4b, 0xb15, 0xb4d, 0xb5f, 0xb47, 0xb30, 0xb47, 0xb2c, -0xb3e, 0xb28, 0xb4d, 0xb06, 0xb1c, 0xb30, 0xb47, 0xb38, 0xb4d, 0xb2c, 0xb30, 0xb2e, -0xb41, 0xb21, 0xb3e, 0xb15, 0xb47, 0xb2a, 0xb4d, 0x200c, 0x20, 0xb71, 0xb30, 0xb4d, -0xb26, 0xb47, 0xb2a, 0xb30, 0xb0f, 0xb30, 0xb47, 0xb15, 0xb4d, 0xb5f, 0xb3e, 0xb2c, -0xb3f, 0xb15, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb3e, 0xb32, 0xb3f, 0xb28, 0xb0f, 0xb21, -0xb3f, 0xb32, 0xb47, 0xb21, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb3f, 0xb38, 0xb2c, 0xb28, -0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb4b, 0xb15, 0xb28, 0x20, 0xb39, 0xb3f, 0xb32, 0xb21, -0xb3e, 0xb30, 0xb4d, 0xb71, 0xb3f, 0xb28, 0xb4d, 0xb32, 0xb3f, 0xb23, 0xb4d, 0xb21, -0xb47, 0xb2e, 0xb3e, 0xb28, 0xb32, 0xb30, 0xb4d, 0x200d, 0xb21, 0x20, 0xb39, 0xb3e, -0xb71, 0xb47, 0xb2e, 0xb47, 0xb32, 0xb2c, 0xb4b, 0xb28, 0xb01, 0xb2a, 0xb30, 0xb4d, -0xb24, 0xb06, 0xb2e, 0xb37, 0xb4d, 0xb1f, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb3e, 0xb2e, -0xb4d, 0xb06, 0xb23, 0xb4d, 0xb21, 0xb30, 0xb3e, 0xb06, 0xb38, 0xb4d, 0x200d, 0xb1f, -0xb30, 0xb3e, 0xb15, 0xb3e, 0xb28, 0xb0f, 0xb24, 0xb47, 0xb28, 0xb4d, 0xb38, 0xb2c, -0xb47, 0xb32, 0xb17, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb47, 0xb2c, 0xb4d, 0xb30, 0xb3e, -0xb1f, 0xb3f, 0xb38, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb2c, 0xb4d, 0xb30, 0xb41, 0xb38, -0xb3f, 0xb32, 0xb4d, 0x200d, 0xb38, 0xb2c, 0xb41, 0xb1a, 0xb3e, 0xb30, 0xb47, 0xb38, -0xb4d, 0xb1f, 0xb2c, 0xb41, 0xb21, 0xb3e, 0xb2a, 0xb47, 0xb38, 0xb4d, 0xb1f, 0xb1a, -0xb3f, 0xb38, 0xb3f, 0xb28, 0xb3e, 0xb09, 0xb15, 0xb2a, 0xb47, 0xb28, 0xb39, 0xb3e, -0xb17, 0xb47, 0xb28, 0xb4d, 0xb06, 0xb07, 0xb32, 0xb4d, 0x20, 0xb05, 0xb2a, 0xb4d, -0x20, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0xb15, 0xb3f, 0xb30, 0xb71, 0xb2e, -0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb3e, 0xb39, 0xb47, 0xb2e, 0xb2e, 0xb28, 0xb3e, 0xb15, -0xb05, 0xb38, 0xb32, 0xb4b, 0xb2a, 0xb21, 0xb17, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb30, -0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1c, 0xb47, 0xb2c, 0xb38, 0xb3e, 0xb30, -0xb3e, 0xb1f, 0xb71, 0xb4d, 0xb38, 0xb3f, 0xb2e, 0xb2b, 0xb47, 0xb30, 0xb2a, 0xb32, -0xb4d, 0xb38, 0xb4d, 0xb15, 0xb2a, 0xb5f, 0xb47, 0xb38, 0xb2a, 0xb3f, 0xb5f, 0xb3e, -0xb38, 0xb4d, 0xb1f, 0xb15, 0xb4d, 0x20, 0xb39, 0xb2e, 0xb4d, 0x200c, 0xb1f, 0xb3e, -0xb07, 0xb30, 0xb47, 0xb28, 0xb4d, 0xb5f, 0xb41, 0xb32, 0xb5f, 0xb3e, 0xb28, 0xb71, -0xb38, 0xb4d, 0xb15, 0xb2c, 0xb3e, 0xb21, 0xb41, 0xb1c, 0xb71, 0xb3e, 0xb1f, 0xb3f, -0xb15, 0xb3e, 0xb28, 0xb4d, 0xb71, 0xb3f, 0xb0f, 0xb28, 0xb3e, 0xb71, 0xb3f, 0xb32, -0xb28, 0xb3f, 0xb09, 0xb38, 0xb4d, 0xb71, 0xb32, 0xb17, 0xb17, 0xb4d, 0xb30, 0xb3e, -0xb21, 0xb4d, 0xb16, 0xb4d, 0xb30, 0xb40, 0xb38, 0xb4d, 0x200d, 0xb1f, 0x20, 0xb2e, -0xb3e, 0xb38, 0xb15, 0xb15, 0xb38, 0xb4d, 0x200c, 0xb15, 0xb2e, 0xb30, 0xb15, 0xb47, -0xb30, 0xb17, 0xb41, 0xb32, 0xb47, 0xb28, 0xb2e, 0xb30, 0xb3f, 0xb38, 0xb38, 0xb4d, -0xb2e, 0xb3e, 0xb5f, 0xb1f, 0xb47, 0xb2c, 0xb17, 0xb47, 0xb28, 0xb4d, 0x200c, 0xb71, -0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb1a, 0xb3e, 0xb24, 0xb3e, 0xb2e, 0xb4d, 0x200c, -0xb2a, 0xb15, 0xb3e, 0xb05, 0xb2a, 0xb2a, 0xb3f, 0xb1c, 0xb3f, 0xb17, 0xb3e, 0xb32, -0xb3e, 0xb2a, 0xb3e, 0xb17, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb28, 0xb28, -0xb30, 0xb2a, 0xb15, 0xb4d, 0x200c, 0xb28, 0xb09, 0xb2e, 0xb3f, 0xb5f, 0xb2a, 0xb39, -0xb28, 0xb2a, 0xb47, 0xb07, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x200c, 0x20, 0xb2e, -0xb30, 0xb47, 0xb38, 0xb2c, 0xb3f, 0xb30, 0xb3e, 0xb30, 0xb1f, 0xb19, 0xb4d, 0xb17, -0xb3e, 0xb1f, 0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb3e, 0xb2a, 0xb41, 0xc0e, 0xc02, -0xc17, 0xc4d, 0xc35, 0xc3f, 0xc32, 0xc4d, 0xc32, 0xc3e, 0x3c, 0x65, 0x78, 0x65, -0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc05, 0xc21, -0xc46, 0xc32, 0xc48, 0xc21, 0xc4d, 0x3c, 0x2f, 0x65, 0x78, 0x65, 0x6d, 0x70, -0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc15, 0xc3e, 0xc02, 0xc1f, -0xc28, 0xc4d, 0x140a, 0x144e, 0x1426, 0x146f, 0x1472, 0x1423, 0x1401, 0x141f, 0x14aa, 0x1423, -0x1450, 0x1423, 0x1403, 0x14c4, 0x1431, 0x1420, 0x1403, 0x1473, 0x14eb, 0x1405, 0x1403, 0x141f, -0x14f4, 0x1422, 0x1473, 0x141f, 0x1489, 0x1418, 0x1423, 0x1411, 0x14c2, 0x142f, 0x1420 +0x65, 0x76, 0x61, 0x79, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, +0x61, 0x29, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, +0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x57, 0x69, 0x6e, +0x61, 0x6d, 0x61, 0x63, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, +0x61, 0x29, 0x4a, 0x61, 0x6d, 0xe0, 0x65, 0x67, 0x61, 0x4d, 0x6f, 0x6e, +0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x28, 0x4b, 0x65, 0x6e, +0x74, 0x75, 0x63, 0x6b, 0x79, 0x29, 0x4c, 0x6f, 0x73, 0x20, 0xc0, 0x6e, +0x67, 0x65, 0x6c, 0x65, 0x73, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, +0x67, 0x61, 0x53, 0x69, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, +0x4d, 0xe8, 0x73, 0x65, 0x67, 0x6f, 0x4d, 0x69, 0x63, 0x68, 0x65, 0x6c, +0x6f, 0x6e, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x28, 0x4e, 0x6f, +0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x43, 0x65, +0x6e, 0x74, 0x65, 0x72, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, +0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x61, +0x6c, 0x65, 0x6d, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61, +0x6b, 0x6f, 0x74, 0x61, 0x29, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x50, +0x72, 0xec, 0x6e, 0x73, 0x69, 0x70, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x6f, +0x20, 0x64, 0x65, 0x20, 0x53, 0x70, 0x61, 0x67, 0x6e, 0x61, 0x53, 0x61, +0x6e, 0x20, 0x50, 0x6f, 0x6c, 0x6f, 0x53, 0x2e, 0x20, 0x42, 0x61, 0x72, +0x74, 0x6f, 0x6c, 0x6f, 0x6d, 0xe8, 0x6f, 0x53, 0x2e, 0x20, 0x4a, 0x6f, +0x61, 0x6e, 0x69, 0x53, 0x2e, 0x20, 0x43, 0x72, 0x69, 0x73, 0x74, 0x6f, +0x66, 0x65, 0x72, 0x53, 0x2e, 0x20, 0x4c, 0x75, 0x73, 0xec, 0x61, 0x53, +0x2e, 0x20, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0xcc, 0x7a, +0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, +0x65, 0x41, 0x6e, 0xe0, 0x64, 0x79, 0x72, 0x41, 0x6b, 0x74, 0xe0, 0x75, +0x41, 0x7a, 0x67, 0x61, 0x62, 0x61, 0x64, 0x41, 0x74, 0x79, 0x72, 0xe0, +0x75, 0x43, 0x6f, 0x6c, 0x6f, 0x6e, 0x62, 0x6f, 0x44, 0x75, 0x62, 0xe0, +0x69, 0x44, 0x75, 0x73, 0x61, 0x6e, 0x62, 0xe9, 0x4b, 0x61, 0x74, 0x6d, +0x61, 0x6e, 0x64, 0xf9, 0x48, 0xe0, 0x6e, 0x64, 0x69, 0x67, 0x61, 0x4b, +0x72, 0x61, 0x7a, 0x6e, 0x61, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x4b, 0x75, +0x61, 0x6c, 0x61, 0x20, 0x4c, 0x75, 0x6e, 0x70, 0x75, 0x72, 0x4d, 0x61, +0x63, 0xe0, 0x6f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x69, +0x65, 0x74, 0x73, 0x6b, 0x4b, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0xe0, 0x69, +0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0xe0, 0x69, 0x5a, 0x72, 0xe9, 0x64, +0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x69, 0x6d, 0x73, 0x6b, 0x54, 0x69, 0x6e, +0x70, 0x75, 0x55, 0x6c, 0x61, 0x6e, 0x20, 0x42, 0xe0, 0x74, 0x6f, 0x72, +0x55, 0x73, 0x74, 0x2d, 0x47, 0x6e, 0x65, 0x72, 0x61, 0x59, 0x65, 0x6b, +0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4a, +0xe8, 0x72, 0x65, 0x76, 0x61, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, +0x41, 0x7a, 0x6f, 0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, +0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x43, 0x61, 0x6f, 0x20, 0x56, 0x65, +0x72, 0x64, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x46, 0xe0, 0x72, +0x6f, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x64, 0xe8, +0x69, 0x72, 0x61, 0x52, 0x65, 0x6b, 0x69, 0x61, 0x76, 0x69, 0x6b, 0x47, +0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, +0x73, 0x75, 0x64, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20, +0x45, 0x6c, 0x65, 0x6e, 0x61, 0x41, 0x64, 0x65, 0x6c, 0xe0, 0x69, 0x64, +0x65, 0x42, 0x72, 0x69, 0x7a, 0x62, 0x61, 0x6e, 0x65, 0xcc, 0x7a, 0x6f, +0x6c, 0x61, 0x20, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, +0xc0, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x42, 0x72, 0x61, +0x74, 0x69, 0x7a, 0x6c, 0x61, 0x76, 0x61, 0x4a, 0x69, 0x62, 0x69, 0x6c, +0x74, 0x65, 0x72, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, +0x20, 0x4d, 0x61, 0x6e, 0x4c, 0x75, 0x62, 0x6c, 0x69, 0x61, 0x6e, 0x61, +0x4c, 0x75, 0x73, 0x65, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4f, 0x7a, +0x6c, 0x6f, 0x50, 0x61, 0x72, 0x69, 0x6a, 0x69, 0x53, 0x69, 0x6e, 0x66, +0x65, 0x72, 0xf2, 0x70, 0x6f, 0x6c, 0x69, 0x53, 0x74, 0x6f, 0x63, 0x6f, +0x6c, 0x6d, 0x61, 0x55, 0x6c, 0x69, 0xe0, 0x6e, 0x6f, 0x73, 0x6b, 0x56, +0x61, 0x74, 0x65, 0x67, 0x61, 0x6e, 0x43, 0x69, 0x61, 0x67, 0x6f, 0x73, +0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x61, 0x64, +0x61, 0x6c, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x63, +0x6f, 0x73, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x6f, +0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x64, +0x69, 0x76, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x75, +0x72, 0x69, 0x73, 0x69, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, +0x61, 0x69, 0x6f, 0x74, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52, +0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, +0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, +0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x69, 0x61, 0x74, 0x65, 0x6d, +0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x68, 0x75, 0x75, 0x6b, 0xcc, +0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x50, 0x61, 0x73, 0x63, +0x75, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x45, 0x66, 0x61, 0x74, +0x65, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x61, 0x6b, 0x61, 0x6f, +0x66, 0x6f, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x75, 0x6e, 0x61, +0x66, 0x75, 0x74, 0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x47, 0x61, +0x6d, 0x62, 0x69, 0x65, 0x72, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x47, +0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x41, 0x74, +0x6f, 0x6c, 0x6f, 0x20, 0x43, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x41, 0x74, +0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, +0x74, 0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4b, 0x6f, 0x73, 0x72, +0x61, 0x65, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x77, 0x61, 0x6a, +0x61, 0x6c, 0x65, 0x69, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, +0x61, 0x72, 0x63, 0x68, 0x65, 0x7a, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6f, +0x20, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, +0x20, 0x4e, 0x61, 0x75, 0x72, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, +0x4e, 0x69, 0x75, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x6f, +0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x50, 0x61, 0x6c, 0xe0, 0x75, 0xcc, 0x7a, +0x6f, 0x6c, 0x61, 0x20, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, +0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x50, 0x6f, 0x6e, 0x70, 0xe8, 0x69, +0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, +0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52, 0x61, 0x72, 0x6f, 0x74, +0x6f, 0x6e, 0x67, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x61, +0x69, 0x70, 0xe0, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x61, +0x69, 0x74, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6c, 0x6f, 0x20, 0x54, 0x61, +0x72, 0x61, 0x77, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x6f, +0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x41, 0x74, 0x6f, 0x6c, 0x6f, +0x20, 0x57, 0x61, 0x6b, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x57, +0x61, 0x6c, 0x6c, 0x69, 0x73, 0x61, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, +0x65, 0x63, 0x72, 0x61, 0x61, 0x1e0d, 0x69, 0x73, 0x20, 0x61, 0x62, 0x61, +0x62, 0x61, 0x61, 0x6c, 0x6a, 0x12b, 0x79, 0x72, 0x73, 0x61, 0x73, 0x6d, +0x61, 0x72, 0x61, 0x62, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x62, 0x61, 0x6e, +0x67, 0x75, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x62, 0x69, 0x73, +0x73, 0x61, 0x75, 0x62, 0x6c, 0x61, 0x6e, 0x1e6d, 0x61, 0x65, 0x72, 0x62, +0x72, 0x61, 0x6a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x62, 0x75, 0x6a, 0x75, +0x6d, 0x62, 0x75, 0x72, 0x61, 0x6b, 0x61, 0x69, 0x72, 0x6f, 0x6b, 0x61, +0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x61, 0x73, 0x65, 0x75, 0x1e6d, +0x61, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x12b, 0x1e0d, 0x6b, 0x61, 0x72, +0x64, 0x61, 0x72, 0x20, 0x65, 0x73, 0x20, 0x73, 0x61, 0x6c, 0x61, 0x61, +0x6d, 0x64, 0x75, 0x61, 0x6c, 0x61, 0x65, 0x6c, 0x20, 0x61, 0x61, 0x69, +0x79, 0x75, 0x6e, 0x70, 0x72, 0x12b, 0x1e6d, 0x61, 0x75, 0x6e, 0x67, 0x61, +0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x72, 0x61, 0x72, 0x65, 0x6a, 0x6f, +0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x6a, 0x75, +0x62, 0x61, 0x6b, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x72, 0x1e6d, +0x6f, 0x75, 0x6d, 0x6b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x6b, 0x69, 0x6e, +0x73, 0x61, 0x73, 0x61, 0x6c, 0x61, 0x67, 0x6f, 0x73, 0x6c, 0x69, 0x62, +0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x6c, 0x75, 0x61, 0x6e, 0x1e0d, 0x61, +0x6c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x69, 0x6c, 0x75, 0x73, +0x61, 0x6b, 0x61, 0x6d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x6d, 0x61, 0x70, +0x75, 0x1e6d, 0x75, 0x6d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x62, 0x61, +0x62, 0x61, 0x6e, 0x65, 0x6d, 0x6f, 0x67, 0x61, 0x1e0d, 0x69, 0x73, 0x75, +0x6d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x6e, 0x61, 0x69, 0x72, +0x6f, 0x62, 0x69, 0x6e, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x6e, 0x69, +0x79, 0x61, 0x6d, 0x65, 0x6e, 0x75, 0x65, 0x6b, 0x73, 0x61, 0x76, 0x61, +0x67, 0x64, 0x75, 0x67, 0x75, 0x70, 0x6f, 0x72, 0x1e6d, 0x6f, 0x2d, 0x1e47, +0x6f, 0x76, 0x6f, 0x73, 0x61, 0x6f, 0x20, 0x1e6d, 0x6f, 0x6d, 0x74, 0x72, +0x69, 0x70, 0x6f, 0x6c, 0x69, 0x1e6d, 0x75, 0x6e, 0x69, 0x73, 0x76, 0x69, +0x6e, 0x64, 0x68, 0x75, 0x6b, 0x61, 0x1e0d, 0x61, 0x6b, 0x61, 0x6e, 0x6b, +0x6f, 0x72, 0x61, 0x6a, 0x65, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, +0x65, 0x6e, 0x1e6d, 0x69, 0x67, 0x75, 0x61, 0x61, 0x72, 0x61, 0x67, 0x76, +0x61, 0x69, 0x6e, 0x61, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20, +0x61, 0x69, 0x72, 0x65, 0x73, 0x6b, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, +0x6b, 0x61, 0x6b, 0x6f, 0x72, 0x1e0d, 0x61, 0x62, 0x61, 0x68, 0x75, 0x68, +0x75, 0x65, 0x6c, 0x61, 0x20, 0x72, 0x69, 0x6f, 0x6a, 0x61, 0x6d, 0x65, +0x6e, 0x1e0d, 0x6f, 0x6a, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x20, 0x67, 0x61, +0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x73, 0x61, 0x6c, 0x1e6d, 0x61, 0x73, +0x61, 0x6e, 0x20, 0x68, 0x75, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x20, 0x6c, +0x75, 0x69, 0x73, 0x1e6d, 0x75, 0x6b, 0x16b, 0x6d, 0x6e, 0x75, 0x73, 0x76, +0x61, 0x69, 0x79, 0x61, 0x61, 0x72, 0x75, 0x62, 0x61, 0x65, 0x73, 0x75, +0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x1e6d, 0x69, 0x6b, 0x6f, 0x6b, 0x65, +0x6e, 0x62, 0x61, 0x68, 0x69, 0x61, 0x62, 0x61, 0x69, 0x61, 0x20, 0x62, +0x61, 0x6e, 0x1e0d, 0x65, 0x72, 0x61, 0x73, 0x62, 0x61, 0x72, 0x62, 0x61, +0x1e0d, 0x6f, 0x73, 0x62, 0x65, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x69, +0x6a, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x2d, 0x73, 0x61, 0x62, 0x6c, 0x6f, +0x6e, 0x62, 0x6f, 0x61, 0x20, 0x76, 0x69, 0x73, 0x74, 0x61, 0x62, 0x6f, +0x67, 0x6f, 0x1e6d, 0x61, 0x62, 0x6f, 0x69, 0x73, 0x12b, 0x6b, 0x65, 0x6d, +0x62, 0x72, 0x69, 0x6a, 0x20, 0x62, 0x65, 0x6b, 0x61, 0x6d, 0x70, 0x6f, +0x20, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x65, 0x6b, 0x61, 0x6e, 0x6b, 0x75, +0x6e, 0x6b, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x73, 0x6b, 0x65, 0x79, 0x65, +0x6e, 0x6b, 0x65, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x69, 0x6b, 0x61, 0x67, +0x6f, 0x63, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x6b, 0x6f, +0x73, 0x1e6d, 0x61, 0x20, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x72, 0x65, 0x73, +0x1e6d, 0x6f, 0x6e, 0x6b, 0x75, 0x61, 0x61, 0x62, 0x61, 0x6b, 0x79, 0x75, +0x72, 0x61, 0x73, 0x6f, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, +0x61, 0x76, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73, +0x6f, 0x6e, 0x20, 0x6b, 0x72, 0x12b, 0x6b, 0x1e0d, 0x65, 0x6e, 0x76, 0x65, +0x72, 0x1e0d, 0x65, 0x1e6d, 0x72, 0x6f, 0x69, 0x1e6d, 0x1e0d, 0x6f, 0x6d, 0x69, +0x6e, 0x69, 0x6b, 0x61, 0x65, 0x1e0d, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x6e, +0x65, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x65, 0x6c, 0x20, 0x73, +0x61, 0x6c, 0x76, 0x61, 0x1e0d, 0x6f, 0x72, 0x70, 0x68, 0x6f, 0x72, 0x74, +0x20, 0x6e, 0x65, 0x6c, 0x73, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, +0x65, 0x6a, 0x61, 0x67, 0x6c, 0x61, 0x73, 0x20, 0x62, 0x61, 0x79, 0x67, +0x6f, 0x6f, 0x73, 0x20, 0x62, 0x65, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x20, +0x1e6d, 0x75, 0x72, 0x6b, 0x67, 0x72, 0x65, 0x6e, 0x61, 0x1e0d, 0x61, 0x67, +0x75, 0x61, 0x1e0d, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x67, 0x75, 0x61, +0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x67, 0x75, 0x61, 0x6a, 0x61, 0x6b, +0x69, 0x6c, 0x67, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x68, 0x65, 0x6c, 0x69, +0x70, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x69, 0x6e, +0x1e0d, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x6e, 0x6f, +0x6b, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, +0x6d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, +0x69, 0x79, 0x61, 0x6e, 0x61, 0x70, 0x69, 0x1e6d, 0x74, 0x72, 0x73, 0x62, +0x65, 0x72, 0x67, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, +0x61, 0x1e6d, 0x65, 0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20, +0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x76, 0x69, +0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, +0x6e, 0x63, 0x65, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, +0x61, 0x6e, 0x61, 0x76, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x6b, 0x2c, 0x20, +0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x16b, 0x76, +0x69, 0x6b, 0x69, 0x6b, 0x61, 0x6c, 0x75, 0x69, 0x1e6d, 0x6a, 0x61, 0x6d, +0x61, 0x69, 0x6b, 0x61, 0x6a, 0x75, 0x6e, 0x6f, 0x76, 0x6c, 0x6f, 0x75, +0x69, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x69, 0x73, +0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x6b, 0x65, 0x6e, 0x1e6d, 0x75, 0x6b, +0x12b, 0x6b, 0x72, 0x65, 0x6c, 0x65, 0x6e, 0x1e0d, 0x65, 0x69, 0x6b, 0x6c, +0x61, 0x20, 0x70, 0x61, 0x6a, 0x6c, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x6a, +0x65, 0x6c, 0x65, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x72, +0x69, 0x6e, 0x63, 0x2019, 0x73, 0x20, 0x6b, 0x75, 0x76, 0x61, 0x1e6d, 0x61, +0x72, 0x6d, 0x61, 0x73, 0x12b, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x75, +0x61, 0x6d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x6d, 0x61, 0x72, 0x69, 0x67, +0x6f, 0x1e6d, 0x6d, 0x61, 0x72, 0x1e6d, 0x69, 0x6e, 0x69, 0x6b, 0x6d, 0x61, +0x1e6d, 0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x61, 0x73, 0x61, 0x1e6d, +0x6c, 0x61, 0x6e, 0x6d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x12b, 0x6d, +0x65, 0x72, 0x69, 0x1e0d, 0x61, 0x6d, 0x65, 0x1e6d, 0x6c, 0x61, 0x6b, 0x61, +0x1e6d, 0x6c, 0x61, 0x6d, 0x65, 0x6b, 0x73, 0x69, 0x63, 0x6f, 0x20, 0x73, +0x69, 0x1e6d, 0x79, 0x6d, 0x69, 0x6b, 0x76, 0x69, 0x6c, 0xf5, 0x6d, 0x6f, +0x6e, 0x6b, 0x1e6d, 0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x72, 0x72, +0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x76, 0x69, 0x64, 0x69, 0x6f, 0x6d, +0x6f, 0x6e, 0x1e6d, 0x73, 0x65, 0x72, 0x72, 0x65, 0x1e6d, 0x6e, 0x61, 0x73, +0x61, 0x75, 0x6e, 0x69, 0x79, 0x75, 0x20, 0x79, 0x6f, 0x72, 0x6b, 0x6e, +0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x79, 0x75, 0x6c, 0x61, +0x2c, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, +0x1e6d, 0x61, 0x6d, 0x61, 0x1e0d, 0x69, 0x6e, 0x12b, 0x20, 0x75, 0x74, 0x74, +0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x65, 0x75, +0x20, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x75, 0x74, 0x74, 0x61, +0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x16b, 0x6b, 0x6f, +0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x61, +0x70, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x70, 0x69, +0x6e, 0x69, 0x6b, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, +0x70, 0x72, 0x69, 0x6e, 0x73, 0x65, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x61, +0x70, 0x20, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x1e6d, 0x70, +0x20, 0x76, 0x65, 0x6c, 0x68, 0x6f, 0x70, 0x75, 0x65, 0x72, 0x74, 0x6f, +0x20, 0x72, 0x69, 0x6b, 0x6f, 0x70, 0x75, 0x1e47, 0x1e6d, 0x61, 0x20, 0x65, +0x72, 0x65, 0x6e, 0x61, 0x73, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x20, +0x69, 0x6e, 0x6c, 0x65, 0x64, 0x1e6d, 0x72, 0x65, 0x73, 0x69, 0x70, 0x69, +0x72, 0x65, 0x6a, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x6a, 0x61, 0x6c, 0x79, +0x75, 0x1e6d, 0x72, 0x69, 0x6f, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x6b, 0x6f, +0x73, 0x61, 0x74, 0x61, 0x72, 0x69, 0x73, 0x61, 0x6e, 0x1e6d, 0x69, 0x61, +0x67, 0x6f, 0x73, 0x65, 0x6e, 0x74, 0x6f, 0x20, 0x1e0d, 0x6f, 0x6d, 0x69, +0x6e, 0x67, 0x6f, 0x73, 0x61, 0x6f, 0x20, 0x70, 0x61, 0x75, 0x6c, 0x6f, +0x69, 0x1e6d, 0x6f, 0x6b, 0x6f, 0x1e6d, 0x6f, 0x72, 0x6d, 0x69, 0x1e6d, 0x73, +0x69, 0x74, 0x6b, 0x61, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x62, 0x61, 0x72, +0x74, 0x65, 0x6c, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x6a, +0x6f, 0x6e, 0x73, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x69, 0x1e6d, 0x1e6d, +0x73, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x75, 0x73, 0x69, 0x61, 0x73, +0x65, 0x6e, 0x1e6d, 0x20, 0x74, 0x6f, 0x6d, 0x61, 0x73, 0x73, 0x65, 0x6e, +0x1e6d, 0x20, 0x76, 0x69, 0x6e, 0x73, 0x65, 0x6e, 0x1e6d, 0x73, 0x76, 0x69, +0x70, 0x1e6d, 0x20, 0x6b, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x1e6d, 0x74, 0x65, +0x67, 0x75, 0x74, 0x75, 0x6c, 0x65, 0x74, 0x69, 0x68, 0x76, 0x61, 0x6e, +0x61, 0x1e6d, 0x6f, 0x72, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x1e6d, 0x6f, 0x72, 0x1e6d, +0x6f, 0x6c, 0x61, 0x76, 0x61, 0x6e, 0x6b, 0x16b, 0x76, 0x65, 0x72, 0x76, +0x68, 0x61, 0x69, 0x1e6d, 0x68, 0x6f, 0x72, 0x73, 0x76, 0x69, 0x6e, 0x6e, +0x69, 0x70, 0x65, 0x67, 0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x61, 0x1e6d, 0x6b, +0x65, 0x73, 0x65, 0x65, 0x1e0d, 0x65, 0x76, 0x69, 0x73, 0x1e0d, 0x79, 0x75, +0x6d, 0x6f, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x20, 0x75, 0x72, 0x76, 0x69, +0x6c, 0x6c, 0x6d, 0x65, 0x6b, 0x76, 0x61, 0x72, 0x69, 0x6d, 0x61, 0x76, +0x73, 0x6f, 0x6e, 0x6d, 0x65, 0x6b, 0x20, 0x6d, 0x75, 0x72, 0x1e0d, 0x6f, +0x70, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0x72, 0x6f, 0x74, 0x65, 0x72, 0x61, +0x73, 0x79, 0x6f, 0x76, 0x61, 0x1e6d, 0x72, 0x6f, 0x6c, 0x6c, 0x76, 0x6f, +0x73, 0x1e6d, 0x6f, 0x6b, 0x6c, 0x6e, 0x67, 0x79, 0x61, 0x72, 0x62, 0x79, +0x65, 0x6e, 0x65, 0x1e0d, 0x65, 0x6e, 0x61, 0x6c, 0x6d, 0x61, 0x1e6d, 0x79, +0x61, 0x6d, 0x6d, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x1e0d, 0x69, 0x72, 0x61, +0x6b, 0x74, 0x61, 0x75, 0x61, 0x61, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x61, +0x73, 0x67, 0x61, 0x62, 0x61, 0x1e6d, 0x61, 0x74, 0x61, 0x72, 0x61, 0x75, +0x62, 0x61, 0x67, 0x64, 0x61, 0x64, 0x62, 0x61, 0x68, 0x72, 0x61, 0x69, +0x6e, 0x62, 0x61, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, +0x62, 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x62, 0x65, 0x69, 0x72, 0x75, +0x74, 0x62, 0x69, 0x73, 0x6b, 0x65, 0x6b, 0x62, 0x72, 0x75, 0x6e, 0x65, +0x69, 0x63, 0x69, 0x74, 0x61, 0x6b, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, +0x1e0d, 0x61, 0x6d, 0x61, 0x73, 0x6b, 0x75, 0x73, 0x1e0d, 0x69, 0x6c, 0x69, +0x64, 0x75, 0x62, 0x61, 0x69, 0x64, 0x75, 0x73, 0x61, 0x6d, 0x62, 0x65, +0x70, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x67, 0x61, 0x6a, +0x61, 0x68, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x68, 0x6f, 0x20, 0x63, 0x69, +0x20, 0x6d, 0x69, 0x6e, 0x68, 0x20, 0x73, 0x69, 0x74, 0x69, 0x68, 0x6f, +0x6e, 0x67, 0x20, 0x6b, 0x6f, 0x6e, 0x67, 0x69, 0x72, 0x6b, 0x75, 0x1e6d, +0x73, 0x6b, 0x6a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x6a, 0x65, +0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x6b, 0x61, 0x62, 0x75, 0x6c, +0x6b, 0x61, 0x6d, 0x63, 0x61, 0x1e6d, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x61, +0x63, 0x12b, 0x6b, 0x61, 0x1e6d, 0x6d, 0x61, 0x6e, 0x1e0d, 0x75, 0x6b, 0x61, +0x6e, 0x64, 0x69, 0x67, 0x61, 0x6b, 0x6f, 0x6c, 0x6b, 0x61, 0x74, 0x61, +0x6b, 0x72, 0x61, 0x73, 0x6e, 0x65, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x6b, +0x75, 0x61, 0x6c, 0x61, 0x20, 0x6c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x6b, +0x75, 0x63, 0x69, 0x6e, 0x67, 0x6b, 0x75, 0x76, 0x61, 0x69, 0x74, 0x6d, +0x6b, 0x61, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, +0x6b, 0x61, 0x73, 0x61, 0x72, 0x6d, 0x61, 0x6e, 0x12b, 0x6c, 0x61, 0x6d, +0x61, 0x73, 0x6b, 0x61, 0x74, 0x6e, 0x69, 0x6b, 0x6f, 0x73, 0x69, 0x79, +0x61, 0x6e, 0x65, 0x76, 0x6f, 0x6b, 0x75, 0x6a, 0x6e, 0x65, 0x1e6d, 0x73, +0x6b, 0x6e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, +0x70, 0x6e, 0x6f, 0x6d, 0x20, 0x70, 0x65, 0x6e, 0x68, 0x70, 0x6f, 0x6e, +0x1e6d, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x70, 0x79, 0x6f, 0x6e, 0x67, 0x79, +0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x73, 0x1e6d, 0x61, 0x6e, 0x65, 0x6b, 0x69, +0x6a, 0x75, 0x6f, 0x72, 0x64, 0x61, 0x72, 0x69, 0x79, 0x61, 0x64, 0x73, +0x61, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x6b, +0x61, 0x6e, 0x64, 0x73, 0x65, 0x6f, 0x6c, 0x73, 0x65, 0x6e, 0x67, 0x61, +0x69, 0x73, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x73, 0x72, 0x65, +0x1e0d, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x74, 0x61, +0x69, 0x70, 0x65, 0x69, 0x74, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x1e6d, 0x74, +0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x74, 0x65, 0x68, 0x72, 0x61, 0x6e, +0x74, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x1e6d, 0x6f, 0x6b, 0x79, 0x6f, 0x1e6d, +0x6f, 0x6d, 0x73, 0x6b, 0x75, 0x6c, 0x61, 0x6e, 0x62, 0x61, 0x1e6d, 0x61, +0x72, 0x75, 0x72, 0x75, 0x6d, 0x63, 0x69, 0x79, 0x75, 0x73, 0x74, 0x2d, +0x6e, 0x65, 0x72, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x1e6d, 0x69, 0x61, 0x61, +0x6e, 0x76, 0x6c, 0x61, 0x1e0d, 0x69, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f, 0x6b, +0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x73, 0x6b, 0x79, 0x61, 0x6e, 0x67, 0x6f, +0x6e, 0x79, 0x69, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, +0x72, 0x67, 0x79, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x61, 0x6a, 0x6f, +0x72, 0x65, 0x73, 0x62, 0x65, 0x72, 0x6d, 0x16b, 0x64, 0x61, 0x6b, 0x65, +0x6e, 0x65, 0x72, 0x69, 0x6b, 0x65, 0x70, 0x20, 0x76, 0x65, 0x72, 0x1e0d, +0x65, 0x70, 0x65, 0x72, 0x6f, 0x6d, 0x61, 0x1e0d, 0x69, 0x65, 0x72, 0x61, +0x72, 0x65, 0x79, 0x6b, 0x79, 0x61, 0x76, 0x69, 0x6b, 0x64, 0x6b, 0x69, +0x1e47, 0x20, 0x6a, 0x6f, 0x72, 0x6a, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x74, +0x20, 0x68, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x73, 0x1e6d, 0x61, 0x6e, 0x6c, +0x69, 0x61, 0x65, 0x64, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x62, 0x72, 0x69, +0x73, 0x62, 0x61, 0x6e, 0x65, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, +0x68, 0x69, 0x6c, 0x6c, 0x1e0d, 0x61, 0x72, 0x76, 0x69, 0x6e, 0x79, 0x75, +0x6b, 0x6c, 0x61, 0x68, 0x6f, 0x62, 0x61, 0x72, 0x1e6d, 0x6c, 0x69, 0x6e, +0x1e0d, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x6c, 0x6f, 0x72, 0x1e0d, 0x20, 0x68, +0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6c, 0x62, 0x6f, 0x72, 0x6e, 0x65, 0x70, +0x65, 0x72, 0x74, 0x73, 0x79, 0x1e0d, 0x6e, 0x12b, 0x61, 0x6d, 0x73, 0x1e6d, +0x65, 0x72, 0x1e0d, 0x61, 0x6d, 0x61, 0x61, 0x1e47, 0x1e0d, 0x6f, 0x72, 0x61, +0x61, 0x61, 0x73, 0x1e6d, 0x72, 0x61, 0x68, 0x61, 0x6e, 0x65, 0x74, 0x65, +0x6e, 0x73, 0x62, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x1e0d, 0x65, 0x62, 0x65, +0x72, 0x6c, 0x69, 0x6e, 0x62, 0x72, 0x61, 0x1e6d, 0x69, 0x73, 0x6c, 0x61, +0x76, 0x61, 0x62, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x62, 0x75, +0x6b, 0x61, 0x72, 0x65, 0x73, 0x74, 0x62, 0x75, 0x1e0d, 0x61, 0x70, 0x65, +0x73, 0x74, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x6b, 0x69, +0x73, 0x69, 0x6e, 0x61, 0x75, 0x6b, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, +0x67, 0x65, 0x6e, 0x1e0d, 0x62, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x62, 0x72, +0x61, 0x6c, 0x1e6d, 0x61, 0x72, 0x67, 0x65, 0x72, 0x6e, 0x73, 0x69, 0x68, +0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x61, 0x61, 0x69, 0x6c, 0x20, +0x61, 0x70, 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x62, +0x75, 0x6c, 0x6a, 0x65, 0x72, 0x73, 0x69, 0x6b, 0x61, 0x6c, 0x69, 0x6e, +0x69, 0x6e, 0x67, 0x72, 0x61, 0x1e0d, 0x6b, 0x69, 0x72, 0x6f, 0x76, 0x6b, +0x69, 0x79, 0x76, 0x6c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x6c, 0x79, 0x75, +0x62, 0x6c, 0x79, 0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x1e0d, 0x6e, 0x6c, 0x6b, +0x73, 0x65, 0x6d, 0x62, 0x72, 0x67, 0x6d, 0x65, 0x1e0d, 0x72, 0x69, 0x1e0d, +0x6d, 0x61, 0x6c, 0x1e6d, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, +0x6d, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x6d, 0x6f, 0x6e, 0x61, 0x6b, 0x6f, +0x6d, 0x6f, 0x73, 0x6b, 0x6f, 0x6f, 0x73, 0x6c, 0x6f, 0x70, 0x61, 0x72, +0x69, 0x73, 0x70, 0x1e0d, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x73, 0x61, 0x70, +0x72, 0x61, 0x67, 0x72, 0x69, 0x67, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x72, +0x61, 0x73, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x73, +0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, 0x6f, 0x73, 0x61, 0x72, 0x61, 0x1e6d, +0x6f, 0x76, 0x73, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, +0x73, 0x6b, 0x6f, 0x70, 0x69, 0x73, 0x6f, 0x70, 0x69, 0x79, 0x61, 0x73, +0x1e6d, 0x6f, 0x6b, 0x68, 0x6f, 0x6d, 0x74, 0x61, 0x6c, 0x69, 0x6e, 0x1e6d, +0x69, 0x72, 0x61, 0x6e, 0x65, 0x75, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, +0x73, 0x6b, 0x76, 0x61, 0x1e0d, 0x75, 0x6a, 0x76, 0x61, 0x1e6d, 0x69, 0x6b, +0x61, 0x6e, 0x76, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x6c, 0x6e, +0x69, 0x75, 0x73, 0x76, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x1e0d, +0x76, 0x61, 0x72, 0x73, 0x61, 0x74, 0x65, 0x67, 0x75, 0x73, 0x69, 0x67, +0x61, 0x6c, 0x70, 0x61, 0x6a, 0x75, 0x72, 0x69, 0x63, 0x1e6d, 0x61, 0x6e, +0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x63, 0x68, 0x61, 0x67, 0x6f, 0x73, +0x6b, 0x72, 0x69, 0x73, 0x1e6d, 0x6d, 0x61, 0x73, 0x6b, 0x6f, 0x6b, 0x6f, +0x73, 0x6b, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x67, 0x75, +0x65, 0x6c, 0x65, 0x6e, 0x6d, 0x61, 0x68, 0x65, 0x6d, 0x61, 0x6c, 0x64, +0x69, 0x76, 0x65, 0x73, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x73, 0x69, 0x75, +0x73, 0x6d, 0x61, 0x79, 0x6f, 0x1e6d, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x6f, +0x6e, 0x61, 0x70, 0x69, 0x61, 0x101, 0x6b, 0x6c, 0x61, 0x6e, 0x1e0d, 0x62, +0x6f, 0x75, 0x67, 0x61, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x63, 0x65, 0x1e6d, +0x61, 0x6d, 0x63, 0x16b, 0x6b, 0x12b, 0x73, 0x74, 0x65, 0x72, 0x69, 0x70, +0x65, 0x1e6d, 0x65, 0x70, 0x61, 0x6b, 0x61, 0x6f, 0x70, 0x6f, 0x70, 0x69, +0x6a, 0x69, 0x70, 0x75, 0x6e, 0x61, 0x70, 0x75, 0x74, 0x69, 0x67, 0x61, +0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x67, 0x61, 0x6d, 0x62, 0x69, +0x65, 0x72, 0x67, 0x75, 0x61, 0x1e0d, 0x61, 0x6c, 0x6b, 0x65, 0x6e, 0x61, +0x6c, 0x6b, 0x61, 0x6e, 0x1e6d, 0x6f, 0x6e, 0x6b, 0x69, 0x72, 0x69, 0x74, +0x69, 0x6d, 0x61, 0x74, 0x69, 0x6b, 0x69, 0x73, 0x72, 0x61, 0x65, 0x6b, +0x76, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x6d, 0x61, 0x6a, 0x75, +0x72, 0x6f, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x73, 0x61, 0x73, 0x6d, 0x69, +0x1e0d, 0x76, 0x61, 0x79, 0x6e, 0x61, 0x75, 0x72, 0x75, 0x6e, 0x69, 0x75, +0x65, 0x6e, 0x6f, 0x72, 0x70, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x69, 0x65, +0x70, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x70, +0x61, 0x6c, 0x61, 0x75, 0x70, 0x69, 0x1e6d, 0x6b, 0x65, 0x72, 0x6e, 0x70, +0x6f, 0x6e, 0x70, 0x65, 0x69, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x6d, 0x6f, +0x72, 0x65, 0x73, 0x62, 0x69, 0x72, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, +0x67, 0x61, 0x73, 0x61, 0x69, 0x70, 0x61, 0x6e, 0x1e6d, 0x61, 0x68, 0x69, +0x1e6d, 0x69, 0x74, 0x61, 0x72, 0x61, 0x76, 0x61, 0x1e6d, 0x6f, 0x6e, 0x67, +0x61, 0x1e6d, 0x61, 0x70, 0x75, 0x76, 0x65, 0x6b, 0x76, 0x61, 0x6c, 0x6c, +0x69, 0x73, 0x92c, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x91c, 0x941, 0x932, 0x92a, +0x93c, 0x94d, 0x930, 0x940, 0x91f, 0x93e, 0x909, 0x928, 0x915, 0x93e, 0x930, 0x94d, +0x924, 0x941, 0x92e, 0x915, 0x93f, 0x902, 0x938, 0x93e, 0x938, 0x93e, 0x932, 0x941, +0x92c, 0x941, 0x92e, 0x92c, 0x93e, 0x938, 0x940, 0x92e, 0x94d, 0x2d, 0x92c, 0x93e, +0x92c, 0x93e, 0x928, 0x947, 0x92e, 0x94b, 0x917, 0x93e, 0x926, 0x93f, 0x938, 0x941, +0x928, 0x93e, 0x907, 0x930, 0x94b, 0x92c, 0x93f, 0x928, 0x941, 0x906, 0x915, 0x91a, +0x949, 0x91f, 0x938, 0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x939, 0x94d, 0x935, 0x93e, +0x928, 0x938, 0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x932, 0x942, 0x924, 0x93f, 0x909, +0x938, 0x941, 0x906, 0x907, 0x92f, 0x93e, 0x90f, 0x938, 0x928, 0x938, 0x93f, 0x92f, +0x949, 0x928, 0x92c, 0x94d, 0x932, 0x93e, 0x902, 0x2d, 0x938, 0x947, 0x92c, 0x932, +0x94b, 0x928, 0x915, 0x947, 0x92e, 0x94d, 0x92c, 0x94d, 0x930, 0x93f, 0x91c, 0x20, +0x92c, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x92e, 0x94d, 0x92a, 0x94b, 0x20, 0x917, +0x94d, 0x930, 0x93e, 0x902, 0x921, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x915, +0x941, 0x928, 0x938, 0x93f, 0x915, 0x93e, 0x917, 0x94b, 0x921, 0x947, 0x928, 0x92e, +0x93e, 0x930, 0x94d, 0x915, 0x938, 0x949, 0x928, 0x924, 0x93f, 0x930, 0x941, 0x928, +0x947, 0x92a, 0x947, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x928, 0x947, +0x932, 0x94d, 0x938, 0x928, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x93e, 0x932, +0x947, 0x91c, 0x93c, 0x93e, 0x939, 0x947, 0x932, 0x93f, 0x92a, 0x947, 0x915, 0x94d, +0x938, 0x907, 0x915, 0x93e, 0x932, 0x941, 0x924, 0x93f, 0x91f, 0x915, 0x94d, 0x930, +0x93e, 0x932, 0x947, 0x928, 0x94d, 0x921, 0x93f, 0x91c, 0x93f, 0x915, 0x92e, 0x928, +0x94b, 0x938, 0x92e, 0x947, 0x930, 0x93f, 0x917, 0x94b, 0x91f, 0x92c, 0x94d, 0x92f, +0x942, 0x932, 0x93e, 0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949, 0x20, 0x921, +0x915, 0x94b, 0x91f, 0x93e, 0x92e, 0x93e, 0x926, 0x93f, 0x928, 0x940, 0x20, 0x909, +0x924, 0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x928, 0x94d, +0x92f, 0x942, 0x20, 0x938, 0x93e, 0x932, 0x947, 0x92e, 0x2c, 0x20, 0x909, 0x924, +0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x913, 0x915, 0x93e, +0x91c, 0x940, 0x928, 0x93e, 0x917, 0x93e, 0x92a, 0x93c, 0x940, 0x928, 0x93f, 0x915, +0x94d, 0x938, 0x92a, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x911, 0x92a, 0x93c, 0x20, +0x938, 0x94d, 0x92a, 0x947, 0x928, 0x930, 0x947, 0x938, 0x93e, 0x907, 0x92a, 0x93c, +0x938, 0x947, 0x928, 0x94d, 0x91f, 0x93e, 0x930, 0x947, 0x92e, 0x938, 0x947, 0x902, +0x924, 0x93f, 0x906, 0x917, 0x94b, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x92c, 0x93e, +0x930, 0x94d, 0x924, 0x947, 0x932, 0x947, 0x92e, 0x93f, 0x938, 0x947, 0x902, 0x91f, +0x20, 0x924, 0x949, 0x92e, 0x938, 0x938, 0x94d, 0x935, 0x93f, 0x92a, 0x93c, 0x94d, +0x91f, 0x20, 0x915, 0x930, 0x902, 0x91f, 0x935, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, +0x915, 0x942, 0x935, 0x930, 0x92e, 0x94d, 0x92f, 0x93e, 0x915, 0x92e, 0x941, 0x930, +0x94d, 0x921, 0x94b, 0x932, 0x949, 0x928, 0x94d, 0x917, 0x92f, 0x930, 0x92c, 0x94d, +0x92f, 0x947, 0x928, 0x905, 0x938, 0x94d, 0x917, 0x93e, 0x92c, 0x93e, 0x924, 0x92c, +0x94d, 0x92f, 0x93e, 0x902, 0x917, 0x915, 0x949, 0x915, 0x92c, 0x93f, 0x938, 0x94d, +0x915, 0x947, 0x915, 0x92c, 0x94d, 0x930, 0x942, 0x928, 0x947, 0x924, 0x93f, 0x924, +0x94d, 0x938, 0x93f, 0x924, 0x93e, 0x926, 0x941, 0x92c, 0x924, 0x93f, 0x926, 0x941, +0x938, 0x93e, 0x902, 0x92c, 0x947, 0x92a, 0x93c, 0x93e, 0x92e, 0x93e, 0x917, 0x941, +0x938, 0x94d, 0x924, 0x93e, 0x92f, 0x947, 0x930, 0x941, 0x938, 0x932, 0x947, 0x92e, +0x915, 0x93e, 0x921, 0x93f, 0x902, 0x917, 0x93e, 0x92a, 0x928, 0x949, 0x92e, 0x20, +0x92a, 0x947, 0x928, 0x94d, 0x939, 0x915, 0x93f, 0x91c, 0x93f, 0x932, 0x949, 0x930, +0x94d, 0x921, 0x93e, 0x938, 0x93e, 0x915, 0x93e, 0x932, 0x93f, 0x928, 0x938, 0x902, +0x918, 0x93e, 0x924, 0x93f, 0x924, 0x93e, 0x924, 0x93f, 0x92a, 0x947, 0x924, 0x93f, +0x924, 0x93e, 0x938, 0x915, 0x902, 0x924, 0x91f, 0x94d, 0x2d, 0x92c, 0x93f, 0x932, +0x93f, 0x938, 0x93f, 0x92f, 0x93e, 0x902, 0x917, 0x949, 0x928, 0x915, 0x94d, 0x92f, +0x93e, 0x928, 0x947, 0x930, 0x940, 0x92a, 0x94d, 0x92f, 0x93e, 0x930, 0x94b, 0x926, +0x93e, 0x945, 0x915, 0x93f, 0x923, 0x93e, 0x945, 0x20, 0x91c, 0x93e, 0x945, 0x930, +0x94d, 0x91c, 0x93f, 0x92f, 0x93e, 0x938, 0x94d, 0x91f, 0x94d, 0x92f, 0x93e, 0x928, +0x932, 0x940, 0x906, 0x938, 0x94d, 0x91f, 0x94d, 0x930, 0x93e, 0x915, 0x93e, 0x928, +0x90f, 0x924, 0x947, 0x928, 0x94d, 0x938, 0x906, 0x907, 0x932, 0x20, 0x911, 0x92a, +0x94d, 0x20, 0x92e, 0x94d, 0x92f, 0x93e, 0x928, 0x938, 0x93f, 0x92e, 0x94d, 0x92a, +0x93c, 0x947, 0x930, 0x94b, 0x92a, 0x94b, 0x932, 0x938, 0x94d, 0x915, 0x94b, 0x92a, +0x94d, 0x92f, 0x947, 0x938, 0x94b, 0x92a, 0x93c, 0x93f, 0x92f, 0x93e, 0x91c, 0x93c, +0x94d, 0x92f, 0x942, 0x930, 0x93f, 0x915, 0x93c, 0x92e, 0x949, 0x930, 0x940, 0x938, +0x938, 0x911, 0x915, 0x932, 0x947, 0x902, 0x921, 0x91a, 0x94d, 0x92f, 0x93e, 0x925, +0x92e, 0x924, 0x93f, 0x938, 0x94d, 0x91f, 0x930, 0x90f, 0x92a, 0x93c, 0x947, 0x91f, +0x92a, 0x93c, 0x93e, 0x915, 0x93e, 0x913, 0x92a, 0x93c, 0x94b, 0x92a, 0x93c, 0x93f, +0x91c, 0x940, 0x92a, 0x93c, 0x94d, 0x92f, 0x942, 0x928, 0x93e, 0x92a, 0x93c, 0x941, +0x91f, 0x940, 0x917, 0x94d, 0x92f, 0x93e, 0x92e, 0x92c, 0x93f, 0x92f, 0x930, 0x915, +0x947, 0x902, 0x91f, 0x928, 0x928, 0x93e, 0x945, 0x909, 0x930, 0x941, 0x928, 0x949, +0x930, 0x92a, 0x93c, 0x949, 0x915, 0x928, 0x949, 0x92e, 0x93f, 0x92f, 0x93e, 0x92a, +0x94b, 0x928, 0x92a, 0x947, 0x924, 0x93f, 0xb0f, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb2c, +0xb4d, 0xb30, 0xb3e, 0xb1c, 0xb3e, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2c, +0xb41, 0xb1c, 0xb42, 0xb2e, 0xb4d, 0xb2c, 0xb41, 0xb30, 0xb3e, 0xb15, 0xb28, 0xb3e, +0xb15, 0xb4d, 0xb30, 0xb3f, 0xb1c, 0xb3f, 0xb2c, 0xb1f, 0xb3f, 0xb2a, 0xb4d, 0xb30, +0xb3f, 0xb1f, 0xb3e, 0xb09, 0xb28, 0xb4d, 0x200c, 0xb17, 0xb3e, 0xb2c, 0xb30, 0xb4d, +0xb23, 0xb4d, 0xb23, 0xb1c, 0xb39, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb2c, 0xb30, 0xb4d, +0xb17, 0xb15, 0xb30, 0xb1f, 0xb09, 0xb2e, 0xb4d, 0x200c, 0xb32, 0xb3e, 0xb17, 0xb38, +0xb4d, 0x200c, 0xb32, 0xb3f, 0xb2c, 0xb4d, 0xb30, 0xb47, 0xb71, 0xb3f, 0xb32, 0xb4d, +0xb32, 0xb47, 0xb32, 0xb2e, 0xb4d, 0x200c, 0xb2e, 0xb4d, 0x2d, 0xb2c, 0xb3e, 0xb2c, +0xb3e, 0xb28, 0xb47, 0xb2e, 0xb4b, 0xb17, 0xb3e, 0xb21, 0xb3f, 0xb38, 0xb41, 0xb2e, +0xb28, 0xb30, 0xb4b, 0xb2c, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07, 0xb30, 0xb2c, 0xb3f, +0xb28, 0xb41, 0xb06, 0xb15, 0xb1a, 0xb1f, 0xb05, 0xb17, 0xb3e, 0xb21, 0xb17, 0xb41, +0xb2a, 0xb30, 0xb4d, 0xb1f, 0x2d, 0xb28, 0xb71, 0xb38, 0xb3e, 0xb05, 0x20, 0xb1f, +0xb2e, 0xb47, 0xb24, 0xb4d, 0xb30, 0xb3f, 0xb2a, 0xb32, 0xb3f, 0xb71, 0xb3f, 0xb23, +0xb4d, 0xb21, 0xb39, 0xb15, 0xb4d, 0xb2c, 0xb41, 0xb0f, 0xb28, 0xb38, 0xb4d, 0x20, +0xb06, 0xb07, 0xb30, 0xb47, 0xb38, 0xb4d, 0xb15, 0xb3e, 0xb3c, 0xb1f, 0xb3e, 0xb2e, +0xb3e, 0xb15, 0xb3e, 0xb01, 0xb15, 0xb4b, 0xb21, 0xb4b, 0xb2c, 0xb3e, 0xb1c, 0xb41, +0xb1c, 0xb4b, 0xb0f, 0xb32, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb4d, 0xb05, 0xb1c, 0xb3e, +0xb2e, 0xb47, 0xb23, 0xb4d, 0xb21, 0xb1c, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb4b, 0x20, +0xb17, 0xb3e, 0xb32, 0xb47, 0xb17, 0xb4b, 0xb38, 0xb38, 0xb3e, 0xb32, 0xb4d, 0xb1f, +0xb3e, 0xb38, 0xb3e, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0x20, 0xb71, 0xb3e, 0xb28, 0xb4d, +0xb38, 0xb5f, 0xb3e, 0xb28, 0x20, 0xb32, 0xb41, 0xb07, 0xb38, 0xb1f, 0xb4b, 0xb15, +0xb41, 0xb2e, 0xb28, 0xb09, 0xb38, 0xb41, 0xb06, 0xb07, 0xb5f, 0xb3e, 0xb05, 0xb30, +0xb41, 0xb2c, 0xb3e, 0xb2c, 0xb3e, 0xb30, 0xb2c, 0xb3e, 0xb21, 0xb38, 0xb2c, 0xb4d, +0xb32, 0xb3e, 0xb19, 0xb4d, 0xb15, 0x2d, 0xb38, 0xb3e, 0xb2c, 0xb32, 0xb28, 0xb4d, +0xb2c, 0xb4b, 0xb06, 0x20, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb2c, 0xb17, +0xb1f, 0xb3e, 0xb2c, 0xb07, 0xb38, 0xb47, 0xb15, 0xb3e, 0xb2e, 0xb4d, 0xb2a, 0x20, +0xb17, 0xb4d, 0xb30, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb47, 0xb38, 0xb3f, 0xb15, 0xb3e, +0xb17, 0xb15, 0xb37, 0xb4d, 0xb1f, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb15, +0xb4d, 0xb30, 0xb47, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb28, 0xb21, 0xb47, 0xb28, 0xb71, +0xb3f, 0xb30, 0xb4d, 0xb21, 0xb47, 0xb1f, 0xb4d, 0xb30, 0xb07, 0xb1f, 0xb4d, 0xb21, +0xb2e, 0xb3f, 0xb28, 0xb3f, 0xb15, 0xb3e, 0xb0f, 0xb21, 0xb4d, 0x200d, 0xb2e, 0xb28, +0xb1f, 0xb28, 0xb4d, 0xb0f, 0xb32, 0xb4d, 0x20, 0xb38, 0xb3e, 0xb32, 0xb71, 0xb3e, +0xb21, 0xb4b, 0xb30, 0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0x20, 0xb28, 0xb47, 0xb32, +0xb38, 0xb28, 0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb32, 0xb47, 0xb1c, 0xb3e, 0xb17, +0xb41, 0xb06, 0xb21, 0xb47, 0xb32, 0xb09, 0xb2a, 0xb47, 0xb17, 0xb41, 0xb06, 0xb24, +0xb47, 0xb2e, 0xb3e, 0xb32, 0xb3e, 0xb39, 0xb3e, 0xb71, 0xb28, 0xb3e, 0xb39, 0xb47, +0xb30, 0xb2e, 0xb38, 0xb3f, 0xb32, 0xb4b, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, +0xb28, 0xb3e, 0xb2a, 0xb32, 0xb3f, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb30, 0xb47, 0xb28, +0xb17, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb71, +0xb47, 0xb71, 0xb3e, 0xb5f, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, +0xb28, 0xb3e, 0xb07, 0xb28, 0xb41, 0xb71, 0xb3f, 0xb15, 0xb4d, 0xb32, 0xb09, 0xb07, +0xb38, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb3f, +0xb38, 0xb47, 0xb32, 0x2c, 0x20, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb09, 0xb15, +0xb3f, 0xb15, 0xb47, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb32, 0xb47, 0xb23, 0xb4d, 0xb21, +0xb3f, 0xb1c, 0xb3f, 0xb15, 0xb2e, 0xb3e, 0xb38, 0xb3f, 0xb05, 0xb2e, 0xb3e, 0xb30, +0xb3f, 0xb17, 0xb1f, 0xb4d, 0xb2e, 0xb3e, 0xb1f, 0xb3e, 0xb2e, 0xb30, 0xb38, 0xb4d, +0xb2e, 0xb3e, 0xb1c, 0xb3e, 0xb1f, 0xb32, 0xb3e, 0xb28, 0xb4d, 0xb2e, 0xb3f, 0xb15, +0xb4d, 0xb35, 0xb47, 0xb32, 0xb28, 0xb4d, 0xb2e, 0xb3e, 0xb28, 0xb15, 0xb1f, 0xb28, +0xb4d, 0xb2e, 0xb28, 0xb1f, 0xb47, 0xb30, 0xb3f, 0xb0f, 0xb2e, 0xb23, 0xb4d, 0xb1f, +0xb47, 0xb2d, 0xb3f, 0xb21, 0xb3f, 0xb05, 0xb2e, 0xb28, 0xb1f, 0xb38, 0xb47, 0xb30, +0xb30, 0xb3e, 0xb1f, 0xb4d, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20, 0xb5f, 0xb30, 0xb4d, +0xb15, 0xb4d, 0xb28, 0xb30, 0xb39, 0xb4d, 0xb28, 0xb2c, 0xb47, 0xb09, 0xb32, 0xb3e, +0xb39, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, +0xb1f, 0xb3e, 0xb15, 0xb47, 0xb28, 0xb4d, 0xb26, 0xb4d, 0xb30, 0x2c, 0x20, 0xb09, +0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb28, 0xb4d, +0xb5f, 0xb41, 0x20, 0xb38, 0xb3e, 0xb32, 0xb47, 0xb2e, 0xb4d, 0x2c, 0x20, 0xb09, +0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb05, 0xb1c, +0xb3f, 0xb28, 0xb3e, 0xb17, 0xb3e, 0xb2a, 0xb07, 0xb28, 0xb3f, 0xb15, 0xb4d, 0xb38, +0xb2a, 0xb30, 0xb4d, 0xb1f, 0x2d, 0xb0f, 0xb5f, 0xb41, 0x2d, 0xb2a, 0xb4d, 0xb30, +0xb3f, 0xb28, 0xb4d, 0x200d, 0xb38, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb05, +0xb2b, 0xb4d, 0x20, 0xb38, 0xb4d, 0xb2a, 0xb47, 0xb28, 0xb4d, 0xb2a, 0xb41, 0xb0f, +0xb30, 0xb4d, 0xb24, 0x20, 0xb30, 0xb3f, 0xb15, 0xb30, 0xb47, 0xb38, 0xb3f, 0xb2a, +0xb3f, 0xb30, 0xb3f, 0xb5f, 0x20, 0xb2c, 0xb4d, 0xb30, 0xb3e, 0xb19, 0xb4d, 0xb15, +0xb38, 0xb3e, 0xb28, 0xb4d, 0xb24, 0xb30, 0xb47, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb23, +0xb4d, 0xb1f, 0x20, 0xb21, 0xb2e, 0xb3f, 0xb19, 0xb4d, 0xb17, 0xb07, 0xb1f, 0xb4d, +0xb1f, 0xb15, 0xb4d, 0xb35, 0xb30, 0xb1f, 0xb30, 0xb2e, 0xb3f, 0xb1f, 0xb4d, 0xb38, +0xb47, 0xb23, 0xb4d, 0xb1f, 0x20, 0xb2c, 0xb3e, 0xb30, 0xb4d, 0xb24, 0xb47, 0xb32, +0xb47, 0xb2e, 0xb3f, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb15, 0xb3f, +0xb1f, 0xb4d, 0x200d, 0xb38, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20, +0xb25, 0xb2e, 0xb3e, 0xb38, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, +0x20, 0xb71, 0xb3f, 0xb28, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0xb24, 0xb41, +0xb32, 0xb47, 0xb1f, 0xb30, 0xb23, 0xb4d, 0xb1f, 0xb1f, 0xb30, 0xb1f, 0xb32, 0xb3e, +0xb71, 0xb3e, 0xb19, 0xb4d, 0xb15, 0xb41, 0xb71, 0xb30, 0xb4d, 0xb15, 0xb47, 0xb38, +0xb3f, 0xb21, 0xb47, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb21, 0xb4d, 0xb5f, 0xb41, 0xb2e, +0xb3e, 0xb23, 0xb4d, 0xb1f, 0x20, 0xb21, 0xb3f, 0x20, 0xb09, 0xb30, 0xb71, 0xb3f, +0xb32, 0xb47, 0xb2e, 0xb15, 0xb4d, 0xb71, 0xb3e, 0xb30, 0xb3f, 0xb2e, 0xb3e, 0xb01, +0xb38, 0xb28, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb15, 0xb2e, 0xb41, 0xb30, 0xb4d, 0xb21, +0xb2a, 0xb3e, 0xb01, 0xb2e, 0xb30, 0xb30, 0xb4b, 0xb24, 0xb47, 0xb30, 0xb3e, 0xb1f, +0xb4b, 0xb32, 0xb4d, 0xb71, 0xb4b, 0xb38, 0xb4d, 0xb24, 0xb15, 0xb4b, 0xb33, 0xb19, +0xb4d, 0xb16, 0xb5f, 0xb3e, 0xb30, 0xb2c, 0xb47, 0xb28, 0xb06, 0xb15, 0xb4d, 0xb1f, +0xb2c, 0xb47, 0xb06, 0xb38, 0xb4d, 0x200d, 0xb17, 0xb3e, 0xb2c, 0xb1f, 0xb4d, 0xb2c, +0xb39, 0xb3e, 0xb30, 0xb47, 0xb28, 0xb2c, 0xb3f, 0xb38, 0xb15, 0xb47, 0xb15, 0xb4d, +0x200c, 0xb26, 0xb41, 0xb38, 0xb3e, 0xb28, 0xb2c, 0xb47, 0xb2a, 0xb3e, 0xb2e, 0xb3e, +0xb17, 0xb41, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb39, 0x20, 0xb1a, 0xb3f, 0x20, 0xb2e, +0xb3f, 0xb28, 0xb4d, 0x200c, 0x20, 0xb38, 0xb3f, 0xb1f, 0xb3f, 0xb39, 0xb4b, 0xb71, +0xb21, 0xb4d, 0x200c, 0xb1c, 0xb3e, 0xb15, 0xb30, 0xb4d, 0xb24, 0xb3e, 0xb15, 0xb2c, +0xb41, 0xb32, 0xb4d, 0xb15, 0xb3e, 0xb1f, 0xb2e, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb41, +0xb15, 0xb3e, 0xb28, 0xb21, 0xb4d, 0xb5f, 0xb3e, 0xb17, 0xb3e, 0xb15, 0xb4d, 0xb30, +0xb3e, 0xb38, 0xb28, 0xb5f, 0xb3e, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb28, 0xb3f, 0xb15, +0xb38, 0xb3f, 0xb06, 0xb28, 0xb71, 0xb15, 0xb41, 0xb1c, 0xb28, 0xb47, 0xb1f, 0xb38, +0xb4d, 0xb15, 0xb28, 0xb71, 0xb38, 0xb3f, 0xb2c, 0xb3f, 0xb30, 0xb38, 0xb4d, 0xb15, +0xb05, 0xb30, 0xb3e, 0xb32, 0xb4d, 0x200c, 0xb2a, 0xb28, 0xb2e, 0xb4d, 0x200c, 0x20, +0xb2a, 0xb47, 0xb28, 0xb39, 0xb2a, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb06, 0xb28, 0xb3e, +0xb15, 0xb4d, 0x200c, 0xb15, 0xb37, 0xb4d, 0xb1f, 0xb28, 0xb47, 0xb15, 0xb40, 0xb1c, +0xb3f, 0xb32, 0xb30, 0xb4d, 0xb21, 0xb3e, 0xb38, 0xb15, 0xb3e, 0xb32, 0xb3f, 0xb28, +0xb4d, 0xb38, 0xb3f, 0xb05, 0xb32, 0xb38, 0xb02, 0xb17, 0xb3e, 0xb07, 0xb38, 0xb4d, +0xb30, 0xb47, 0xb21, 0xb28, 0xb47, 0xb15, 0xb32, 0xb5f, 0xb2e, 0xb38, 0xb4d, 0xb15, +0xb24, 0xb3e, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb24, 0xb3f, 0xb2e, 0xb4d, +0xb2a, 0xb41, 0xb1f, 0xb15, 0xb3f, 0xb05, 0xb1f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb5f, +0xb41, 0xb38, 0xb4d, 0x200d, 0xb1f, 0x2d, 0xb28, 0xb47, 0xb30, 0xb3e, 0xb71, 0xb3f, +0xb0f, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb0f, 0xb28, 0xb4d, 0x200c, 0xb71, 0xb4d, 0xb32, +0xb3e, 0xb21, 0xb3f, 0xb71, 0xb37, 0xb4d, 0xb1f, 0xb4b, 0xb15, 0xb4d, 0xb5f, 0xb47, +0xb30, 0xb47, 0xb2c, 0xb3e, 0xb28, 0xb4d, 0xb06, 0xb1c, 0xb30, 0xb47, 0xb38, 0xb4d, +0xb2c, 0xb30, 0xb2e, 0xb41, 0xb21, 0xb3e, 0xb15, 0xb47, 0xb2a, 0xb4d, 0x200c, 0x20, +0xb71, 0xb30, 0xb4d, 0xb26, 0xb47, 0xb2a, 0xb30, 0xb0f, 0xb30, 0xb47, 0xb15, 0xb4d, +0xb5f, 0xb3e, 0xb2c, 0xb3f, 0xb15, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb3e, 0xb32, 0xb3f, +0xb28, 0xb0f, 0xb21, 0xb3f, 0xb32, 0xb47, 0xb21, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb3f, +0xb38, 0xb2c, 0xb28, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb4b, 0xb15, 0xb28, 0x20, 0xb39, +0xb3f, 0xb32, 0xb21, 0xb3e, 0xb30, 0xb4d, 0xb71, 0xb3f, 0xb28, 0xb4d, 0xb32, 0xb3f, +0xb23, 0xb4d, 0xb21, 0xb47, 0xb2e, 0xb3e, 0xb28, 0xb32, 0xb30, 0xb4d, 0x200d, 0xb21, +0x20, 0xb39, 0xb3e, 0xb71, 0xb47, 0xb2e, 0xb47, 0xb32, 0xb2c, 0xb4b, 0xb28, 0xb01, +0xb2a, 0xb30, 0xb4d, 0xb24, 0xb06, 0xb2e, 0xb37, 0xb4d, 0xb1f, 0xb4d, 0xb30, 0xb47, +0xb21, 0xb3e, 0xb2e, 0xb4d, 0xb06, 0xb23, 0xb4d, 0xb21, 0xb30, 0xb3e, 0xb06, 0xb38, +0xb4d, 0x200d, 0xb1f, 0xb30, 0xb3e, 0xb15, 0xb3e, 0xb28, 0xb0f, 0xb24, 0xb47, 0xb28, +0xb4d, 0xb38, 0xb2c, 0xb47, 0xb32, 0xb17, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb47, 0xb2c, +0xb4d, 0xb30, 0xb3e, 0xb1f, 0xb3f, 0xb38, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb2c, 0xb4d, +0xb30, 0xb41, 0xb38, 0xb3f, 0xb32, 0xb4d, 0x200d, 0xb38, 0xb2c, 0xb41, 0xb1a, 0xb3e, +0xb30, 0xb47, 0xb38, 0xb4d, 0xb1f, 0xb2c, 0xb41, 0xb21, 0xb3e, 0xb2a, 0xb47, 0xb38, +0xb4d, 0xb1f, 0xb1a, 0xb3f, 0xb38, 0xb3f, 0xb28, 0xb3e, 0xb09, 0xb15, 0xb2a, 0xb47, +0xb28, 0xb39, 0xb3e, 0xb17, 0xb47, 0xb28, 0xb4d, 0xb06, 0xb07, 0xb32, 0xb4d, 0x20, +0xb05, 0xb2a, 0xb4d, 0x20, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0xb15, 0xb3f, +0xb30, 0xb71, 0xb2e, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb3e, 0xb39, 0xb47, 0xb2e, 0xb2e, +0xb28, 0xb3e, 0xb15, 0xb05, 0xb38, 0xb32, 0xb4b, 0xb2a, 0xb21, 0xb17, 0xb30, 0xb3f, +0xb15, 0xb3e, 0xb30, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1c, 0xb47, 0xb2c, +0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1f, 0xb71, 0xb4d, 0xb38, 0xb3f, 0xb2e, 0xb2b, 0xb47, +0xb30, 0xb2a, 0xb32, 0xb4d, 0xb38, 0xb4d, 0xb15, 0xb2a, 0xb5f, 0xb47, 0xb38, 0xb2a, +0xb3f, 0xb5f, 0xb3e, 0xb38, 0xb4d, 0xb1f, 0xb15, 0xb4d, 0x20, 0xb39, 0xb2e, 0xb4d, +0x200c, 0xb1f, 0xb3e, 0xb07, 0xb30, 0xb47, 0xb28, 0xb4d, 0xb5f, 0xb41, 0xb32, 0xb5f, +0xb3e, 0xb28, 0xb71, 0xb38, 0xb4d, 0xb15, 0xb2c, 0xb3e, 0xb21, 0xb41, 0xb1c, 0xb71, +0xb3e, 0xb1f, 0xb3f, 0xb15, 0xb3e, 0xb28, 0xb4d, 0xb71, 0xb3f, 0xb0f, 0xb28, 0xb3e, +0xb71, 0xb3f, 0xb32, 0xb28, 0xb3f, 0xb09, 0xb38, 0xb4d, 0xb71, 0xb32, 0xb17, 0xb17, +0xb4d, 0xb30, 0xb3e, 0xb21, 0xb4d, 0xb16, 0xb4d, 0xb30, 0xb40, 0xb38, 0xb4d, 0x200d, +0xb1f, 0x20, 0xb2e, 0xb3e, 0xb38, 0xb15, 0xb15, 0xb38, 0xb4d, 0x200c, 0xb15, 0xb2e, +0xb30, 0xb15, 0xb47, 0xb30, 0xb17, 0xb41, 0xb32, 0xb47, 0xb28, 0xb2e, 0xb30, 0xb3f, +0xb38, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb5f, 0xb1f, 0xb47, 0xb2c, 0xb17, 0xb47, 0xb28, +0xb4d, 0x200c, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb1a, 0xb3e, 0xb24, 0xb3e, +0xb2e, 0xb4d, 0x200c, 0xb2a, 0xb15, 0xb3e, 0xb05, 0xb2a, 0xb2a, 0xb3f, 0xb1c, 0xb3f, +0xb17, 0xb3e, 0xb32, 0xb3e, 0xb2a, 0xb3e, 0xb17, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d, +0xb1f, 0xb28, 0xb28, 0xb30, 0xb2a, 0xb15, 0xb4d, 0x200c, 0xb28, 0xb09, 0xb2e, 0xb3f, +0xb5f, 0xb2a, 0xb39, 0xb28, 0xb2a, 0xb47, 0xb07, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, +0x200c, 0x20, 0xb2e, 0xb30, 0xb47, 0xb38, 0xb2c, 0xb3f, 0xb30, 0xb3e, 0xb30, 0xb1f, +0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb3e, 0xb2a, +0xb41, 0xc0e, 0xc02, 0xc17, 0xc4d, 0xc35, 0xc3f, 0xc32, 0xc4d, 0xc32, 0xc3e, 0x3c, +0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, +0x3e, 0xc05, 0xc21, 0xc46, 0xc32, 0xc48, 0xc21, 0xc4d, 0x3c, 0x2f, 0x65, 0x78, +0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc15, +0xc3e, 0xc02, 0xc1f, 0xc28, 0xc4d, 0x140a, 0x144e, 0x1426, 0x146f, 0x1472, 0x1423, 0x1401, +0x141f, 0x14aa, 0x1423, 0x1450, 0x1423, 0x1403, 0x14c4, 0x1431, 0x1420, 0x1403, 0x1473, 0x14eb, +0x1405, 0x1403, 0x141f, 0x14f4, 0x1422, 0x1473, 0x141f, 0x1489, 0x1418, 0x1423, 0x1411, 0x14c2, +0x142f, 0x1420 }; static inline constexpr char16_t shortZoneNameTable[] = { diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp index 37d6dea35f9..54bd971cb36 100644 --- a/src/corelib/tools/qarraydata.cpp +++ b/src/corelib/tools/qarraydata.cpp @@ -181,13 +181,12 @@ allocateHelper(qsizetype objectSize, qsizetype alignment, qsizetype capacity, return {}; void *data = nullptr; - QArrayData *header = static_cast<QArrayData *>(::malloc(size_t(allocSize))); - if (Q_LIKELY(header)) { - header->ref_.storeRelaxed(1); - header->flags = {}; + void *mem = ::malloc(size_t(allocSize)); + QArrayData *header = nullptr; + if (Q_LIKELY(mem)) { + header = new (mem) QArrayData{1, {}, capacity}; // find where offset should point to so that data() is aligned to alignment bytes data = QTypedArrayData<void>::dataStart(header, alignment); - header->alloc = capacity; } return { data, header }; @@ -245,8 +244,12 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer, Q_ASSERT(offset > 0); Q_ASSERT(offset <= allocSize); // equals when all free space is at the beginning - QArrayData *header = static_cast<QArrayData *>(::realloc(data, size_t(allocSize))); - if (header) { + const bool hadData = data; + void *mem = ::realloc(data, size_t(allocSize)); + QArrayData *header = static_cast<QArrayData *>(mem); + if (mem) { + if (!hadData) + header = new (mem) QArrayData{0, {}, {}}; header->alloc = capacity; dataPointer = reinterpret_cast<char *>(header) + offset; } else { diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h index 38d1091ac1f..71e183e646e 100644 --- a/src/corelib/tools/qarraydata.h +++ b/src/corelib/tools/qarraydata.h @@ -39,7 +39,7 @@ struct QArrayData }; Q_DECLARE_FLAGS(ArrayOptions, ArrayOption) - QBasicAtomicInt ref_; + QBasicAtomicInt m_ref; ArrayOptions flags; qsizetype alloc; @@ -56,19 +56,19 @@ struct QArrayData /// Returns true if sharing took place bool ref() noexcept { - ref_.ref(); + m_ref.ref(); return true; } /// Returns false if deallocation is necessary bool deref() noexcept { - return ref_.deref(); + return m_ref.deref(); } bool isShared() const noexcept { - return ref_.loadRelaxed() != 1; + return m_ref.loadRelaxed() != 1; } // Returns true if a detach is necessary before modifying the data @@ -76,7 +76,7 @@ struct QArrayData // detaching is necessary, you should be in a non-const function already bool needsDetach() noexcept { - return ref_.loadRelaxed() > 1; + return m_ref.loadRelaxed() > 1; } qsizetype detachCapacity(qsizetype newSize) const noexcept diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index c20abd12c23..419585b0260 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -82,7 +82,7 @@ public: void destroyAll() noexcept // Call from destructors, ONLY! { Q_ASSERT(this->d); - Q_ASSERT(this->d->ref_.loadRelaxed() == 0); + Q_ASSERT(this->d->m_ref.loadRelaxed() == 0); // As this is to be called only from destructor, it doesn't need to be // exception safe; size not updated. @@ -345,7 +345,7 @@ public: // As this is to be called only from destructor, it doesn't need to be // exception safe; size not updated. - Q_ASSERT(this->d->ref_.loadRelaxed() == 0); + Q_ASSERT(this->d->m_ref.loadRelaxed() == 0); std::destroy(this->begin(), this->end()); } diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h index 5c12332aa4a..cc12fb9c8d0 100644 --- a/src/corelib/tools/qfreelist_p.h +++ b/src/corelib/tools/qfreelist_p.h @@ -232,7 +232,7 @@ inline void QFreeList<T, ConstantsType>::release(int id) { int at = id & ConstantsType::IndexMask; const int block = blockfor(at); - ElementType *v = _v[block].loadRelaxed(); + ElementType *v = _v[block].loadAcquire(); int x, newid; do { diff --git a/src/gui/accessible/linux/atspiadaptor.cpp b/src/gui/accessible/linux/atspiadaptor.cpp index 6154af00950..e0cd5aee25c 100644 --- a/src/gui/accessible/linux/atspiadaptor.cpp +++ b/src/gui/accessible/linux/atspiadaptor.cpp @@ -1462,9 +1462,12 @@ bool AtSpiAdaptor::handleMessage(const QDBusMessage &message, const QDBusConnect // handle properties like regular functions if (interface == "org.freedesktop.DBus.Properties"_L1) { - interface = message.arguments().at(0).toString(); - // Get/Set + Name - function = message.member() + message.arguments().at(1).toString(); + const auto arguments = message.arguments(); + if (arguments.size() > 0) { + interface = arguments.at(0).toString(); + if (arguments.size() > 1) // e.g. Get/Set + Name + function = function + arguments.at(1).toString(); + } } // switch interface to call diff --git a/src/gui/itemmodels/qfileinfogatherer.cpp b/src/gui/itemmodels/qfileinfogatherer.cpp index a0192c99828..df43f53050a 100644 --- a/src/gui/itemmodels/qfileinfogatherer.cpp +++ b/src/gui/itemmodels/qfileinfogatherer.cpp @@ -149,6 +149,8 @@ void QFileInfoGatherer::fetchExtendedInformation(const QString &path, const QStr while ((loc = this->path.lastIndexOf(path, loc - 1)) != -1) { if (this->files.at(loc) == files) return; + if (loc == 0) + break; } #if QT_CONFIG(thread) diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp index 1768cd8aa1a..f965a5a30e9 100644 --- a/src/gui/kernel/qaction.cpp +++ b/src/gui/kernel/qaction.cpp @@ -1325,4 +1325,6 @@ Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAction *action) QT_END_NAMESPACE +#undef QAPP_CHECK + #include "moc_qaction.cpp" diff --git a/src/gui/kernel/qshortcut.cpp b/src/gui/kernel/qshortcut.cpp index 3f6822cb031..e730b5f9e8b 100644 --- a/src/gui/kernel/qshortcut.cpp +++ b/src/gui/kernel/qshortcut.cpp @@ -577,4 +577,6 @@ bool QShortcut::event(QEvent *e) QT_END_NAMESPACE +#undef QAPP_CHECK + #include "moc_qshortcut.cpp" diff --git a/src/gui/math3d/qquaternion.cpp b/src/gui/math3d/qquaternion.cpp index edbe507e93d..b91215fdf4a 100644 --- a/src/gui/math3d/qquaternion.cpp +++ b/src/gui/math3d/qquaternion.cpp @@ -336,6 +336,9 @@ QVector3D QQuaternion::rotatedVector(const QVector3D &vector) const Extracts a 3D axis \a axis and a rotating angle \a angle (in degrees) that corresponds to this quaternion. + Both \a axis and \a angle must be valid, non-\nullptr pointers, + otherwise the behavior is undefined. + \sa fromAxisAndAngle() */ @@ -366,6 +369,9 @@ QQuaternion QQuaternion::fromAxisAndAngle(const QVector3D &axis, float angle) Extracts a 3D axis (\a x, \a y, \a z) and a rotating angle \a angle (in degrees) that corresponds to this quaternion. + All of \a x, \a y, \a z, and \a angle must be valid, non-\nullptr pointers, + otherwise the behavior is undefined. + \sa fromAxisAndAngle() */ void QQuaternion::getAxisAndAngle(float *x, float *y, float *z, float *angle) const @@ -421,19 +427,20 @@ QQuaternion QQuaternion::fromAxisAndAngle \since 5.5 Calculates roll, pitch, and yaw Euler angles (in degrees) - that corresponds to this quaternion. + that correspond to this quaternion. \sa fromEulerAngles() */ /*! - \fn QQuaternion QQuaternion::fromEulerAngles(const QVector3D &eulerAngles) + \fn QQuaternion QQuaternion::fromEulerAngles(const QVector3D &angles) \since 5.5 \overload - Creates a quaternion that corresponds to a rotation of \a eulerAngles: - eulerAngles.z() degrees around the z axis, eulerAngles.x() degrees around the x axis, - and eulerAngles.y() degrees around the y axis (in that order). + Creates a quaternion that corresponds to a rotation of \a angles: + angles.\l{QVector3D::}{z()} degrees around the z axis, + angles.\l{QVector3D::}{x()} degrees around the x axis, and + angles.\l{QVector3D::}{y()} degrees around the y axis (in that order). \sa toEulerAngles() */ @@ -446,6 +453,9 @@ QQuaternion QQuaternion::fromAxisAndAngle Calculates \a roll, \a pitch, and \a yaw Euler angles (in degrees) that corresponds to this quaternion. + All of \a pitch, \a yaw, and \a roll must be valid, non-\nullptr pointers, + otherwise the behavior is undefined. + \sa fromEulerAngles() */ void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const @@ -585,9 +595,9 @@ QMatrix3x3 QQuaternion::toRotationMatrix() const /*! \since 5.5 - Creates a quaternion that corresponds to a rotation matrix \a rot3x3. + Creates a quaternion that corresponds to the rotation matrix \a rot3x3. - \note If a given rotation matrix is not normalized, + \note If the given rotation matrix is not normalized, the resulting quaternion will contain scaling information. \sa toRotationMatrix(), fromAxes() @@ -634,6 +644,9 @@ QQuaternion QQuaternion::fromRotationMatrix(const QMatrix3x3 &rot3x3) Returns the 3 orthonormal axes (\a xAxis, \a yAxis, \a zAxis) defining the quaternion. + All of \a xAxis, \a yAxis, and \a zAxis must be valid, non-\nullptr pointers, + otherwise the behavior is undefined. + \sa fromAxes(), toRotationMatrix() */ void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const diff --git a/src/gui/math3d/qquaternion.h b/src/gui/math3d/qquaternion.h index 7fb153063c5..0ea844ae41f 100644 --- a/src/gui/math3d/qquaternion.h +++ b/src/gui/math3d/qquaternion.h @@ -109,7 +109,7 @@ QT_WARNING_POP #ifndef QT_NO_VECTOR3D inline QVector3D toEulerAngles() const; - static inline QQuaternion fromEulerAngles(const QVector3D &eulerAngles); + static inline QQuaternion fromEulerAngles(const QVector3D &angles); #endif QT7_ONLY(Q_GUI_EXPORT) void getEulerAngles(float *pitch, float *yaw, float *roll) const; QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromEulerAngles(float pitch, float yaw, float roll); @@ -311,23 +311,23 @@ inline QVector3D operator*(const QQuaternion &quaternion, const QVector3D &vec) return quaternion.rotatedVector(vec); } -inline void QQuaternion::getAxisAndAngle(QVector3D *axis, float *angle) const +void QQuaternion::getAxisAndAngle(QVector3D *axis, float *angle) const { float aX, aY, aZ; getAxisAndAngle(&aX, &aY, &aZ, angle); *axis = QVector3D(aX, aY, aZ); } -inline QVector3D QQuaternion::toEulerAngles() const +QVector3D QQuaternion::toEulerAngles() const { float pitch, yaw, roll; getEulerAngles(&pitch, &yaw, &roll); return QVector3D(pitch, yaw, roll); } -inline QQuaternion QQuaternion::fromEulerAngles(const QVector3D &eulerAngles) +QQuaternion QQuaternion::fromEulerAngles(const QVector3D &angles) { - return QQuaternion::fromEulerAngles(eulerAngles.x(), eulerAngles.y(), eulerAngles.z()); + return QQuaternion::fromEulerAngles(angles.x(), angles.y(), angles.z()); } #endif // QT_NO_VECTOR3D diff --git a/src/gui/painting/qdatabuffer_p.h b/src/gui/painting/qdatabuffer_p.h index c7474dc57a3..4872853514b 100644 --- a/src/gui/painting/qdatabuffer_p.h +++ b/src/gui/painting/qdatabuffer_p.h @@ -87,8 +87,9 @@ public: capacity = 1; while (capacity < size) capacity *= 2; - buffer = (Type*) QtPrivate::fittedRealloc(static_cast<void*>(buffer), 0, &capacity, sizeof(Type)); - Q_CHECK_PTR(buffer); + auto ptr = QtPrivate::fittedRealloc(static_cast<void*>(buffer), 0, &capacity, sizeof(Type)); + Q_CHECK_PTR(ptr); + buffer = static_cast<Type*>(ptr); } } @@ -96,8 +97,9 @@ public: Q_ASSERT(capacity >= size); if (size) { capacity = size; - buffer = (Type*) QtPrivate::fittedRealloc(static_cast<void*>(buffer), 0, &capacity, sizeof(Type)); - Q_CHECK_PTR(buffer); + const auto ptr = QtPrivate::fittedRealloc(static_cast<void*>(buffer), 0, &capacity, sizeof(Type)); + Q_CHECK_PTR(ptr); + buffer = static_cast<Type*>(ptr); siz = std::min(siz, size); } else { QtPrivate::sizedFree(buffer, capacity, sizeof(Type)); diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h index d436afc5c77..1a60afbdd8e 100644 --- a/src/gui/painting/qpaintengine_raster_p.h +++ b/src/gui/painting/qpaintengine_raster_p.h @@ -361,7 +361,7 @@ inline void QClipData::appendSpan(int x, int length, int y, int coverage) if (count == allocated) { allocated *= 2; - m_spans = (QT_FT_Span *)realloc(m_spans, allocated*sizeof(QT_FT_Span)); + m_spans = static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated * sizeof(QT_FT_Span)))); } m_spans[count].x = x; m_spans[count].len = length; @@ -378,7 +378,7 @@ inline void QClipData::appendSpans(const QT_FT_Span *s, int num) do { allocated *= 2; } while (count + num > allocated); - m_spans = (QT_FT_Span *)realloc(m_spans, allocated*sizeof(QT_FT_Span)); + m_spans = static_cast<QT_FT_Span*>(q_check_ptr(realloc(m_spans, allocated * sizeof(QT_FT_Span)))); } memcpy(m_spans+count, s, num*sizeof(QT_FT_Span)); count += num; diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 5d455219359..8380a8b7f68 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -1570,7 +1570,6 @@ bool QFontDatabase::isFixedPitch(const QString &family, bool QFontDatabase::isBitmapScalable(const QString &family, const QString &style) { - bool bitmapScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); @@ -1578,7 +1577,8 @@ bool QFontDatabase::isBitmapScalable(const QString &family, QFontDatabasePrivate *d = QFontDatabasePrivate::ensureFontDatabase(); QtFontFamily *f = d->family(familyName); - if (!f) return bitmapScalable; + if (!f) + return false; QtFontStyle::Key styleKey(style); for (int j = 0; j < f->count; j++) { @@ -1589,13 +1589,11 @@ bool QFontDatabase::isBitmapScalable(const QString &family, foundry->styles[k]->styleName == style || foundry->styles[k]->key == styleKey) && foundry->styles[k]->bitmapScalable && !foundry->styles[k]->smoothScalable) { - bitmapScalable = true; - goto end; + return true; } } } - end: - return bitmapScalable; + return false; } @@ -1609,7 +1607,6 @@ bool QFontDatabase::isBitmapScalable(const QString &family, */ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &style) { - bool smoothScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); @@ -1626,7 +1623,8 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty } } } - if (!f) return smoothScalable; + if (!f) + return false; const QtFontStyle::Key styleKey(style); for (int j = 0; j < f->count; j++) { @@ -1634,7 +1632,7 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) { for (int k = 0; k < foundry->count; k++) { const QtFontStyle *fontStyle = foundry->styles[k]; - smoothScalable = + const bool smoothScalable = fontStyle->smoothScalable && ((style.isEmpty() || fontStyle->styleName == style @@ -1643,12 +1641,11 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty && style == styleStringHelper(fontStyle->key.weight, QFont::Style(fontStyle->key.style)))); if (smoothScalable) - goto end; + return true; } } } - end: - return smoothScalable; + return false; } /*! @@ -1679,7 +1676,6 @@ QList<int> QFontDatabase::pointSizes(const QString &family, if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable()) return standardSizes(); - bool smoothScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); @@ -1701,10 +1697,9 @@ QList<int> QFontDatabase::pointSizes(const QString &family, QtFontStyle *style = foundry->style(styleKey, styleName); if (!style) continue; - if (style->smoothScalable) { - smoothScalable = true; - goto end; - } + if (style->smoothScalable) + return standardSizes(); + for (int l = 0; l < style->count; l++) { const QtFontSize *size = style->pixelSizes + l; @@ -1716,9 +1711,6 @@ QList<int> QFontDatabase::pointSizes(const QString &family, } } } - end: - if (smoothScalable) - return standardSizes(); std::sort(sizes.begin(), sizes.end()); return sizes; @@ -1781,7 +1773,6 @@ QList<int> QFontDatabase::smoothSizes(const QString &family, if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable()) return standardSizes(); - bool smoothScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); @@ -1803,10 +1794,9 @@ QList<int> QFontDatabase::smoothSizes(const QString &family, QtFontStyle *style = foundry->style(styleKey, styleName); if (!style) continue; - if (style->smoothScalable) { - smoothScalable = true; - goto end; - } + if (style->smoothScalable) + return QFontDatabase::standardSizes(); + for (int l = 0; l < style->count; l++) { const QtFontSize *size = style->pixelSizes + l; @@ -1818,9 +1808,6 @@ QList<int> QFontDatabase::smoothSizes(const QString &family, } } } - end: - if (smoothScalable) - return QFontDatabase::standardSizes(); std::sort(sizes.begin(), sizes.end()); return sizes; diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp index 06ae00123f0..379fb70a81a 100644 --- a/src/gui/text/qtextformat.cpp +++ b/src/gui/text/qtextformat.cpp @@ -2245,6 +2245,17 @@ void QTextCharFormat::setFont(const QFont &font, FontPropertiesInheritanceBehavi /*! Returns the font for this character format. + + This function takes into account the format's font attributes (such as fontWeight() + and fontPointSize()) and resolves them on top of the default font, defined as follows. + If the format is part of a document, that is the document's default font. + Otherwise the properties are resolved on top of a default constructed QFont. + + For example, if this format's font size hasn't been changed from the default font, + fontPointSize() returns 0, while \c {font().pointSize()} returns the actual + size used for drawing. + + \sa QTextDocument::defaultFont() */ QFont QTextCharFormat::font() const { diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_p.h b/src/platformsupport/devicediscovery/qdevicediscovery_p.h index 59ce3cd8896..61b0c705898 100644 --- a/src/platformsupport/devicediscovery/qdevicediscovery_p.h +++ b/src/platformsupport/devicediscovery/qdevicediscovery_p.h @@ -58,6 +58,7 @@ public: signals: void deviceDetected(const QString &deviceNode); void deviceRemoved(const QString &deviceNode); + void deviceChanged(const QString &deviceNode); protected: QDeviceDiscovery(QDeviceTypes types, QObject *parent) : QObject(parent), m_types(types) { } diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp index edb3fc58a22..e4d69101f75 100644 --- a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp +++ b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp @@ -175,6 +175,9 @@ void QDeviceDiscoveryUDev::handleUDevNotification() if (qstrcmp(action, "remove") == 0) emit deviceRemoved(devNode); + if (qstrcmp(action, "change") == 0) + emit deviceChanged(devNode); + cleanup: udev_device_unref(dev); } diff --git a/src/platformsupport/kmsconvenience/qkmsdevice.cpp b/src/platformsupport/kmsconvenience/qkmsdevice.cpp index cdd2ac2d572..7b2637bfffe 100644 --- a/src/platformsupport/kmsconvenience/qkmsdevice.cpp +++ b/src/platformsupport/kmsconvenience/qkmsdevice.cpp @@ -151,17 +151,45 @@ static inline void assignPlane(QKmsOutput *output, QKmsPlane *plane) output->eglfs_plane = plane; } -QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources, - drmModeConnectorPtr connector, - ScreenInfo *vinfo) +static bool orderedScreenLessThan(const QKmsDevice::OrderedScreen &a, + const QKmsDevice::OrderedScreen &b) +{ + return a.vinfo.virtualIndex < b.vinfo.virtualIndex; +} + +QKmsDevice::OrderedScreen::OrderedScreen() : screen(nullptr) { } + +QKmsDevice::OrderedScreen::OrderedScreen(QPlatformScreen *screen, + const QKmsDevice::ScreenInfo &vinfo) + : screen(screen), vinfo(vinfo) +{ +} + +QDebug operator<<(QDebug dbg, const QPlatformScreen *screen) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QPlatformScreen=" << (const void *)screen << " (" + << (screen ? screen->name() : QString()) << ")"; + return dbg; +} + +QDebug operator<<(QDebug dbg, const QKmsDevice::OrderedScreen &s) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "OrderedScreen(" << s.screen << ") : " << s.vinfo.virtualIndex << " / " + << s.vinfo.virtualPos << " / primary: " << s.vinfo.isPrimary << ")"; + return dbg; +} + +bool QKmsDevice::createScreenInfoForConnector(drmModeResPtr resources, + drmModeConnectorPtr connector, ScreenInfo &vinfo) { - Q_ASSERT(vinfo); const QByteArray connectorName = nameForConnector(connector); const int crtc = crtcForConnector(resources, connector); if (crtc < 0) { qWarning() << "No usable crtc/encoder pair for connector" << connectorName; - return nullptr; + return false; } OutputConfiguration configuration; @@ -195,45 +223,54 @@ QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources, configuration = OutputConfigPreferred; } - *vinfo = ScreenInfo(); - vinfo->virtualIndex = userConnectorConfig.value(QStringLiteral("virtualIndex"), INT_MAX).toInt(); + vinfo.virtualIndex = userConnectorConfig.value(QStringLiteral("virtualIndex"), INT_MAX).toInt(); if (userConnectorConfig.contains(QStringLiteral("virtualPos"))) { const QByteArray vpos = userConnectorConfig.value(QStringLiteral("virtualPos")).toByteArray(); const QByteArrayList vposComp = vpos.split(','); - if (vposComp.size() == 2) - vinfo->virtualPos = QPoint(vposComp[0].trimmed().toInt(), vposComp[1].trimmed().toInt()); + if (vposComp.count() == 2) { + vinfo.virtualPos = QPoint(vposComp[0].trimmed().toInt(), vposComp[1].trimmed().toInt()); + qCDebug(qLcKmsDebug) << "Parsing virtualPos to: " << vinfo.virtualPos; + } else { + vinfo.virtualPos = QPoint(-1, -1); + qCDebug(qLcKmsDebug) << "Could not parse virtualPos," + << "will be calculated based on virtualIndex"; + } + } else { + vinfo.virtualPos = QPoint(-1, -1); } + if (userConnectorConfig.value(QStringLiteral("primary")).toBool()) - vinfo->isPrimary = true; + vinfo.isPrimary = true; const uint32_t crtc_id = resources->crtcs[crtc]; if (configuration == OutputConfigOff) { qCDebug(qLcKmsDebug) << "Turning off output" << connectorName; drmModeSetCrtc(m_dri_fd, crtc_id, 0, 0, 0, 0, 0, nullptr); - return nullptr; + return false; } // Skip disconnected output if (configuration == OutputConfigPreferred && connector->connection == DRM_MODE_DISCONNECTED) { qCDebug(qLcKmsDebug) << "Skipping disconnected output" << connectorName; - return nullptr; + return false; } if (configuration == OutputConfigSkip) { qCDebug(qLcKmsDebug) << "Skipping output" << connectorName; - return nullptr; + return false; } // Get the current mode on the current crtc drmModeModeInfo crtc_mode; memset(&crtc_mode, 0, sizeof crtc_mode); if (drmModeEncoderPtr encoder = drmModeGetEncoder(m_dri_fd, connector->encoder_id)) { + drmModeCrtcPtr crtc = drmModeGetCrtc(m_dri_fd, encoder->crtc_id); drmModeFreeEncoder(encoder); if (!crtc) - return nullptr; + return false; if (crtc->mode_valid) crtc_mode = crtc->mode; @@ -303,7 +340,7 @@ QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources, if (selected_mode < 0) { qWarning() << "No modes available for output" << connectorName; - return nullptr; + return false; } else { int width = modes[selected_mode].hdisplay; int height = modes[selected_mode].vdisplay; @@ -504,9 +541,8 @@ QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources, m_crtc_allocator |= (1 << output.crtc_index); - vinfo->output = output; - - return createScreen(output); + vinfo.output = output; + return true; } drmModePropertyPtr QKmsDevice::connectorProperty(drmModeConnectorPtr connector, const QByteArray &name) @@ -566,29 +602,233 @@ QKmsDevice::~QKmsDevice() #endif } -struct OrderedScreen +void QKmsDevice::checkConnectedScreens() { - OrderedScreen() : screen(nullptr) { } - OrderedScreen(QPlatformScreen *screen, const QKmsDevice::ScreenInfo &vinfo) - : screen(screen), vinfo(vinfo) { } - QPlatformScreen *screen; - QKmsDevice::ScreenInfo vinfo; -}; + if (m_screenConfig->headless()) + return; -QDebug operator<<(QDebug dbg, const OrderedScreen &s) -{ - QDebugStateSaver saver(dbg); - dbg.nospace() << "OrderedScreen(QPlatformScreen=" << s.screen << " (" << s.screen->name() << ") : " - << s.vinfo.virtualIndex - << " / " << s.vinfo.virtualPos - << " / primary: " << s.vinfo.isPrimary - << ")"; - return dbg; + drmModeResPtr resources = drmModeGetResources(m_dri_fd); + if (!resources) { + qErrnoWarning(errno, "drmModeGetResources failed"); + return; + } + + QList<uint32_t> newConnects; + QList<uint32_t> newDisconnects; + const QMap<QString, QVariantMap> userConfig = m_screenConfig->outputSettings(); + + for (int i = 0; i < resources->count_connectors; i++) { + drmModeConnectorPtr connector = drmModeGetConnector(m_dri_fd, resources->connectors[i]); + if (!connector) { + qErrnoWarning(errno, "drmModeGetConnector failed"); + continue; + } + + const uint32_t id = connector->connector_id; + + const QByteArray connectorName = nameForConnector(connector); + const QVariantMap userCConfig = userConfig.value(QString::fromUtf8(connectorName)); + const QByteArray mode = userCConfig.value(QStringLiteral("mode")).toByteArray().toLower(); + if (mode == "off" || mode == "skip") + continue; + + if (connector->connection == DRM_MODE_CONNECTED) { + if (!m_registeredScreens.contains(id)) + newConnects.append(id); + else + qCDebug(qLcKmsDebug) << "Connected screen already registered: connector id=" << id; + } + + if (connector->connection == DRM_MODE_DISCONNECTED) { + if (m_registeredScreens.contains(id)) + newDisconnects.append(id); + else + qCDebug(qLcKmsDebug) << "Disconnected screen not registered: connector id=" << id; + } + + drmModeFreeConnector(connector); + } + + if (newConnects.isEmpty() && newDisconnects.isEmpty()) { + qCDebug(qLcKmsDebug) << "EGLFS/KMS: KMS-device-change but no new connects or disconnects " + << "to process - exiting"; + return; + } else { + qCDebug(qLcKmsDebug) << "EGLFS/KMS: KMS-device-change, new connects:" << newConnects + << ", and disconnected: " << newDisconnects; + } + + const int remainingScreenCount = m_registeredScreens.count() - newDisconnects.count(); + if (remainingScreenCount == 0 && m_headlessScreen == nullptr) { + qCDebug(qLcKmsDebug) << "EGLFS/KMS: creating headless screen before" + << "unregistering screens to avoid having no screens"; + m_headlessScreen = createHeadlessScreen(); + registerScreen(m_headlessScreen, true, QPoint(), + QList<QPlatformScreen *>() << m_headlessScreen); + } + + for (uint32_t connectorId : newDisconnects) { + OrderedScreen orderedScreen = m_registeredScreens.take(connectorId); + QPlatformScreen *screen = orderedScreen.screen; + + // Clear active crtc of the plane associated with the screen output + // and, if applicable, disassociate it from the eglfs plane. + uint32_t crtcId = (orderedScreen.vinfo.output.eglfs_plane != nullptr) // if we have an assigned plan + ? orderedScreen.vinfo.output.eglfs_plane->activeCrtcId // we use the active crtc_id to disable everything + : orderedScreen.vinfo.output.crtc_id; // if not, we use the default crtc_id + + if (orderedScreen.vinfo.output.eglfs_plane != nullptr) + orderedScreen.vinfo.output.eglfs_plane->activeCrtcId = 0; + + // Clear crtc allocator bit for screen + const int crtcIdx = orderedScreen.vinfo.output.crtc_index; + m_crtc_allocator &= ~(1 << crtcIdx); + + const int ret = drmModeSetCrtc(m_dri_fd, crtcId, 0, 0, 0, nullptr, 0, nullptr); + + if (ret != 0) { + qCWarning(qLcKmsDebug) << "Could not disable CRTC" << crtcId + << "on connector" << connectorId << "removal:" << ret; + } else { + qCDebug(qLcKmsDebug) << "Disabled CRTC" << crtcId + << "for connector " << connectorId << "disconnected"; + } + + // As we've already turned the crtc off, we don't want to restore the saved_crtc + if (orderedScreen.vinfo.output.saved_crtc) { + drmModeFreeCrtc(orderedScreen.vinfo.output.saved_crtc); + orderedScreen.vinfo.output.saved_crtc = nullptr; + updateScreenOutput(orderedScreen.screen, orderedScreen.vinfo.output); + } + + unregisterScreen(screen); + } + + for (uint32_t connectorId : newConnects) { + drmModeConnectorPtr connector = drmModeGetConnector(m_dri_fd, connectorId); + if (!connector) { + qErrnoWarning(errno, "drmModeGetConnector failed"); + continue; + } + + ScreenInfo vinfo; + bool succ = createScreenInfoForConnector(resources, connector, vinfo); + drmModeFreeConnector(connector); + if (!succ) + continue; + + QPlatformScreen *screen = createScreen(vinfo.output); + if (!screen) + continue; + + OrderedScreen orderedScreen(screen, vinfo); + m_registeredScreens[connectorId] = orderedScreen; + } + + drmModeFreeResources(resources); + + registerScreens(newConnects); } -static bool orderedScreenLessThan(const OrderedScreen &a, const OrderedScreen &b) +void QKmsDevice::updateScreens() { - return a.vinfo.virtualIndex < b.vinfo.virtualIndex; + if (m_screenConfig->headless()) + return; + + drmModeResPtr resources = drmModeGetResources(m_dri_fd); + if (!resources) { + qErrnoWarning(errno, "drmModeGetResources failed"); + return; + } + + QList<uint32_t> newConnects; + QList<OrderedScreen> newDisconnects; + + for (int i = 0; i < resources->count_connectors; i++) { + drmModeConnectorPtr connector = drmModeGetConnector(m_dri_fd, resources->connectors[i]); + if (!connector) + continue; + + if (m_registeredScreens.contains(connector->connector_id)) { + OrderedScreen &os = m_registeredScreens[connector->connector_id]; + + // As we're currently *re*creating the information of an used connector, + // we have to "fake" it being not in use at two places: + // (note: the only thing we'll restore is, in case of failure, the eglfs_plane + // probably not necessary but good practice) + + // 1) crtc_allocator for the crtc + const int crtcIdx = os.vinfo.output.crtc_index; + m_crtc_allocator &= ~(1 << crtcIdx); + + // 2) the plane itself + if (os.vinfo.output.eglfs_plane) + os.vinfo.output.eglfs_plane->activeCrtcId = 0; + + // We also save the saved crtc to restore it in case of success + // (otherwise QKmsOutput::restoreMode would restore to a second-latest crtc, + // rather then the original one) + drmModeCrtcPtr saved_saved_crtc = nullptr; + if (os.vinfo.output.saved_crtc) + saved_saved_crtc = os.vinfo.output.saved_crtc; + + ScreenInfo vinfo; + bool succ = createScreenInfoForConnector(resources, connector, vinfo); + if (!succ) { + // Here we either failed the recreate, or the config turns the screen off. + // In either case, we'll treat it as a disconnect + + // Either this connector is disconnected, broken or turned off + // In all those cases we don't need or want to restore the previous mode + if (os.vinfo.output.saved_crtc) { + drmModeFreeCrtc(os.vinfo.output.saved_crtc); + os.vinfo.output.saved_crtc = nullptr; + updateScreenOutput(os.screen, os.vinfo.output); + } + + // move from one container to another - we don't want registerScreens + // to deal with this, but need to call registerScreens before the disconnects + newDisconnects.append(m_registeredScreens.take(connector->connector_id)); + drmModeFreeConnector(connector); + continue; + } + drmModeFreeConnector(connector); + + drmModeFreeCrtc(vinfo.output.saved_crtc); + vinfo.output.saved_crtc = saved_saved_crtc; // This is vital as config changes should + // never override the original saved_crtc + os.vinfo = vinfo; + updateScreenOutput(os.screen, os.vinfo.output); + + } else { + ScreenInfo vinfo; + bool succ = createScreenInfoForConnector(resources, connector, vinfo); + if (!succ) // If we fail here we do nothing, as there is nothing to restore or cleanup + continue; + + QPlatformScreen *screen = createScreen(vinfo.output); + OrderedScreen orderedScreen(screen, vinfo); + m_registeredScreens[connector->connector_id] = orderedScreen; + newConnects.append(connector->connector_id); + } + } + + // In case we end up with zero screen, we do the fallback first + if (m_registeredScreens.count() == 0 && m_headlessScreen == nullptr) { + // Create headless screen before unregistering screens to avoid having no screens + m_headlessScreen = createHeadlessScreen(); + registerScreen(m_headlessScreen, true, QPoint(), + QList<QPlatformScreen *>() << m_headlessScreen); + } + + // Register new and updates existing screens + registerScreens(newConnects); + + // Last we unregister the disconncted ones + for (const OrderedScreen &os : newDisconnects) + unregisterScreen(os.screen); + + drmModeFreeResources(resources); } void QKmsDevice::createScreens() @@ -599,7 +839,8 @@ void QKmsDevice::createScreens() QPlatformScreen *screen = createHeadlessScreen(); if (screen) { qCDebug(qLcKmsDebug, "Headless mode enabled"); - registerScreen(screen, true, QPoint(0, 0), QList<QPlatformScreen *>()); + registerScreen(screen, true, QPoint(0, 0), + QList<QPlatformScreen *>() << screen); return; } else { qWarning("QKmsDevice: Requested headless mode without support in the backend. Request is ignored."); @@ -630,8 +871,7 @@ void QKmsDevice::createScreens() discoverPlanes(); - QList<OrderedScreen> screens; - + QList<uint32_t> newConnects; int wantedConnectorIndex = -1; bool ok; int idx = qEnvironmentVariableIntValue("QT_QPA_EGLFS_KMS_CONNECTOR_INDEX", &ok); @@ -647,19 +887,47 @@ void QKmsDevice::createScreens() continue; drmModeConnectorPtr connector = drmModeGetConnector(m_dri_fd, resources->connectors[i]); - if (!connector) + if (!connector) { + qErrnoWarning(errno, "drmModeGetConnector failed"); continue; + } ScreenInfo vinfo; - QPlatformScreen *screen = createScreenForConnector(resources, connector, &vinfo); - if (screen) - screens.append(OrderedScreen(screen, vinfo)); - + bool succ = createScreenInfoForConnector(resources, connector, vinfo); + uint32_t connectorId = connector->connector_id; drmModeFreeConnector(connector); + if (!succ) + continue; + + QPlatformScreen *screen = createScreen(vinfo.output); + if (!screen) + continue; + + OrderedScreen orderedScreen(screen, vinfo); + m_registeredScreens[connectorId] = orderedScreen; + newConnects.append(connectorId); } drmModeFreeResources(resources); + if (!qEnvironmentVariable("QT_QPA_EGLFS_HOTPLUG_ENABLED").isEmpty() + && newConnects.empty() && m_headlessScreen == nullptr) { + qCDebug(qLcKmsDebug) << "'QT_QPA_EGLFS_HOTPLUG_ENABLED' was set and no screen was connected/found during start-up." + << "In order for Qt to operate properly a qt_headless screen will be created." + << "It will be automatically removed as soon as the first screen is connected"; + // Create headless screen before unregistering screens to avoid having no screens + m_headlessScreen = createHeadlessScreen(); + registerScreen(m_headlessScreen, true, QPoint(), + QList<QPlatformScreen *>() << m_headlessScreen); + } + + registerScreens(newConnects); +} + +void QKmsDevice::registerScreens(QList<uint32_t> newConnects) +{ + QList<OrderedScreen> screens = m_registeredScreens.values(); + // Use stable sort to preserve the original (DRM connector) order // for outputs with unspecified indices. std::stable_sort(screens.begin(), screens.end(), orderedScreenLessThan); @@ -692,44 +960,129 @@ void QKmsDevice::createScreens() // Figure out the virtual desktop and register the screens to QPA/QGuiApplication. QPoint pos(0, 0); - QList<QPlatformScreen *> siblings; + QList<OrderedScreen> siblings; QList<QPoint> virtualPositions; int primarySiblingIdx = -1; + QRegion deskRegion; for (const OrderedScreen &orderedScreen : screens) { QPlatformScreen *s = orderedScreen.screen; QPoint virtualPos(0, 0); // set up a horizontal or vertical virtual desktop - if (orderedScreen.vinfo.virtualPos.isNull()) { - virtualPos = pos; - if (m_screenConfig->virtualDesktopLayout() == QKmsScreenConfig::VirtualDesktopLayoutVertical) - pos.ry() += s->geometry().height(); - else - pos.rx() += s->geometry().width(); + if (orderedScreen.vinfo.virtualPos.x() == -1 || orderedScreen.vinfo.virtualPos.y() == -1) { + if (orderedScreen.vinfo.output.clone_source.isEmpty()) { + virtualPos = pos; + if (m_screenConfig->virtualDesktopLayout() == QKmsScreenConfig::VirtualDesktopLayoutVertical) + pos.ry() += s->geometry().height(); + else + pos.rx() += s->geometry().width(); + } else { + for (int i = 0; i < screens.count(); i++) { + const OrderedScreen &os = screens[i]; + if (os.vinfo.output.name == orderedScreen.vinfo.output.clone_source) { + if (i >= virtualPositions.count()) { + qCWarning(qLcKmsDebug) + << "WARNING: When using clone on kms config," + << "you have to either order your screens (virtualIndex)," + << "so clones come after their source," + << "or specify 'virtualPos' for each clone." + << "Otherwise desktop-geomerty might not work properly!"; + virtualPos = pos; + } else { + virtualPos = virtualPositions[i]; + } + break; + } + } + } } else { virtualPos = orderedScreen.vinfo.virtualPos; } - qCDebug(qLcKmsDebug) << "Adding QPlatformScreen" << s << "(" << s->name() << ")" - << "to QPA with geometry" << s->geometry() - << "and isPrimary=" << orderedScreen.vinfo.isPrimary; + // The order in qguiapp's screens list will match the order set by // virtualIndex. This is not only handy but also required since for instance // evdevtouch relies on it when performing touch device - screen mapping. if (!m_screenConfig->separateScreens()) { - qCDebug(qLcKmsDebug) << " virtual position is" << virtualPos; - siblings.append(s); + siblings.append(orderedScreen); virtualPositions.append(virtualPos); if (orderedScreen.vinfo.isPrimary) primarySiblingIdx = siblings.size() - 1; } else { - registerScreen(s, orderedScreen.vinfo.isPrimary, virtualPos, QList<QPlatformScreen *>() << s); + const bool isNewScreen = newConnects.contains(orderedScreen.vinfo.output.connector_id); + if (isNewScreen) { + qCDebug(qLcKmsDebug) << "Adding QPlatformScreen" << s << "(" << s->name() << ")" + << "to QPA with geometry" << s->geometry() + << ", virtual position" << virtualPos + << "and isPrimary=" << orderedScreen.vinfo.isPrimary; + registerScreen(s, orderedScreen.vinfo.isPrimary, virtualPos, + QList<QPlatformScreen *>() << s); + deskRegion += s->geometry(); + } else { + qCDebug(qLcKmsDebug) << "Updating QPlatformScreen" << s << "(" << s->name() << ")" + << "to QPA with geometry" << s->geometry() + << ", virtual position" << virtualPos + << "and isPrimary=" << orderedScreen.vinfo.isPrimary; + updateScreen(s, virtualPos, QList<QPlatformScreen *>() << s); + deskRegion += s->geometry(); + } } } if (!m_screenConfig->separateScreens()) { + QList<QPlatformScreen *> platformScreenSiblings; + for (int i = 0; i < siblings.count(); ++i) { + platformScreenSiblings.append(siblings[i].screen); + } + // enable the virtual desktop - for (int i = 0; i < siblings.size(); ++i) - registerScreen(siblings[i], i == primarySiblingIdx, virtualPositions[i], siblings); + for (int i = 0; i < siblings.count(); ++i) { + QPlatformScreen *screen = platformScreenSiblings[i]; + const OrderedScreen &orderedScreen = siblings[i]; + const bool isNewScreen = newConnects.contains(orderedScreen.vinfo.output.connector_id); + if (isNewScreen) { + qCDebug(qLcKmsDebug) << "Adding QPlatformScreen" << screen + << "(" << screen->name() << ")" + << "to QPA with geometry" << screen->geometry() + << ", virtual position" << virtualPositions[i] + << "and isPrimary=" << orderedScreen.vinfo.isPrimary; + registerScreen(screen, i == primarySiblingIdx, virtualPositions[i], + platformScreenSiblings); + deskRegion += screen->geometry(); + } else { + qCDebug(qLcKmsDebug) << "Updating QPlatformScreen" << screen + << "(" << screen->name() << ")" + << "to QPA with geometry" << screen->geometry() + << ", virtual position" << virtualPositions[i] + << "and isPrimary=" << orderedScreen.vinfo.isPrimary; + updateScreen(screen, virtualPositions[i], platformScreenSiblings); + deskRegion += screen->geometry(); + } + } + } + + // Remove headless screen if other screens have become available + if (!m_registeredScreens.empty() && m_headlessScreen) { + unregisterScreen(m_headlessScreen); + m_headlessScreen = nullptr; + } + + // Due to layout changes it's possible that we have to reset/bound + // the cursor into the available space (otherwise the cursor might vanish) + QPoint currCPos = QCursor::pos(); + if (!deskRegion.contains(currCPos)) { + + // We try boudingRect first + QRect deskRect = deskRegion.boundingRect(); + currCPos.setX(qMin(currCPos.x(), deskRect.width()) - 1); + currCPos.setY(qMin(currCPos.y(), deskRect.height()) - 1); + + // If boudingRect isn't good enough, we go to 0 + if (!deskRegion.contains(currCPos)) + currCPos = QPoint(0,0); + + qCDebug(qLcKmsDebug) << "Due to desktop layout change, overriding cursor pos." + << "Is: " << QCursor::pos() << ", will be: " << currCPos; + QCursor::setPos(currCPos); } } @@ -749,6 +1102,25 @@ void QKmsDevice::registerScreenCloning(QPlatformScreen *screen, Q_UNUSED(screensCloningThisScreen); } +void QKmsDevice::unregisterScreen(QPlatformScreen *screen) +{ + Q_UNUSED(screen); +} + +void QKmsDevice::updateScreen(QPlatformScreen *screen, const QPoint &virtualPos, + const QList<QPlatformScreen *> &virtualSiblings) +{ + Q_UNUSED(screen); + Q_UNUSED(virtualPos); + Q_UNUSED(virtualSiblings); +} + +void QKmsDevice::updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output) +{ + Q_UNUSED(screen); + Q_UNUSED(output); +} + // drm_property_type_is is not available in old headers static inline bool propTypeIs(drmModePropertyPtr prop, uint32_t type) { @@ -1002,6 +1374,12 @@ QKmsScreenConfig::QKmsScreenConfig() { } +void QKmsScreenConfig::refreshConfig() +{ + m_outputSettings.clear(); + loadConfig(); +} + void QKmsScreenConfig::loadConfig() { QByteArray json = qgetenv("QT_QPA_EGLFS_KMS_CONFIG"); @@ -1039,6 +1417,11 @@ void QKmsScreenConfig::loadConfig() m_headless = false; } + const QString headlessSizeStr = object.value(QLatin1String("headlessSize")).toString(); + if (sscanf(headlessSizeStr.toUtf8().constData(), "%dx%d", &headlessSize.rwidth(), + &headlessSize.rheight()) == 2) + m_headlessSize = headlessSize; + m_hwCursor = object.value("hwcursor"_L1).toBool(m_hwCursor); m_pbuffers = object.value("pbuffers"_L1).toBool(m_pbuffers); m_devicePath = object.value("device"_L1).toString(); diff --git a/src/platformsupport/kmsconvenience/qkmsdevice_p.h b/src/platformsupport/kmsconvenience/qkmsdevice_p.h index 050d836cb18..3e6ec108175 100644 --- a/src/platformsupport/kmsconvenience/qkmsdevice_p.h +++ b/src/platformsupport/kmsconvenience/qkmsdevice_p.h @@ -88,11 +88,12 @@ public: QMap<QString, QVariantMap> outputSettings() const { return m_outputSettings; } virtual void loadConfig(); + void refreshConfig(); protected: QString m_devicePath; bool m_headless; - QSize m_headlessSize; + QSize m_headlessSize{ 1024, 768 }; bool m_hwCursor; bool m_separateScreens; bool m_pbuffers; @@ -196,6 +197,14 @@ public: QKmsOutput output; }; + struct OrderedScreen + { + OrderedScreen(); + OrderedScreen(QPlatformScreen *screen, const ScreenInfo &vinfo); + QPlatformScreen *screen = nullptr; + ScreenInfo vinfo; + }; + QKmsDevice(QKmsScreenConfig *screenConfig, const QString &path = QString()); virtual ~QKmsDevice(); @@ -210,6 +219,8 @@ public: bool threadLocalAtomicCommit(void *user_data); void threadLocalAtomicReset(); #endif + void checkConnectedScreens(); + void updateScreens(); void createScreens(); int fd() const; @@ -218,6 +229,7 @@ public: QKmsScreenConfig *screenConfig() const; protected: + void registerScreens(QList<uint32_t> newConnects = QList<uint32_t>()); virtual QPlatformScreen *createScreen(const QKmsOutput &output) = 0; virtual QPlatformScreen *createHeadlessScreen(); virtual void registerScreenCloning(QPlatformScreen *screen, @@ -227,12 +239,15 @@ protected: bool isPrimary, const QPoint &virtualPos, const QList<QPlatformScreen *> &virtualSiblings) = 0; + virtual void unregisterScreen(QPlatformScreen *screen); + virtual void updateScreen(QPlatformScreen *screen, const QPoint &virtualPos, + const QList<QPlatformScreen *> &virtualSiblings); + virtual void updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output); void setFd(int fd); int crtcForConnector(drmModeResPtr resources, drmModeConnectorPtr connector); - QPlatformScreen *createScreenForConnector(drmModeResPtr resources, - drmModeConnectorPtr connector, - ScreenInfo *vinfo); + bool createScreenInfoForConnector(drmModeResPtr resources, drmModeConnectorPtr connector, + ScreenInfo &vinfo); drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name); drmModePropertyBlobPtr connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name); typedef std::function<void(drmModePropertyPtr, quint64)> PropCallback; @@ -257,6 +272,8 @@ protected: quint32 m_crtc_allocator; QList<QKmsPlane> m_planes; + QMap<uint32_t, OrderedScreen> m_registeredScreens; + QPlatformScreen *m_headlessScreen = nullptr; private: Q_DISABLE_COPY(QKmsDevice) diff --git a/src/plugins/platforms/android/CMakeLists.txt b/src/plugins/platforms/android/CMakeLists.txt index 0160e12c26c..0d2a048abde 100644 --- a/src/plugins/platforms/android/CMakeLists.txt +++ b/src/plugins/platforms/android/CMakeLists.txt @@ -51,7 +51,12 @@ qt_internal_add_plugin(QAndroidIntegrationPlugin qandroidplatformdialoghelpers.cpp # Conflicting JNI classes, and types androidcontentfileengine.cpp + qandroidplatformforeignwindow.cpp qandroidplatformintegration.cpp + qandroidplatformscreen.cpp + qandroidplatformservices.cpp + qandroidplatformwindow.cpp + qandroidsystemlocale.cpp INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} ${QtBase_SOURCE_DIR}/src/3rdparty/android diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index 200c2f7a47b..b3ff0a4f06e 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -28,6 +28,7 @@ using namespace Qt::StringLiterals; namespace QtAndroidAccessibility { + static jmethodID m_setClassNameMethodID = 0; static jmethodID m_addActionMethodID = 0; static jmethodID m_setCheckableMethodID = 0; static jmethodID m_setCheckedMethodID = 0; @@ -421,6 +422,130 @@ namespace QtAndroidAccessibility return jstr; } + static QString classNameForRole(QAccessible::Role role, QAccessible::State state) { + switch (role) { + case QAccessible::Role::Button: + case QAccessible::Role::Link: + { + if (state.checkable) + // There is also a android.widget.Switch for which we have no match. + return QStringLiteral("android.widget.ToggleButton"); + return QStringLiteral("android.widget.Button"); + } + case QAccessible::Role::CheckBox: + // As of android/accessibility/utils/Role.java::getRole a CheckBox + // is NOT android.widget.CheckBox + return QStringLiteral("android.widget.CompoundButton"); + case QAccessible::Role::Clock: + return QStringLiteral("android.widget.TextClock"); + case QAccessible::Role::ComboBox: + return QStringLiteral("android.widget.Spinner"); + case QAccessible::Role::Graphic: + // QQuickImage does not provide this role it inherits Client from QQuickItem + return QStringLiteral("android.widget.ImageView"); + case QAccessible::Role::Grouping: + return QStringLiteral("android.view.ViewGroup"); + case QAccessible::Role::List: + // As of android/accessibility/utils/Role.java::getRole a List + // is NOT android.widget.ListView + return QStringLiteral("android.widget.AbsListView"); + case QAccessible::Role::MenuItem: + return QStringLiteral("android.view.MenuItem"); + case QAccessible::Role::PopupMenu: + return QStringLiteral("android.widget.PopupMenu"); + case QAccessible::Role::Separator: + return QStringLiteral("android.widget.Space"); + case QAccessible::Role::ToolBar: + return QStringLiteral("android.view.Toolbar"); + case QAccessible::Role::Heading: [[fallthrough]]; + case QAccessible::Role::StaticText: + // Heading vs. regular Text is finally determined by AccessibilityNodeInfo.isHeading() + return QStringLiteral("android.widget.TextView"); + case QAccessible::Role::EditableText: + return QStringLiteral("android.widget.EditText"); + case QAccessible::Role::RadioButton: + return QStringLiteral("android.widget.RadioButton"); + case QAccessible::Role::ProgressBar: + return QStringLiteral("android.widget.ProgressBar"); + // Range information need to be filled to announce percentages + case QAccessible::Role::SpinBox: + return QStringLiteral("android.widget.NumberPicker"); + case QAccessible::Role::WebDocument: + return QStringLiteral("android.webkit.WebView"); + case QAccessible::Role::Dialog: + return QStringLiteral("android.app.AlertDialog"); + case QAccessible::Role::PageTab: + return QStringLiteral("android.app.ActionBar.Tab"); + case QAccessible::Role::PageTabList: + return QStringLiteral("android.widget.TabWidget"); + case QAccessible::Role::ScrollBar: [[fallthrough]]; + case QAccessible::Role::Slider: + return QStringLiteral("android.widget.SeekBar"); + case QAccessible::Role::Table: + // #TODO Evaluate the usage of AccessibleNodeInfo.setCollectionItemInfo() to provide + // infos about colums, rows und items. + return QStringLiteral("android.widget.GridView"); + case QAccessible::Role::Pane: + // #TODO QQuickScrollView, QQuickListView (see QTBUG-137806) + return QStringLiteral("android.view.ViewGroup"); + case QAccessible::Role::AlertMessage: + case QAccessible::Role::Animation: + case QAccessible::Role::Application: + case QAccessible::Role::Assistant: + case QAccessible::Role::BlockQuote: + case QAccessible::Role::Border: + case QAccessible::Role::ButtonDropGrid: + case QAccessible::Role::ButtonDropDown: + case QAccessible::Role::ButtonMenu: + case QAccessible::Role::Canvas: + case QAccessible::Role::Caret: + case QAccessible::Role::Cell: + case QAccessible::Role::Chart: + case QAccessible::Role::Client: + case QAccessible::Role::ColorChooser: + case QAccessible::Role::Column: + case QAccessible::Role::ColumnHeader: + case QAccessible::Role::ComplementaryContent: + case QAccessible::Role::Cursor: + case QAccessible::Role::Desktop: + case QAccessible::Role::Dial: + case QAccessible::Role::Document: + case QAccessible::Role::Equation: + case QAccessible::Role::Footer: + case QAccessible::Role::Form: + case QAccessible::Role::Grip: + case QAccessible::Role::HelpBalloon: + case QAccessible::Role::HotkeyField: + case QAccessible::Role::Indicator: + case QAccessible::Role::LayeredPane: + case QAccessible::Role::ListItem: + case QAccessible::Role::MenuBar: + case QAccessible::Role::NoRole: + case QAccessible::Role::Note: + case QAccessible::Role::Notification: + case QAccessible::Role::Paragraph: + case QAccessible::Role::PropertyPage: + case QAccessible::Role::Row: + case QAccessible::Role::RowHeader: + case QAccessible::Role::Section: + case QAccessible::Role::Sound: + case QAccessible::Role::Splitter: + case QAccessible::Role::StatusBar: + case QAccessible::Role::Terminal: + case QAccessible::Role::TitleBar: + case QAccessible::Role::ToolTip: + case QAccessible::Role::Tree: + case QAccessible::Role::TreeItem: + case QAccessible::Role::UserRole: + case QAccessible::Role::Whitespace: + case QAccessible::Role::Window: + // If unsure, every visible or interactive element in Android + // inherits android.view.View and by many extends also TextView. + // Android itself does a similar thing e.g. in its Settings-App. + return QStringLiteral("android.view.TextView"); + } + } + static QString descriptionForInterface(QAccessibleInterface *iface) { QString desc; @@ -513,6 +638,10 @@ namespace QtAndroidAccessibility return false; } + const QString role = classNameForRole(info.role, info.state); + jstring jrole = env->NewString((jchar*)role.constData(), (jsize)role.size()); + env->CallVoidMethod(node, m_setClassNameMethodID, jrole); + const bool hasClickableAction = info.actions.contains(QAccessibleActionInterface::pressAction()) || info.actions.contains(QAccessibleActionInterface::toggleAction()); @@ -590,6 +719,7 @@ namespace QtAndroidAccessibility } jclass nodeInfoClass = env->FindClass("android/view/accessibility/AccessibilityNodeInfo"); + GET_AND_CHECK_STATIC_METHOD(m_setClassNameMethodID, nodeInfoClass, "setClassName", "(Ljava/lang/CharSequence;)V"); GET_AND_CHECK_STATIC_METHOD(m_addActionMethodID, nodeInfoClass, "addAction", "(I)V"); GET_AND_CHECK_STATIC_METHOD(m_setCheckableMethodID, nodeInfoClass, "setCheckable", "(Z)V"); GET_AND_CHECK_STATIC_METHOD(m_setCheckedMethodID, nodeInfoClass, "setChecked", "(Z)V"); diff --git a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp index 9c10c1a998c..0b9db8039f1 100644 --- a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp @@ -79,8 +79,10 @@ void QEglFSContext::swapBuffers(QPlatformSurface *surface) // draw the cursor if (surface->surface()->surfaceClass() == QSurface::Window) { QPlatformWindow *window = static_cast<QPlatformWindow *>(surface); - if (QEglFSCursor *cursor = qobject_cast<QEglFSCursor *>(window->screen()->cursor())) - cursor->paintOnScreen(); + if (QPlatformScreen *screen = window->screen()) { + if (QEglFSCursor *cursor = qobject_cast<QEglFSCursor *>(screen->cursor())) + cursor->paintOnScreen(); + } } qt_egl_device_integration()->waitForVSync(surface); diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp index 4abe948117e..2f278a474e0 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp @@ -154,6 +154,7 @@ QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *wi if (!window->handle()) window->create(); static_cast<QEglFSWindow *>(window->handle())->setBackingStore(bs); + m_bs = bs; return bs; #else Q_UNUSED(window); @@ -175,6 +176,9 @@ QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWindow *window) const if (window->type() != Qt::ToolTip && window->screen() == QGuiApplication::primaryScreen()) w->requestActivateWindow(); + if (window->isTopLevel()) + w->setBackingStore(static_cast<QOpenGLCompositorBackingStore *>(m_bs)); + return w; } diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h index 2359b7f29f1..3865b7130b7 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration_p.h @@ -112,6 +112,7 @@ private: QScopedPointer<QFbVtHandler> m_vtHandler; QPointer<QWindow> m_pointerWindow; bool m_disableInputHandlers; + mutable QPlatformBackingStore *m_bs = nullptr; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor_p.h index a0f78bb3103..cca9097e2f0 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor_p.h @@ -62,6 +62,8 @@ public: void reevaluateVisibilityForScreens() { setPos(pos()); } + QEglFSKmsGbmScreen *screen() const { return m_screen; } + private: void initCursorAtlas(); diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp index a7592ed55e4..9f19e649f85 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp @@ -113,13 +113,27 @@ QPlatformScreen *QEglFSKmsGbmDevice::createScreen(const QKmsOutput &output) { QEglFSKmsGbmScreen *screen = new QEglFSKmsGbmScreen(this, output, false); - createGlobalCursor(screen); + + // On some platforms (e.g. rpi4), you'll get a kernel warning/error + // if the cursor is created 'at the same time' as the screen is created. + // (drmModeMoveCursor is the specific call that causes the issue) + // When this issue is triggered, the screen's connector is unusable until reboot + // + // Below is a work-around (without negative implications for other platforms). + // + // interval of 0 and QMetaObject::invokeMethod (w/o Qt::QueuedConnection) + // do no help / will still trigger issue + QTimer::singleShot(1, [screen, this](){ + createGlobalCursor(screen); + }); return screen; } QPlatformScreen *QEglFSKmsGbmDevice::createHeadlessScreen() { + destroyGlobalCursor(); + return new QEglFSKmsGbmScreen(this, QKmsOutput(), true); } @@ -127,9 +141,6 @@ void QEglFSKmsGbmDevice::registerScreenCloning(QPlatformScreen *screen, QPlatformScreen *screenThisScreenClones, const QList<QPlatformScreen *> &screensCloningThisScreen) { - if (!screenThisScreenClones && screensCloningThisScreen.isEmpty()) - return; - QEglFSKmsGbmScreen *gbmScreen = static_cast<QEglFSKmsGbmScreen *>(screen); gbmScreen->initCloning(screenThisScreenClones, screensCloningThisScreen); } @@ -144,6 +155,32 @@ void QEglFSKmsGbmDevice::registerScreen(QPlatformScreen *screen, m_globalCursor->reevaluateVisibilityForScreens(); } +void QEglFSKmsGbmDevice::unregisterScreen(QPlatformScreen *screen) +{ + // The global cursor holds a pointer to a QEglFSKmsGbmScreen. + // If that screen is being unregistered, + // this will recreate the global cursor with the first sibling screen. + if (m_globalCursor && screen == m_globalCursor->screen()) { + qCDebug(qLcEglfsKmsDebug) << "Destroying global GBM mouse cursor due to unregistering" + << "it's screen - will probably be recreated right away"; + delete m_globalCursor; + m_globalCursor = nullptr; + + QList<QPlatformScreen *> siblings = screen->virtualSiblings(); + siblings.removeOne(screen); + if (siblings.count() > 0) { + QEglFSKmsGbmScreen *kmsScreen = static_cast<QEglFSKmsGbmScreen *>(siblings.first()); + m_globalCursor = new QEglFSKmsGbmCursor(kmsScreen); + qCDebug(qLcEglfsKmsDebug) << "Creating new global GBM mouse cursor on sibling screen"; + } else { + qCWarning(qLcEglfsKmsDebug) << "Couldn't find a sibling to recreate" + << "the GBM mouse cursor - it might vanish"; + } + } + + QEglFSKmsDevice::unregisterScreen(screen); +} + bool QEglFSKmsGbmDevice::usesEventReader() const { static const bool eventReaderThreadDisabled = qEnvironmentVariableIntValue("QT_QPA_EGLFS_KMS_NO_EVENT_READER_THREAD"); diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice_p.h index e00992ed291..0ffed0ec4ef 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice_p.h @@ -51,6 +51,7 @@ public: bool isPrimary, const QPoint &virtualPos, const QList<QPlatformScreen *> &virtualSiblings) override; + void unregisterScreen(QPlatformScreen *screen) override; bool usesEventReader() const; QEglFSKmsEventReader *eventReader() { return &m_eventReader; } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp index 05ffb3b212e..eb61de3c534 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp @@ -11,6 +11,7 @@ #include "private/qeglfscursor_p.h" #include <QtCore/QLoggingCategory> +#include <QtCore/QFileSystemWatcher> #include <QtGui/QScreen> #include <QtDeviceDiscoverySupport/private/qdevicediscovery_p.h> @@ -23,6 +24,10 @@ QEglFSKmsGbmIntegration::QEglFSKmsGbmIntegration() qCDebug(qLcEglfsKmsDebug, "New DRM/KMS via GBM integration created"); } +QEglFSKmsGbmIntegration::~QEglFSKmsGbmIntegration() +{ +} + #ifndef EGL_EXT_platform_base typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list); #endif @@ -94,14 +99,16 @@ void QEglFSKmsGbmIntegration::presentBuffer(QPlatformSurface *surface) QKmsDevice *QEglFSKmsGbmIntegration::createDevice() { + + m_deviceDiscovery = std::unique_ptr<QDeviceDiscovery>(QDeviceDiscovery::create(QDeviceDiscovery::Device_VideoMask)); + m_kmsConfigWatcher = std::unique_ptr<QFileSystemWatcher>(new QFileSystemWatcher()); + QString path = screenConfig()->devicePath(); if (!path.isEmpty()) { qCDebug(qLcEglfsKmsDebug) << "GBM: Using DRM device" << path << "specified in config file"; } else { - QDeviceDiscovery *d = QDeviceDiscovery::create(QDeviceDiscovery::Device_VideoMask); - const QStringList devices = d->scanConnectedDevices(); + const QStringList devices = m_deviceDiscovery->scanConnectedDevices(); qCDebug(qLcEglfsKmsDebug) << "Found the following video devices:" << devices; - d->deleteLater(); if (Q_UNLIKELY(devices.isEmpty())) qFatal("Could not find DRM device!"); @@ -110,6 +117,35 @@ QKmsDevice *QEglFSKmsGbmIntegration::createDevice() qCDebug(qLcEglfsKmsDebug) << "Using" << path; } + bool hotreload = !qEnvironmentVariable("QT_QPA_EGLFS_HOTPLUG_ENABLED").isEmpty(); + if (hotreload) { + qCWarning(qLcEglfsKmsDebug) << "EGLFS/KMS: Hot-Reload on KMS-events enabled, be aware that" + << "this requires actions in UI code for proper functionallity" + << "(e.g. close/open windows on screen's disconnect/connect)"; + QObject::connect(m_deviceDiscovery.get(), &QDeviceDiscovery::deviceChanged, + m_deviceDiscovery.get(), [this](const QString &deviceNode) { + qCDebug(qLcEglfsKmsDebug) << "KMS device changed:" << deviceNode; + m_device->checkConnectedScreens(); + }); + } + + QString json = qEnvironmentVariable("QT_QPA_EGLFS_KMS_CONFIG"); + if (json.isEmpty()) + json = qEnvironmentVariable("QT_QPA_KMS_CONFIG"); + + if (!json.isEmpty()) { + m_kmsConfigWatcher->addPath(json); + QObject::connect(m_kmsConfigWatcher.get(), &QFileSystemWatcher::fileChanged, + m_kmsConfigWatcher.get(), [this, json]() { + qCDebug(qLcEglfsKmsDebug) << "KMS config-file has changed! path:" + << json; + m_screenConfig->refreshConfig(); + m_device->updateScreens(); + m_kmsConfigWatcher->addPath(json); // as per QFileSystemWatcher doc we have to re-add + // the path in case it's a new file + }); + } + return new QEglFSKmsGbmDevice(screenConfig(), path); } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration_p.h index fb118438d25..7c2c2a474d7 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration_p.h @@ -24,11 +24,14 @@ QT_BEGIN_NAMESPACE class QEglFSKmsDevice; +class QDeviceDiscovery; +class QFileSystemWatcher; class Q_EGLFS_EXPORT QEglFSKmsGbmIntegration : public QEglFSKmsIntegration { public: QEglFSKmsGbmIntegration(); + ~QEglFSKmsGbmIntegration() override; EGLDisplay createDisplay(EGLNativeDisplayType nativeDisplay) override; EGLNativeWindowType createNativeOffscreenWindow(const QSurfaceFormat &format) override; @@ -42,6 +45,8 @@ protected: QKmsDevice *createDevice() override; private: + std::unique_ptr<QDeviceDiscovery> m_deviceDiscovery; + std::unique_ptr<QFileSystemWatcher> m_kmsConfigWatcher; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp index 00fecb87f1f..332030f03f2 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp @@ -20,7 +20,7 @@ QT_BEGIN_NAMESPACE -QMutex QEglFSKmsGbmScreen::m_nonThreadedFlipMutex; +QMutex QEglFSKmsGbmScreen::s_nonThreadedFlipMutex; static inline uint32_t drmFormatToGbmFormat(uint32_t drmFormat) { @@ -92,9 +92,26 @@ QEglFSKmsGbmScreen::QEglFSKmsGbmScreen(QEglFSKmsDevice *device, const QKmsOutput QEglFSKmsGbmScreen::~QEglFSKmsGbmScreen() { const int remainingScreenCount = qGuiApp->screens().count(); - qCDebug(qLcEglfsKmsDebug, "Screen dtor. Remaining screens: %d", remainingScreenCount); + qCDebug(qLcEglfsKmsDebug, "Screen dtor. %p Remaining screens: %d", this, remainingScreenCount); if (!remainingScreenCount && !device()->screenConfig()->separateScreens()) static_cast<QEglFSKmsGbmDevice *>(device())->destroyGlobalCursor(); + + if (m_cloneSource) { + // Remove this screen from the screen that has it as a clone destination + QList<CloneDestination> &dests = m_cloneSource->m_cloneDests; + auto newEnd = std::remove_if(dests.begin(), dests.end(), + [this](CloneDestination &dest) { + return dest.screen == this; + }); + dests.erase(newEnd, dests.end()); + } + + // Other screens can no longer have this screen as a clone source + for (CloneDestination &dest : m_cloneDests) { + dest.screen->m_cloneSource = nullptr; + // Mode must be set again before flipping + dest.screen->m_output.mode_set = false; + } } QPlatformCursor *QEglFSKmsGbmScreen::cursor() const @@ -206,9 +223,12 @@ void QEglFSKmsGbmScreen::initCloning(QPlatformScreen *screenThisScreenClones, if (clonesAnother) { m_cloneSource = static_cast<QEglFSKmsGbmScreen *>(screenThisScreenClones); qCDebug(qLcEglfsKmsDebug, "Screen %s clones %s", qPrintable(name()), qPrintable(m_cloneSource->name())); + } else { + m_cloneSource = nullptr; } // clone sources need to know their additional destinations + m_cloneDests.clear(); for (QPlatformScreen *s : screensCloningThisScreen) { CloneDestination d; d.screen = static_cast<QEglFSKmsGbmScreen *>(s); @@ -271,8 +291,11 @@ void QEglFSKmsGbmScreen::nonThreadedPageFlipHandler(int fd, // note that with cloning involved this callback is called also for screens that clone another one Q_UNUSED(fd); QEglFSKmsGbmScreen *screen = static_cast<QEglFSKmsGbmScreen *>(user_data); - screen->flipFinished(); - screen->pageFlipped(sequence, tv_sec, tv_usec); + // The screen might have been deleted when DRM calls this handler + if (QEglFSKmsScreen::isScreenKnown(screen)) { + screen->flipFinished(); + screen->pageFlipped(sequence, tv_sec, tv_usec); + } } void QEglFSKmsGbmScreen::waitForFlipWithEventReader(QEglFSKmsGbmScreen *screen) @@ -280,7 +303,21 @@ void QEglFSKmsGbmScreen::waitForFlipWithEventReader(QEglFSKmsGbmScreen *screen) m_flipMutex.lock(); QEglFSKmsGbmDevice *dev = static_cast<QEglFSKmsGbmDevice *>(device()); dev->eventReader()->startWaitFlip(screen, &m_flipMutex, &m_flipCond); - m_flipCond.wait(&m_flipMutex); + + // We should only wait forever on this screen, clones should have a timeout + // (e.g. I clone might have been created just before the flip, + // we might wait for it but it might not know about waking us up) + bool succ = false; + if (screen == this) + succ = m_flipCond.wait(&m_flipMutex); + else + succ = m_flipCond.wait(&m_flipMutex, 300); + + if (!succ) + qCWarning(qLcEglfsKmsDebug) << "timeout on waitForFlipWithEventReader, screen to wait for:" + << screen << ", screen waiting (shouldn't be the same screen):" + << this; + m_flipMutex.unlock(); screen->flipFinished(); } @@ -306,7 +343,7 @@ void QEglFSKmsGbmScreen::waitForFlip() waitForFlipWithEventReader(d.screen); } } else { - QMutexLocker lock(&m_nonThreadedFlipMutex); + QMutexLocker lock(&s_nonThreadedFlipMutex); while (m_gbm_bo_next) { drmEventContext drmEvent; memset(&drmEvent, 0, sizeof(drmEvent)); @@ -359,15 +396,10 @@ static void addAtomicFlip(drmModeAtomicReq *request, const QKmsOutput &output, u void QEglFSKmsGbmScreen::flip() { - // For headless screen just return silently. It is not necessarily an error + // For headless or cloned screen just return silently. It is not necessarily an error // to end up here, so show no warnings. - if (m_headless) - return; - - if (m_cloneSource) { - qWarning("Screen %s clones another screen. swapBuffers() not allowed.", qPrintable(name())); + if (m_headless || m_cloneSource) return; - } if (!m_gbm_surface) { qWarning("Cannot sync before platform init!"); diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen_p.h index aca34fcae21..65625a3c1cd 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen_p.h @@ -67,7 +67,7 @@ protected: QMutex m_flipMutex; QWaitCondition m_flipCond; - static QMutex m_nonThreadedFlipMutex; + static QMutex s_nonThreadedFlipMutex; QScopedPointer<QEglFSKmsGbmCursor> m_cursor; diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp index ece19f46a49..ff4921c2b15 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp @@ -213,9 +213,13 @@ QEglFSWindow *QEglFSKmsEglDeviceIntegration::createWindow(QWindow *window) const QEglFSKmsEglDeviceWindow *eglWindow = new QEglFSKmsEglDeviceWindow(window, this); m_funcs->initialize(eglWindow->screen()->display()); - if (Q_UNLIKELY(!(m_funcs->has_egl_output_base && m_funcs->has_egl_output_drm && m_funcs->has_egl_stream && - m_funcs->has_egl_stream_producer_eglsurface && m_funcs->has_egl_stream_consumer_egloutput))) + if (Q_UNLIKELY(!(m_funcs->has_egl_output_base && m_funcs->has_egl_output_drm + && m_funcs->has_egl_stream && m_funcs->has_egl_stream_producer_eglsurface + && m_funcs->has_egl_stream_consumer_egloutput))) { + qCDebug(qLcEglfsKmsDebug, "EGL_EXTENSIONS %s", + eglQueryString(eglWindow->screen()->display(), EGL_EXTENSIONS)); qFatal("Required extensions missing!"); + } return eglWindow; } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp index 5af45e63a2f..5775ac3607a 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp @@ -71,7 +71,7 @@ QEglFSKmsEglDeviceScreen::~QEglFSKmsEglDeviceScreen() } const int remainingScreenCount = qGuiApp->screens().size(); - qCDebug(qLcEglfsKmsDebug, "Screen dtor. Remaining screens: %d", remainingScreenCount); + qCDebug(qLcEglfsKmsDebug, "Screen dtor. %p Remaining screens: %d", this, remainingScreenCount); if (!remainingScreenCount && !device()->screenConfig()->separateScreens()) static_cast<QEglFSKmsEglDevice *>(device())->destroyGlobalCursor(); } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp index 037b26f023e..59ca53355d6 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp @@ -25,4 +25,39 @@ void QEglFSKmsDevice::registerScreen(QPlatformScreen *screen, QWindowSystemInterface::handleScreenAdded(s, isPrimary); } +void QEglFSKmsDevice::unregisterScreen(QPlatformScreen *screen) +{ + QEglFSKmsScreen *s = static_cast<QEglFSKmsScreen *>(screen); + for (QPlatformScreen *sibling : s->virtualSiblings()) + static_cast<QEglFSKmsScreen *>(sibling)->removeSibling(s); + + QWindowSystemInterface::handleScreenRemoved(screen); +} + +void QEglFSKmsDevice::updateScreen(QPlatformScreen *screen, const QPoint &virtualPos, + const QList<QPlatformScreen *> &virtualSiblings) +{ + QEglFSKmsScreen *s = static_cast<QEglFSKmsScreen *>(screen); + QRect before = s->geometry(); + s->setVirtualPosition(virtualPos); + s->setVirtualSiblings(virtualSiblings); + QRect after = s->geometry(); + + if (before != after) + QWindowSystemInterface::handleScreenGeometryChange(s->screen(), after, + s->availableGeometry()); +} + +void QEglFSKmsDevice::updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output) +{ + QEglFSKmsScreen *s = static_cast<QEglFSKmsScreen *>(screen); + QRect before = s->geometry(); + s->updateOutput(output); + QRect after = s->geometry(); + + if (before != after) + QWindowSystemInterface::handleScreenGeometryChange(s->screen(), after, + s->availableGeometry()); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice_p.h index 6e11953a699..49b82d8baad 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice_p.h @@ -30,6 +30,13 @@ public: bool isPrimary, const QPoint &virtualPos, const QList<QPlatformScreen *> &virtualSiblings) override; + + void unregisterScreen(QPlatformScreen *screen) override; + + void updateScreen(QPlatformScreen *screen, const QPoint &virtualPos, + const QList<QPlatformScreen *> &virtualSiblings) override; + + void updateScreenOutput(QPlatformScreen *screen, const QKmsOutput &output) override; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmseventreader.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmseventreader.cpp index c0c96554962..fa735388bc0 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmseventreader.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmseventreader.cpp @@ -20,7 +20,10 @@ static void pageFlipHandler(int fd, unsigned int sequence, unsigned int tv_sec, t->eventHost()->handlePageFlipCompleted(user_data); QEglFSKmsScreen *screen = static_cast<QEglFSKmsScreen *>(user_data); - screen->pageFlipped(sequence, tv_sec, tv_usec); + if (QEglFSKmsScreen::isScreenKnown(screen)) + screen->pageFlipped(sequence, tv_sec, tv_usec); + else + qWarning("Deleted screen got it's pageFlipHandler called; Dead pointer: %p", user_data); } class RegisterWaitFlipEvent : public QEvent diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp index cc7381fb701..a40287bdfed 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp @@ -16,6 +16,8 @@ QT_BEGIN_NAMESPACE +QSet<QEglFSKmsScreen *> QEglFSKmsScreen::s_screens; + class QEglFSKmsInterruptHandler : public QObject { public: @@ -59,10 +61,14 @@ QEglFSKmsScreen::QEglFSKmsScreen(QEglFSKmsDevice *device, const QKmsOutput &outp } else { qCDebug(qLcEglfsKmsDebug) << "No EDID data for output" << name(); } + + s_screens.insert(this); } QEglFSKmsScreen::~QEglFSKmsScreen() { + s_screens.remove(this); + m_output.cleanup(m_device); delete m_interruptHandler; } @@ -166,6 +172,11 @@ void QEglFSKmsScreen::waitForFlip() { } +void QEglFSKmsScreen::updateOutput(QKmsOutput output) +{ + m_output = output; +} + void QEglFSKmsScreen::restoreMode() { m_output.restoreMode(m_device); @@ -180,6 +191,11 @@ qreal QEglFSKmsScreen::refreshRate() const return refresh > 0 ? refresh : 60; } +void QEglFSKmsScreen::removeSibling(QPlatformScreen *screen) +{ + m_siblings.removeAll(screen); +} + QList<QPlatformScreen::Mode> QEglFSKmsScreen::modes() const { QList<QPlatformScreen::Mode> list; @@ -227,4 +243,9 @@ void QEglFSKmsScreen::pageFlipped(unsigned int sequence, unsigned int tv_sec, un Q_UNUSED(tv_usec); } +bool QEglFSKmsScreen::isScreenKnown(QEglFSKmsScreen *s) +{ + return s_screens.contains(s); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen_p.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen_p.h index 6fb1f9a1348..2dc49152a97 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen_p.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen_p.h @@ -58,6 +58,7 @@ public: QList<QPlatformScreen *> virtualSiblings() const override { return m_siblings; } void setVirtualSiblings(QList<QPlatformScreen *> sl) { m_siblings = sl; } + void removeSibling(QPlatformScreen *screen); QList<QPlatformScreen::Mode> modes() const override; @@ -68,6 +69,7 @@ public: virtual void waitForFlip(); + void updateOutput(QKmsOutput output); QKmsOutput &output() { return m_output; } void restoreMode(); @@ -80,6 +82,8 @@ public: void setCursorOutOfRange(bool b) { m_cursorOutOfRange = b; } virtual void pageFlipped(unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec); + static bool isScreenKnown(QEglFSKmsScreen *s); + protected: QEglFSKmsDevice *m_device; @@ -95,6 +99,8 @@ protected: QEglFSKmsInterruptHandler *m_interruptHandler; bool m_headless; + + static QSet<QEglFSKmsScreen *> s_screens; }; QT_END_NAMESPACE diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index 7179109505b..3f40dea5eb9 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -1662,7 +1662,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } case CE_ItemViewItem: { if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) { - if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) { + if (qobject_cast<const QAbstractItemView *>(widget)) { QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget); QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget); @@ -1764,10 +1764,10 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off; vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state); - if (!view || !view->isPersistentEditorOpen(vopt->index)) { - painter->setPen(highlightCurrent && highContrastTheme ? vopt->palette.base().color() : option->palette.text().color()); - d->viewItemDrawText(painter, vopt, textRect); - } + painter->setPen(highlightCurrent && highContrastTheme ? vopt->palette.base().color() + : vopt->palette.text().color()); + d->viewItemDrawText(painter, vopt, textRect); + // paint a vertical marker for QListView if (vopt->state & State_Selected) { if (const QListView *lv = qobject_cast<const QListView *>(widget); diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index f4aa45be73e..53cc849e23c 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1176,10 +1176,10 @@ class WatchDog : public QThread public: WatchDog() + : expecting{ThreadStart} { setObjectName("QtTest Watchdog"_L1); auto locker = qt_unique_lock(mutex); - expecting.store(ThreadStart, std::memory_order_relaxed); start(); waitFor(locker, ThreadStart); } diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index f41242f357d..29cafe9aea4 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -77,14 +77,14 @@ namespace { class LoggerRegistry { using LoggersContainer = std::vector<std::shared_ptr<QAbstractTestLogger>>; - using SharedLoggersContainer = std::shared_ptr<LoggersContainer>; + using SharedLoggersContainer = std::shared_ptr<const LoggersContainer>; public: void addLogger(std::unique_ptr<QAbstractTestLogger> logger) { // read/update/clone const SharedLoggersContainer currentLoggers = load(); - SharedLoggersContainer newLoggers = currentLoggers + auto newLoggers = currentLoggers ? std::make_shared<LoggersContainer>(*currentLoggers) : std::make_shared<LoggersContainer>(); newLoggers->emplace_back(std::move(logger)); @@ -115,20 +115,20 @@ public: private: #ifdef __cpp_lib_atomic_shared_ptr - SharedLoggersContainer load() const { return loggers.load(std::memory_order_relaxed); } + SharedLoggersContainer load() const { return loggers.load(std::memory_order_acquire); } void store(SharedLoggersContainer newLoggers) { - loggers.store(std::move(newLoggers), std::memory_order_relaxed); + loggers.store(std::move(newLoggers), std::memory_order_release); } - std::atomic<SharedLoggersContainer> loggers; + std::atomic<SharedLoggersContainer> loggers = nullptr; #else SharedLoggersContainer load() const { - return std::atomic_load_explicit(&loggers, std::memory_order_relaxed); + return std::atomic_load_explicit(&loggers, std::memory_order_acquire); } void store(SharedLoggersContainer newLoggers) { - std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_relaxed); + std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_release); } SharedLoggersContainer loggers; #endif diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index 39da1538376..190c7b624f6 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -289,19 +289,32 @@ QToolButton *QAccessibleToolButton::toolButton() const bool QAccessibleToolButton::isSplitButton() const { #if QT_CONFIG(menu) - return toolButton()->menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup; + return menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup; #else return false; #endif } +#if QT_CONFIG(menu) +QMenu *QAccessibleToolButton::menu() const +{ + if (QMenu *menu = toolButton()->menu()) + return menu; + + if (QAction *defaultAction = toolButton()->defaultAction()) + return defaultAction->menu(); + + return nullptr; +} +#endif + QAccessible::State QAccessibleToolButton::state() const { QAccessible::State st = QAccessibleButton::state(); if (toolButton()->autoRaise()) st.hotTracked = true; #if QT_CONFIG(menu) - if (toolButton()->menu()) + if (menu()) st.hasPopup = true; #endif return st; @@ -315,9 +328,8 @@ int QAccessibleToolButton::childCount() const QAccessible::Role QAccessibleToolButton::role() const { #if QT_CONFIG(menu) - QAbstractButton *ab = button(); - QToolButton *tb = qobject_cast<QToolButton*>(ab); - if (!tb->menu()) + QToolButton *tb = toolButton(); + if (!menu()) return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton; else if (tb->popupMode() == QToolButton::DelayedPopup) return QAccessible::ButtonDropDown; @@ -329,10 +341,8 @@ QAccessible::Role QAccessibleToolButton::role() const QAccessibleInterface *QAccessibleToolButton::child(int index) const { #if QT_CONFIG(menu) - if (index == 0 && toolButton()->menu()) - { - return QAccessible::queryAccessibleInterface(toolButton()->menu()); - } + if (index == 0 && menu()) + return QAccessible::queryAccessibleInterface(menu()); #else Q_UNUSED(index); #endif diff --git a/src/widgets/accessible/simplewidgets_p.h b/src/widgets/accessible/simplewidgets_p.h index 02c23f8cba7..356ef9101b2 100644 --- a/src/widgets/accessible/simplewidgets_p.h +++ b/src/widgets/accessible/simplewidgets_p.h @@ -27,6 +27,7 @@ class QAbstractButton; class QLineEdit; class QToolButton; class QGroupBox; +class QMenu; class QMessageBox; class QProgressBar; @@ -71,6 +72,9 @@ protected: QToolButton *toolButton() const; bool isSplitButton() const; +#if QT_CONFIG(menu) + QMenu *menu() const; +#endif }; #endif // QT_CONFIG(toolbutton) diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index ed6f6f6193b..a1a4cfc2ce0 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -147,7 +147,7 @@ QDebug operator<<(QDebug debug, const QDockAreaLayout &layout) QDebug operator<<(QDebug debug, const QMainWindowLayout *layout) { if (layout) - return debug << layout->layoutState.dockAreaLayout; + return std::move(debug) << layout->layoutState.dockAreaLayout; return debug << "QMainWindowLayout(0x0)"; } @@ -2673,8 +2673,10 @@ void QMainWindowLayout::animationFinished(QWidget *widget) parentWidget()->update(layoutState.dockAreaLayout.separatorRegion()); #if QT_CONFIG(tabbar) const auto usedTabBarsCopy = usedTabBars; // list potentially modified by animations - for (QTabBar *tab_bar : usedTabBarsCopy) - tab_bar->show(); + for (QTabBar *tab_bar : usedTabBarsCopy) { + if (usedTabBars.contains(tab_bar)) // Showing a tab bar can cause another to be deleted. + tab_bar->show(); + } #endif // QT_CONFIG(tabbar) #endif // QT_CONFIG(dockwidget) } diff --git a/src/widgets/widgets/qscrollbar.cpp b/src/widgets/widgets/qscrollbar.cpp index 431faf9e24d..af7a2e011b8 100644 --- a/src/widgets/widgets/qscrollbar.cpp +++ b/src/widgets/widgets/qscrollbar.cpp @@ -382,7 +382,7 @@ QMenu *QScrollBar::createStandardContextMenu(QPoint position) { #if QT_CONFIG(menu) const bool horiz = HORIZONTAL; - QMenu *menu = new QMenu(); + QMenu *menu = new QMenu(this); menu->setObjectName("qt_scrollbar_menu"_L1); if (window() && window()->windowHandle()) { diff --git a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp index 5a49d9cf024..878fd173675 100644 --- a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp +++ b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp @@ -286,6 +286,7 @@ private slots: void ranges(); void json(); void ownership(); + void overrideRoleNames(); void dimensions_data() { createTestData(); } void dimensions(); @@ -1008,6 +1009,45 @@ void tst_QRangeModel::ownership() } } +void tst_QRangeModel::overrideRoleNames() +{ + // verify that an overridden roleNames() gets called consistently + class RoleModel : public QRangeModel + { + public: + RoleModel() : QRangeModel(QList<SingleColumn<Object *>>{ + new Object, + new Object, + new Object, + }) { + } + + QHash<int, QByteArray> roleNames() const override + { + return { + {Qt::UserRole, "string"}, + {Qt::UserRole + 1, "number"} + }; + } + }; + + RoleModel model; + const QList<int> expectedKeys = {Qt::UserRole, Qt::UserRole + 1}; + QCOMPARE(model.roleNames().size(), expectedKeys.size()); + + const QModelIndex index = model.index(0, 0); + QVERIFY(model.setData(index, "string value", Qt::UserRole)); + QVERIFY(model.setData(index, 42, Qt::UserRole + 1)); + QVERIFY(!model.setData(index, "display")); + + const auto itemData = model.itemData(index); + QCOMPARE(itemData.keys(), expectedKeys); + QCOMPARE(itemData.value(Qt::UserRole), "string value"); + QCOMPARE(itemData.value(Qt::UserRole + 1), 42); + + QVERIFY(model.setItemData(model.index(1, 0), itemData)); +} + void tst_QRangeModel::dimensions() { QFETCH(Factory, factory); diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index f8f978585a1..83ce49d93ba 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -2395,6 +2395,9 @@ void tst_QMetaObject::normalizedType_data() QTest::addColumn<QString>("type"); QTest::addColumn<QString>("result"); + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << "" << ""; + QTest::newRow("all_whitespaces") << " " << ""; QTest::newRow("simple") << "int" << "int"; QTest::newRow("white") << " int " << "int"; QTest::newRow("const1") << "int const *" << "const int*"; @@ -2465,7 +2468,15 @@ void tst_QMetaObject::normalizedType() QFETCH(QString, type); QFETCH(QString, result); - QCOMPARE(QMetaObject::normalizedType(type.toLatin1()), result.toLatin1()); + QByteArray latin1Type = type.toLatin1(); + + const char *typePtr; + if (type.isNull()) + typePtr = nullptr; + else + typePtr = latin1Type.constData(); + + QCOMPARE(QMetaObject::normalizedType(typePtr), result.toLatin1()); QCOMPARE(QMetaObject::normalizedType(result.toLatin1()), result.toLatin1()); } diff --git a/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp b/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp index f66bea72828..d53d0d1713d 100644 --- a/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp +++ b/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp @@ -16,6 +16,23 @@ using namespace std::chrono_literals; +class Interface +{ +public: + virtual ~Interface() = default; + virtual void meep() const = 0; +}; + +class ObjectImplementingInterface : public QObject, public Interface +{ + Q_OBJECT +public: + using QObject::QObject; + +public Q_SLOTS: + void meep() const override {} +}; + class tst_QPointer : public QObject { Q_OBJECT @@ -31,6 +48,7 @@ private slots: void assignment_operators(); void compareCompiles(); void equality_operators(); + void equality_operators_interface(); void swap(); void isNull(); void dereference_operators(); @@ -218,6 +236,7 @@ void tst_QPointer::compareCompiles() QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, QWidget*>(); QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, QPointer<QWidget>>(); QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, std::nullptr_t>(); + QTestPrivate::testEqualityOperatorsCompile<QPointer<ObjectImplementingInterface>, Interface*>(); } void tst_QPointer::equality_operators() @@ -259,6 +278,25 @@ void tst_QPointer::equality_operators() #endif } +void tst_QPointer::equality_operators_interface() +{ + QObject reaper; + QPointer<ObjectImplementingInterface> p(new ObjectImplementingInterface(&reaper)); + Interface *i = p.get(); + + ObjectImplementingInterface otherP; + Interface *otherI = &otherP; + + // things that are equal + QT_TEST_EQUALITY_OPS(p, p, true); + QT_TEST_EQUALITY_OPS(p, i, true); + + // things that are not equal + QT_TEST_EQUALITY_OPS(p, nullptr, false); + QT_TEST_EQUALITY_OPS(p, &otherP, false); + QT_TEST_EQUALITY_OPS(p, otherI, false); +} + void tst_QPointer::swap() { QPointer<QObject> c1, c2; diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index 35eda3ad709..3756937c94a 100644 --- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp @@ -445,14 +445,16 @@ void tst_QLocale::defaulted_ctor() TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates); TEST_CTOR(English, France, QLocale::English, QLocale::France); TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom); + // Used in tests below to check we pick the likely-best substitute consistently: + TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt); TEST_CTOR(French, France, QLocale::French, QLocale::France); TEST_CTOR(C, France, QLocale::C, QLocale::AnyTerritory); TEST_CTOR(Spanish, LatinAmerica, QLocale::Spanish, QLocale::LatinAmerica); - QLocale::setDefault(QLocale(QLocale::English, QLocale::France)); - CHECK_DEFAULT(QLocale::English, QLocale::France); + QLocale::setDefault(QLocale(QLocale::Arabic, QLocale::UnitedStates)); + CHECK_DEFAULT(QLocale::Arabic, QLocale::Egypt); TEST_CTOR(French, France, QLocale::French, QLocale::France); TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom); @@ -460,7 +462,7 @@ void tst_QLocale::defaulted_ctor() TEST_CTOR(French, France, QLocale::French, QLocale::France); TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory); TEST_CTOR(C, France, QLocale::C, QLocale::AnyTerritory); - TEST_CTOR(Aymara, AnyTerritory, QLocale::English, QLocale::France); + TEST_CTOR(Aymara, AnyTerritory, QLocale::Arabic, QLocale::Egypt); QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedKingdom)); CHECK_DEFAULT(QLocale::English, QLocale::UnitedKingdom); @@ -481,6 +483,7 @@ void tst_QLocale::defaulted_ctor() TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates); TEST_CTOR(English, France, QLocale::English, QLocale::France); TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom); + TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt); TEST_CTOR(French, France, QLocale::French, QLocale::France); TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory); @@ -496,6 +499,7 @@ void tst_QLocale::defaulted_ctor() TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates); TEST_CTOR(English, France, QLocale::English, QLocale::France); TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom); + TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt); TEST_CTOR(French, France, QLocale::French, QLocale::France); TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory); diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 5804aeeb1e5..87d48d56e6b 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -73,22 +73,22 @@ void tst_QArrayData::referenceCounting() // Reference counting initialized to 1 (owned) QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(1), {}, 0 }; - QCOMPARE(array.ref_.loadRelaxed(), 1); + QCOMPARE(array.m_ref.loadRelaxed(), 1); QVERIFY(array.ref()); - QCOMPARE(array.ref_.loadRelaxed(), 2); + QCOMPARE(array.m_ref.loadRelaxed(), 2); QVERIFY(array.deref()); - QCOMPARE(array.ref_.loadRelaxed(), 1); + QCOMPARE(array.m_ref.loadRelaxed(), 1); QVERIFY(array.ref()); - QCOMPARE(array.ref_.loadRelaxed(), 2); + QCOMPARE(array.m_ref.loadRelaxed(), 2); QVERIFY(array.deref()); - QCOMPARE(array.ref_.loadRelaxed(), 1); + QCOMPARE(array.m_ref.loadRelaxed(), 1); QVERIFY(!array.deref()); - QCOMPARE(array.ref_.loadRelaxed(), 0); + QCOMPARE(array.m_ref.loadRelaxed(), 0); // Now would be a good time to free/release allocated data } diff --git a/tests/auto/testlib/selftests/CMakeLists.txt b/tests/auto/testlib/selftests/CMakeLists.txt index bd2d42ec7cb..9d013e6f757 100644 --- a/tests/auto/testlib/selftests/CMakeLists.txt +++ b/tests/auto/testlib/selftests/CMakeLists.txt @@ -51,7 +51,6 @@ qt_internal_apply_testlib_coverage_options(tst_selftests) set(subprograms assert badxml - benchlibcallgrind benchlibcounting benchlibeventcounter benchliboptions @@ -112,6 +111,14 @@ set(subprograms watchdog ) +if(NOT QT_FEATURE_sanitize_address) + list(APPEND subprograms + # valgrind and asan are incompatible: + # "ASan runtime does not come first in initial library list;" + benchlibcallgrind + ) +endif() + if(FEATURE_cxx20) list(APPEND subprograms threewaycompare diff --git a/util/locale_database/cldr2qlocalexml.py b/util/locale_database/cldr2qlocalexml.py index d4ba6960517..0aa04b64b05 100755 --- a/util/locale_database/cldr2qlocalexml.py +++ b/util/locale_database/cldr2qlocalexml.py @@ -83,7 +83,7 @@ def main(argv: list[str], out: TextIO, err: TextIO) -> int: parser.error(f'Please use a .xml extension on your output file name, not {xml}') else: try: - emit = open(xml, 'w') + emit = open(xml, 'w', encoding="utf-8") except IOError as e: parser.error(f'Failed to open "{xml}" to write output to it') diff --git a/util/locale_database/localetools.py b/util/locale_database/localetools.py index 10937df5485..818880d6efa 100644 --- a/util/locale_database/localetools.py +++ b/util/locale_database/localetools.py @@ -110,7 +110,7 @@ def AtomicRenameTemporaryFile(originalLocation: Path, *, prefix: str, dir: Path) On success closes the temporary file and moves its content to the original location. On error, removes temporary file, without disturbing the original. """ - tempFile = NamedTemporaryFile('w', prefix=prefix, dir=dir, delete=False) + tempFile = NamedTemporaryFile('w', prefix=prefix, dir=dir, delete=False, encoding='utf-8') try: yield tempFile tempFile.close() @@ -174,7 +174,7 @@ class Transcriber: self.writer = resources.enter_context( AtomicRenameTemporaryFile(self.path, prefix=self.path.name, dir=self.tempDir)) # Open the old file - self.reader = resources.enter_context(open(self.path)) + self.reader = resources.enter_context(open(self.path, encoding='utf-8')) self.onEnter() |