diff options
511 files changed, 7798 insertions, 2902 deletions
diff --git a/cmake/FindBundletool.cmake b/cmake/FindBundletool.cmake new file mode 100644 index 00000000000..f691b27da89 --- /dev/null +++ b/cmake/FindBundletool.cmake @@ -0,0 +1,48 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +#.rst: +# FindBundletool +# --------- +# +# Try to locate the android bundletool. +# If found, this will define the following variables: +# +# ``Bundletool_FOUND`` +# True if the Bundletool is found +# +# ``Bundletool_EXECUTABLE `` +# Path to the Bundletool executable +# +# If ``Bundletool_FOUND`` is TRUE, it will also define the following +# imported target: +# +# ``Bundletool::Bundletool`` +# The Bundletool executable + +if(DEFINED ENV{Bundletool_EXECUTABLE}) + if((NOT Bundletool_EXECUTABLE OR NOT EXISTS "${Bundletool_EXECUTABLE}") + AND EXISTS "$ENV{Bundletool_EXECUTABLE}") + set(_Bundletool_use_force FORCE) + else() + set(_Bundletool_use_force "") + endif() + set(Bundletool_EXECUTABLE "$ENV{Bundletool_EXECUTABLE}" CACHE FILEPATH + "Path to the 'bundletool' executable." ${_Bundletool_use_force}) + unset(_Bundletool_use_force) +endif() + +find_file(Bundletool_EXECUTABLE bundletool bundletool.jar) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Bundletool DEFAULT_MSG Bundletool_EXECUTABLE) + +if(Bundletool_FOUND) + if(NOT TARGET Bundletool::Bundletool) + add_executable(Bundletool::Bundletool IMPORTED) + set_target_properties(Bundletool::Bundletool PROPERTIES + IMPORTED_LOCATION "${Bundletool_EXECUTABLE}") + endif() +endif() + +mark_as_advanced(Bundletool_EXECUTABLE) diff --git a/cmake/QtAndroidHelpers.cmake b/cmake/QtAndroidHelpers.cmake index 64696fff6d4..cb7d4716f12 100644 --- a/cmake/QtAndroidHelpers.cmake +++ b/cmake/QtAndroidHelpers.cmake @@ -473,3 +473,33 @@ function(qt_internal_create_source_jar) add_dependencies(install_android_source_jar_${module} ${jar_target}) add_dependencies(install_android_source_jars install_android_source_jar_${module}) endfunction() + +# The function stores Android permissions that are required by the module target. +# The stored INTERFACE_QT_ANDROID_PERMISSIONS is the transitive property. +function(qt_internal_android_add_interface_permissions target) + get_target_property(permissions ${target} QT_ANDROID_PERMISSIONS) + if(NOT permissions) + return() + endif() + + set(postprocessed_permissions "") + foreach(permission IN LISTS permissions) + # TODO: skip processing extras for now, add them back once internal API + # will cover adding extras using internal function. + list(APPEND postprocessed_permissions "name\;${permission}") + endforeach() + qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES + INTERFACE_QT_ANDROID_PERMISSIONS "${postprocessed_permissions}") +endfunction() + +# The function stores Android features that are required by the module target. +# The stored INTERFACE_QT_ANDROID_FEATURES is the transitive property. +function(qt_internal_android_add_interface_features target) + get_target_property(features ${target} QT_ANDROID_FEATURES) + if(NOT features) + return() + endif() + + qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES + INTERFACE_QT_ANDROID_FEATURES "${features}") +endfunction() diff --git a/cmake/QtBaseHelpers.cmake b/cmake/QtBaseHelpers.cmake index b3a4e8c7619..911b6001564 100644 --- a/cmake/QtBaseHelpers.cmake +++ b/cmake/QtBaseHelpers.cmake @@ -237,6 +237,9 @@ macro(qt_internal_qtbase_build_repo) # Needed when building qtbase for android. if(ANDROID) include(src/corelib/Qt6AndroidMacros.cmake) + include(src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake) + include(src/corelib/Qt6AndroidGradleHelpers.cmake) + include(src/corelib/Qt6AndroidPermissionHelpers.cmake) endif() # Needed when building for WebAssembly. 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/QtFrameworkHelpers.cmake b/cmake/QtFrameworkHelpers.cmake index 1982937aaf8..7fac9bdb203 100644 --- a/cmake/QtFrameworkHelpers.cmake +++ b/cmake/QtFrameworkHelpers.cmake @@ -54,6 +54,12 @@ function(qt_internal_find_apple_system_framework out_var framework_name) # We might revisit this later. set(cache_var_name "${out_var}Internal") + if(QT_USE_VCPKG) + # vcpkg.cmake sets CMAKE_FIND_FRAMEWORK to LAST and this setting will find e.g. + # libnetwork.tbd instead of Network.framework. Force the default value here. + set(CMAKE_FIND_FRAMEWORK FIRST) + endif() + find_library(${cache_var_name} "${framework_name}") if(${cache_var_name} AND ${cache_var_name} MATCHES ".framework$") diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake index a1f4cb7281c..c041f9d3ac5 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) @@ -356,6 +368,13 @@ if (MSVC AND NOT CLANG) ) endif() +if (WIN32 AND (CLANG OR MINGW) AND (TEST_architecture_arch STREQUAL x86_64)) + # windows 10 requires cmpxchg16b + target_compile_options(PlatformCommonInternal INTERFACE + -mcx16 + ) +endif() + set(_qt_internal_clang_msvc_frontend False) if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") 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/QtPlatformAndroid.cmake b/cmake/QtPlatformAndroid.cmake index b480b1c14a6..d56a889d114 100644 --- a/cmake/QtPlatformAndroid.cmake +++ b/cmake/QtPlatformAndroid.cmake @@ -30,6 +30,7 @@ include(UseJava) # Find JDK 8.0 find_package(Java 1.8 COMPONENTS Development REQUIRED) +find_package(Bundletool) # Ensure we are using the shared version of libc++ if(NOT ANDROID_STL STREQUAL c++_shared) @@ -117,13 +118,32 @@ function(qt_internal_android_test_runner_arguments target out_test_runner out_te set(deployment_tool "${host_bin_dir}/androiddeployqt") _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) - set(${out_test_arguments} + _qt_internal_android_get_platform_tools_path(platform_tools) + set(test_arguments "--path" "${android_build_dir}" - "--adb" "${ANDROID_SDK_ROOT}/platform-tools/adb" + "--adb" "${platform_tools}/adb" "--skip-install-root" - "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk" - "--apk" "${android_build_dir}/${target}.apk" "--ndk-stack" "${ANDROID_NDK_ROOT}/ndk-stack" - PARENT_SCOPE ) + + if(QT_USE_ANDROID_MODERN_BUNDLE) + _qt_internal_android_get_target_deployment_dir(target_deployment_dir ${target}) + list(APPEND test_arguments + "--manifest" "${target_deployment_dir}/AndroidManifest.xml") + endif() + + if(EXISTS "${Bundletool_EXECUTABLE}" AND QT_USE_ANDROID_MODERN_BUNDLE) + list(APPEND test_arguments + "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_aab" + "--aab" "${android_build_dir}/${target}.aab" + "--bundletool" "${Bundletool_EXECUTABLE}" + ) + else() + list(APPEND test_arguments + "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk" + "--apk" "${android_build_dir}/${target}.apk" + ) + endif() + + set(${out_test_arguments} "${test_arguments}" PARENT_SCOPE) endfunction() diff --git a/cmake/QtPostProcessHelpers.cmake b/cmake/QtPostProcessHelpers.cmake index 9f220f9d78b..07fcdee268b 100644 --- a/cmake/QtPostProcessHelpers.cmake +++ b/cmake/QtPostProcessHelpers.cmake @@ -790,6 +790,8 @@ function(qt_modules_process_android_dependencies) qt_internal_get_qt_repo_known_modules(repo_known_modules) foreach (target ${repo_known_modules}) qt_internal_android_dependencies(${target}) + qt_internal_android_add_interface_permissions(${target}) + qt_internal_android_add_interface_features(${target}) endforeach() endfunction() 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/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake index ad8a9d65c14..8a0666b0ceb 100644 --- a/cmake/QtTestHelpers.cmake +++ b/cmake/QtTestHelpers.cmake @@ -1176,6 +1176,13 @@ function(qt_internal_collect_command_environment out_path out_plugin_path) set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}${install_prefix}") endforeach() set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}$ENV{PATH}") + if(ANDROID) + # Add android platform tools to path. Required for the correct androidtestrunner work. + _qt_internal_android_get_platform_tools_path(platform_tools) + string(PREPEND test_env_path + "${platform_tools}" "${QT_PATH_SEPARATOR}") + endif() + string(REPLACE ";" "\;" test_env_path "${test_env_path}") set(${out_path} "${test_env_path}" PARENT_SCOPE) 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/coin/instructions/prepare_building_env.yaml b/coin/instructions/prepare_building_env.yaml index 20e7ef7f01c..85661f8f3eb 100644 --- a/coin/instructions/prepare_building_env.yaml +++ b/coin/instructions/prepare_building_env.yaml @@ -646,6 +646,26 @@ instructions: property: features contains_value: Sccache + # VCPKG + - type: Group + instructions: + - type: AppendToEnvironmentVariable + variableName: COMMON_NON_QTBASE_CMAKE_ARGS + variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}" + - type: AppendToEnvironmentVariable + variableName: COMMON_TEST_CMAKE_ARGS + variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}" + - type: AppendToEnvironmentVariable + variableName: COMMON_EXAMPLES_CMAKE_ARGS + variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}" + - type: AppendToEnvironmentVariable + variableName: COMMON_NON_QTBASE_TARGET_CMAKE_ARGS + variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}" + enable_if: + condition: runtime + env_var: USE_VCPKG + equals_value: "ON" + # Specify a custom examples installation directory, so that the built example binaries are not # packaged into the artifact archive together with the Qt libraries. # Also specify that during examples deployment, only a subset of examples should be deployed, to diff --git a/configure.cmake b/configure.cmake index 4ca5f7f07d2..8d96ba7e1f0 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) @@ -1091,13 +1116,12 @@ qt_feature("network" PRIVATE ) qt_feature("printsupport" PRIVATE LABEL "Qt PrintSupport" - CONDITION QT_FEATURE_widgets AND NOT WASM + CONDITION QT_FEATURE_widgets SECTION "Module" PURPOSE "Provides the Qt PrintSupport module." ) qt_feature("sql" PRIVATE LABEL "Qt Sql" - CONDITION NOT WASM SECTION "Module" PURPOSE "Provides the Sql module." ) diff --git a/doc/global/includes/cli-build-cmake.qdocinc b/doc/global/includes/cli-build-cmake.qdocinc index b4c6ffccb4b..5f30e8632b7 100644 --- a/doc/global/includes/cli-build-cmake.qdocinc +++ b/doc/global/includes/cli-build-cmake.qdocinc @@ -28,7 +28,7 @@ \badcode \QtVersion md notepad-build cd notepad-build - C:\Qt\\1\msvc2019_64\bin\qt-cmake -GNinja C:\Examples\notepad + C:\Qt\\1\msvc2022_64\bin\qt-cmake -GNinja C:\Examples\notepad ninja \endcode diff --git a/examples/widgets/rhi/cuberhiwidget/examplewidget.cpp b/examples/widgets/rhi/cuberhiwidget/examplewidget.cpp index fe39d904dd5..2d16cc0ba2a 100644 --- a/examples/widgets/rhi/cuberhiwidget/examplewidget.cpp +++ b/examples/widgets/rhi/cuberhiwidget/examplewidget.cpp @@ -3,8 +3,10 @@ #include "examplewidget.h" #include "cube.h" + #include <QFile> #include <QPainter> +#include <QtGui/qquaternion.h> static const QSize CUBE_TEX_SIZE(512, 512); diff --git a/licenseRule.json b/licenseRule.json index e35e8ba7fd1..b40e225e347 100644 --- a/licenseRule.json +++ b/licenseRule.json @@ -119,7 +119,7 @@ "file type": "test", "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] }, - "ests/auto/testlib/selftests/": { + "tests/auto/testlib/selftests/(?!README)": { "comment": "Exception. Those are test files", "file type": "test", "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] 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/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp index 96036eba701..9c29b26fb82 100644 --- a/qmake/generators/unix/unixmake2.cpp +++ b/qmake/generators/unix/unixmake2.cpp @@ -804,7 +804,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) QString icon = fileFixify(var("ICON")); t << "@$(DEL_FILE) " << info_plist_out << "\n\t" - << "@plutil -convert xml1 -o - " << info_plist << " | " + << "@set -o pipefail && plutil -convert xml1 -o - " << info_plist << " | " << "sed "; for (const ProString &arg : std::as_const(commonSedArgs)) t << arg; @@ -837,7 +837,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) if (!isShallowBundle) symlinks[bundle_dir + "Resources"] = "Versions/Current/Resources"; t << "@$(DEL_FILE) " << info_plist_out << "\n\t" - << "@plutil -convert xml1 -o - " << info_plist << " | " + << "@set -o pipefail && plutil -convert xml1 -o - " << info_plist << " | " << "sed "; for (const ProString &arg : std::as_const(commonSedArgs)) t << arg; 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/3rdparty/gradle/gradle.properties b/src/3rdparty/gradle/gradle.properties index 4fe1674abd3..3472b396d96 100644 --- a/src/3rdparty/gradle/gradle.properties +++ b/src/3rdparty/gradle/gradle.properties @@ -16,3 +16,6 @@ org.gradle.parallel=true # Allow AndroidX usage android.useAndroidX=true + +# User-defined properties +@EXTRA_PROPERTIES@ diff --git a/src/3rdparty/libpng/ANNOUNCE b/src/3rdparty/libpng/ANNOUNCE index 15219dbb4e0..90c766594e7 100644 --- a/src/3rdparty/libpng/ANNOUNCE +++ b/src/3rdparty/libpng/ANNOUNCE @@ -1,5 +1,5 @@ -libpng 1.6.48 - April 30, 2025 -============================== +libpng 1.6.49 - June 12, 2025 +============================= This is a public release of libpng, intended for use in production code. @@ -9,13 +9,13 @@ Files available for download Source files with LF line endings (for Unix/Linux): - * libpng-1.6.48.tar.xz (LZMA-compressed, recommended) - * libpng-1.6.48.tar.gz (deflate-compressed) + * libpng-1.6.49.tar.xz (LZMA-compressed, recommended) + * libpng-1.6.49.tar.gz (deflate-compressed) Source files with CRLF line endings (for Windows): - * lpng1648.7z (LZMA-compressed, recommended) - * lpng1648.zip (deflate-compressed) + * lpng1649.7z (LZMA-compressed, recommended) + * lpng1649.zip (deflate-compressed) Other information: @@ -25,17 +25,13 @@ Other information: * TRADEMARK.md -Changes from version 1.6.47 to version 1.6.48 +Changes from version 1.6.48 to version 1.6.49 --------------------------------------------- - * Fixed the floating-point version of the mDCv setter `png_set_mDCv`. - (Reported by Mohit Bakshi; fixed by John Bowler) - * Added #error directives to discourage the inclusion of private - libpng implementation header files in PNG-supporting applications. - * Added the CMake build option `PNG_LIBCONF_HEADER`, to be used as an - alternative to `DFA_XTRA`. - * Removed the Travis CI configuration files, with heartfelt thanks for - their generous support of our project over the past five years! + * Added SIMD-optimized code for the RISC-V Vector Extension (RVV). + (Contributed by Manfred Schlaegl, Dragos Tiselice and Filip Wasil) + * Added various fixes and improvements to the build scripts and to + the sample code. Send comments/corrections/commendations to png-mng-implement at lists.sf.net. diff --git a/src/3rdparty/libpng/CHANGES b/src/3rdparty/libpng/CHANGES index 557ff1b8c97..0c0fa6dc70b 100644 --- a/src/3rdparty/libpng/CHANGES +++ b/src/3rdparty/libpng/CHANGES @@ -6261,6 +6261,12 @@ Version 1.6.48 [April 30, 2025] Removed the Travis CI configuration files, with heartfelt thanks for their generous support of our project over the past five years! +Version 1.6.49 [June 12, 2025] + Added SIMD-optimized code for the RISC-V Vector Extension (RVV). + (Contributed by Manfred Schlaegl, Dragos Tiselice and Filip Wasil) + Added various fixes and improvements to the build scripts and to + the sample code. + Send comments/corrections/commendations to png-mng-implement at lists.sf.net. Subscription is required; visit https://lists.sourceforge.net/lists/listinfo/png-mng-implement diff --git a/src/3rdparty/libpng/INSTALL b/src/3rdparty/libpng/INSTALL index df1a494468b..1557fbded48 100644 --- a/src/3rdparty/libpng/INSTALL +++ b/src/3rdparty/libpng/INSTALL @@ -136,7 +136,7 @@ Your directory structure should look like this: depcomp, install-sh, mkinstalldirs, test-pngtest.sh, etc. contrib arm-neon, conftest, examples, gregbook, libtests, pngminim, - pngminus, pngsuite, tools, visupng + pngminus, pngsuite, tools, visupng, riscv-rvv projects owatcom, visualc71, vstudio scripts @@ -289,6 +289,7 @@ such as one of --enable-mips-msa=yes --enable-intel-sse=yes --enable-powerpc-vsx=yes + --enable-riscv-rvv=yes or enable them all at once with @@ -301,6 +302,7 @@ or more of CPPFLAGS += "-DPNG_MIPS_MSA" CPPFLAGS += "-DPNG_INTEL_SSE" CPPFLAGS += "-DPNG_POWERPC_VSX" + CPPFLAGS += "-DPNG_RISCV_RVV" See for example scripts/makefile.linux-opt @@ -317,13 +319,15 @@ to disable a particular one, or via compiler-command options such as CPPFLAGS += "-DPNG_ARM_NEON_OPT=0, -DPNG_MIPS_MSA_OPT=0, - -DPNG_INTEL_SSE_OPT=0, -DPNG_POWERPC_VSX_OPT=0" + -DPNG_INTEL_SSE_OPT=0, -DPNG_POWERPC_VSX_OPT=0, + -DPNG_RISCV_RVV_OPT=0" If you are using cmake, hardware optimizations are "on" by default. To disable them, use cmake . -DPNG_ARM_NEON=no -DPNG_INTEL_SSE=no \ - -DPNG_MIPS_MSA=no -DPNG_POWERPC_VSX=no + -DPNG_MIPS_MSA=no -DPNG_POWERPC_VSX=no \ + -DPNG_RISCV_RVV=no or disable them all at once with diff --git a/src/3rdparty/libpng/README b/src/3rdparty/libpng/README index cbde7246ca2..9f2b2d0ed53 100644 --- a/src/3rdparty/libpng/README +++ b/src/3rdparty/libpng/README @@ -1,4 +1,4 @@ -README for libpng version 1.6.48 +README for libpng version 1.6.49 ================================ See the note about version numbers near the top of `png.h`. @@ -147,6 +147,7 @@ Files included in this distribution loongarch/ => Optimized code for LoongArch LSX mips/ => Optimized code for MIPS MSA and MIPS MMI powerpc/ => Optimized code for PowerPC VSX + riscv/ => Optimized code for the RISC-V platform ci/ => Scripts for continuous integration contrib/ => External contributions arm-neon/ => Optimized code for the ARM-NEON platform @@ -162,6 +163,7 @@ Files included in this distribution programs demonstrating the use of pngusr.dfa pngminus/ => Simple pnm2png and png2pnm programs pngsuite/ => Test images + riscv-rvv/ => Optimized code for the RISC-V Vector platform testpngs/ => Test images tools/ => Various tools visupng/ => VisualPng, a Windows viewer for PNG images diff --git a/src/3rdparty/libpng/libpng-manual.txt b/src/3rdparty/libpng/libpng-manual.txt index 940c2e2b513..f4e151f0c23 100644 --- a/src/3rdparty/libpng/libpng-manual.txt +++ b/src/3rdparty/libpng/libpng-manual.txt @@ -9,7 +9,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng version 1.6.36, December 2018, through 1.6.48 - April 2025 + libpng version 1.6.36, December 2018, through 1.6.49 - June 2025 Updated and distributed by Cosmin Truta Copyright (c) 2018-2025 Cosmin Truta diff --git a/src/3rdparty/libpng/png.c b/src/3rdparty/libpng/png.c index a9179ffbbdd..8a77b6db5f2 100644 --- a/src/3rdparty/libpng/png.c +++ b/src/3rdparty/libpng/png.c @@ -13,7 +13,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_48 Your_png_h_is_not_version_1_6_48; +typedef png_libpng_version_1_6_49 Your_png_h_is_not_version_1_6_49; /* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the * corresponding macro definitions. This causes a compile time failure if @@ -815,7 +815,7 @@ png_get_copyright(png_const_structrp png_ptr) return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.48" PNG_STRING_NEWLINE \ + "libpng version 1.6.49" PNG_STRING_NEWLINE \ "Copyright (c) 2018-2025 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ diff --git a/src/3rdparty/libpng/png.h b/src/3rdparty/libpng/png.h index 665511c5547..f43e49c521a 100644 --- a/src/3rdparty/libpng/png.h +++ b/src/3rdparty/libpng/png.h @@ -1,6 +1,6 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.48 + * libpng version 1.6.49 * * Copyright (c) 2018-2025 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson @@ -14,7 +14,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.48, April 2025: + * libpng versions 1.6.36, December 2018, through 1.6.49, June 2025: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -238,7 +238,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.48 16 10648 16.so.16.48[.0] + * 1.6.49 16 10649 16.so.16.49[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -274,7 +274,7 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.48" +#define PNG_LIBPNG_VER_STRING "1.6.49" #define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n" /* The versions of shared library builds should stay in sync, going forward */ @@ -285,7 +285,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 48 +#define PNG_LIBPNG_VER_RELEASE 49 /* This should be zero for a public release, or non-zero for a * development version. @@ -316,7 +316,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10648 /* 1.6.48 */ +#define PNG_LIBPNG_VER 10649 /* 1.6.49 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -426,7 +426,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_48; +typedef char* png_libpng_version_1_6_49; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -3303,26 +3303,45 @@ PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory, * selected at run time. */ #ifdef PNG_SET_OPTION_SUPPORTED + +/* HARDWARE: ARM Neon SIMD instructions supported */ #ifdef PNG_ARM_NEON_API_SUPPORTED -# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ +# define PNG_ARM_NEON 0 #endif -#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */ -#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */ + +/* SOFTWARE: Force maximum window */ +#define PNG_MAXIMUM_INFLATE_WINDOW 2 + +/* SOFTWARE: Check ICC profile for sRGB */ +#define PNG_SKIP_sRGB_CHECK_PROFILE 4 + +/* HARDWARE: MIPS MSA SIMD instructions supported */ #ifdef PNG_MIPS_MSA_API_SUPPORTED -# define PNG_MIPS_MSA 6 /* HARDWARE: MIPS Msa SIMD instructions supported */ +# define PNG_MIPS_MSA 6 #endif + +/* SOFTWARE: Disable Adler32 check on IDAT */ #ifdef PNG_DISABLE_ADLER32_CHECK_SUPPORTED -# define PNG_IGNORE_ADLER32 8 /* SOFTWARE: disable Adler32 check on IDAT */ +# define PNG_IGNORE_ADLER32 8 #endif + +/* HARDWARE: PowerPC VSX SIMD instructions supported */ #ifdef PNG_POWERPC_VSX_API_SUPPORTED -# define PNG_POWERPC_VSX 10 /* HARDWARE: PowerPC VSX SIMD instructions - * supported */ +# define PNG_POWERPC_VSX 10 #endif + +/* HARDWARE: MIPS MMI SIMD instructions supported */ #ifdef PNG_MIPS_MMI_API_SUPPORTED -# define PNG_MIPS_MMI 12 /* HARDWARE: MIPS MMI SIMD instructions supported */ +# define PNG_MIPS_MMI 12 +#endif + +/* HARDWARE: RISC-V RVV SIMD instructions supported */ +#ifdef PNG_RISCV_RVV_API_SUPPORTED +# define PNG_RISCV_RVV 14 #endif -#define PNG_OPTION_NEXT 14 /* Next option - numbers must be even */ +/* Next option - numbers must be even */ +#define PNG_OPTION_NEXT 16 /* Return values: NOTE: there are four values and 'off' is *not* zero */ #define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ diff --git a/src/3rdparty/libpng/pngconf.h b/src/3rdparty/libpng/pngconf.h index e46b0611190..e92a3b1eca4 100644 --- a/src/3rdparty/libpng/pngconf.h +++ b/src/3rdparty/libpng/pngconf.h @@ -1,6 +1,6 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.48 + * libpng version 1.6.49 * * Copyright (c) 2018-2025 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson diff --git a/src/3rdparty/libpng/pnglibconf.h b/src/3rdparty/libpng/pnglibconf.h index c7634440de8..ea61c441ba6 100644 --- a/src/3rdparty/libpng/pnglibconf.h +++ b/src/3rdparty/libpng/pnglibconf.h @@ -1,6 +1,6 @@ /* pnglibconf.h - library build configuration */ -/* libpng version 1.6.48 */ +/* libpng version 1.6.49 */ /* Copyright (c) 2018-2025 Cosmin Truta */ /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ diff --git a/src/3rdparty/libpng/pngpriv.h b/src/3rdparty/libpng/pngpriv.h index a6f8d67d384..cb44a6aec8a 100644 --- a/src/3rdparty/libpng/pngpriv.h +++ b/src/3rdparty/libpng/pngpriv.h @@ -143,6 +143,24 @@ # endif #endif +#ifndef PNG_RISCV_RVV_OPT + /* RISCV_RVV optimizations are being controlled by the compiler settings, + * typically the target compiler will define __riscv but the rvv extension + * availability has to be explicitly stated. This is why if no + * PNG_RISCV_RVV_OPT was defined then a runtime check will be executed. + * + * To enable RISCV_RVV optimizations unconditionally, and compile the + * associated code, pass --enable-riscv-rvv=yes or --enable-riscv-rvv=on + * to configure or put -DPNG_RISCV_RVV_OPT=2 in CPPFLAGS. + */ + +# if defined(__riscv) && defined(PNG_ALIGNED_MEMORY_SUPPORTED) +# define PNG_RISCV_RVV_OPT 1 +# else +# define PNG_RISCV_RVV_OPT 0 +# endif +#endif + #if PNG_ARM_NEON_OPT > 0 /* NEON optimizations are to be at least considered by libpng, so enable the * callbacks to do this. @@ -288,6 +306,16 @@ # define PNG_LOONGARCH_LSX_IMPLEMENTATION 0 #endif +#if PNG_RISCV_RVV_OPT > 0 +# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_rvv +# ifndef PNG_RISCV_RVV_IMPLEMENTATION + /* Use the intrinsics code by default. */ +# define PNG_RISCV_RVV_IMPLEMENTATION 1 +# endif +#else +# define PNG_RISCV_RVV_IMPLEMENTATION 0 +#endif + /* Is this a build of a DLL where compilation of the object modules requires * different preprocessor settings to those required for a simple library? If * so PNG_BUILD_DLL must be set. @@ -1522,6 +1550,23 @@ PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_lsx,(png_row_infop row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); #endif +#if PNG_RISCV_RVV_OPT > 0 +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_rvv,(png_row_infop + row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); +#endif + /* Choose the best filter to use and filter the row data */ PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr, png_row_infop row_info),PNG_EMPTY); @@ -2134,6 +2179,11 @@ PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_lsx, (png_structp png_ptr, unsigned int bpp), PNG_EMPTY); #endif +# if PNG_RISCV_RVV_OPT > 0 +PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_rvv, + (png_structp png_ptr, unsigned int bpp), PNG_EMPTY); +#endif + PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr, png_const_charp key, png_bytep new_key), PNG_EMPTY); diff --git a/src/3rdparty/libpng/pngread.c b/src/3rdparty/libpng/pngread.c index 4f55f6408b8..a0dbf2ae208 100644 --- a/src/3rdparty/libpng/pngread.c +++ b/src/3rdparty/libpng/pngread.c @@ -809,7 +809,8 @@ png_read_destroy(png_structrp png_ptr) #endif #if defined(PNG_READ_EXPAND_SUPPORTED) && \ - defined(PNG_ARM_NEON_IMPLEMENTATION) + (defined(PNG_ARM_NEON_IMPLEMENTATION) || \ + defined(PNG_RISCV_RVV_IMPLEMENTATION)) png_free(png_ptr, png_ptr->riffled_palette); png_ptr->riffled_palette = NULL; #endif diff --git a/src/3rdparty/libpng/pngrtran.c b/src/3rdparty/libpng/pngrtran.c index 0fea13a418d..1809db70473 100644 --- a/src/3rdparty/libpng/pngrtran.c +++ b/src/3rdparty/libpng/pngrtran.c @@ -28,6 +28,12 @@ # endif #endif +#ifdef PNG_RISCV_RVV_IMPLEMENTATION +# if PNG_RISCV_RVV_IMPLEMENTATION == 1 +# define PNG_RISCV_RVV_INTRINSICS_AVAILABLE +# endif +#endif + #ifdef PNG_READ_SUPPORTED /* Set the action on getting a CRC error for an ancillary or critical chunk. */ diff --git a/src/3rdparty/libpng/pngstruct.h b/src/3rdparty/libpng/pngstruct.h index b17a54fe8f9..084422bc1e2 100644 --- a/src/3rdparty/libpng/pngstruct.h +++ b/src/3rdparty/libpng/pngstruct.h @@ -375,7 +375,8 @@ struct png_struct_def /* New member added in libpng-1.6.36 */ #if defined(PNG_READ_EXPAND_SUPPORTED) && \ - defined(PNG_ARM_NEON_IMPLEMENTATION) + (defined(PNG_ARM_NEON_IMPLEMENTATION) || \ + defined(PNG_RISCV_RVV_IMPLEMENTATION)) png_bytep riffled_palette; /* buffer for accelerated palette expansion */ #endif diff --git a/src/3rdparty/libpng/qt_attribution.json b/src/3rdparty/libpng/qt_attribution.json index d300d9d9b52..49d0b6ca79f 100644 --- a/src/3rdparty/libpng/qt_attribution.json +++ b/src/3rdparty/libpng/qt_attribution.json @@ -7,8 +7,8 @@ "Description": "libpng is the official PNG reference library.", "Homepage": "http://www.libpng.org/pub/png/libpng.html", - "Version": "1.6.48", - "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.48.tar.xz", + "Version": "1.6.49", + "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.49.tar.xz", "PURL": "pkg:github/pnggroup/libpng@v$<VERSION>", "CPE": "cpe:2.3:a:libpng:libpng:$<VERSION>:*:*:*:*:*:*:*", diff --git a/src/3rdparty/sqlite/qt_attribution.json b/src/3rdparty/sqlite/qt_attribution.json index 6572b106e0c..4d750224183 100644 --- a/src/3rdparty/sqlite/qt_attribution.json +++ b/src/3rdparty/sqlite/qt_attribution.json @@ -7,10 +7,10 @@ "Description": "SQLite is a small C library that implements a self-contained, embeddable, zero-configuration SQL database engine.", "Homepage": "https://www.sqlite.org/", - "Version": "3.50.1", + "Version": "3.50.2", "PURL": "pkg:github/sqlite/sqlite@version-$<VERSION>", "CPE": "cpe:2.3:a:sqlite:sqlite:$<VERSION>:*:*:*:*:*:*:*", - "DownloadLocation": "https://www.sqlite.org/2025/sqlite-amalgamation-3500100.zip", + "DownloadLocation": "https://www.sqlite.org/2025/sqlite-amalgamation-3500200.zip", "License": "SQLite Blessing", "LicenseId": "blessing", "Copyright": "The authors disclaim copyright to the source code. However, a license can be obtained if needed." diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c index 49a4256b0c0..0b071b2b6cc 100644 --- a/src/3rdparty/sqlite/sqlite3.c +++ b/src/3rdparty/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.50.1. By combining all the individual C code files into this +** version 3.50.2. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -18,7 +18,7 @@ ** separate file. This file contains only code for the core SQLite library. ** ** The content in this amalgamation comes from Fossil check-in -** b77dc5e0f596d2140d9ac682b2893ff65d3a with changes in files: +** 2af157d77fb1304a74176eaee7fbc7c7e932 with changes in files: ** ** */ @@ -465,9 +465,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.50.1" -#define SQLITE_VERSION_NUMBER 3050001 -#define SQLITE_SOURCE_ID "2025-06-06 14:52:32 b77dc5e0f596d2140d9ac682b2893ff65d3a4140aa86067a3efebe29dc914c95" +#define SQLITE_VERSION "3.50.2" +#define SQLITE_VERSION_NUMBER 3050002 +#define SQLITE_SOURCE_ID "2025-06-28 14:00:48 2af157d77fb1304a74176eaee7fbc7c7e932d946bf25325e9c26c91db19e3079" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -4398,7 +4398,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of ** database filename D with corresponding journal file J and WAL file W and -** with N URI parameters key/values pairs in the array P. The result from +** an array P of N URI Key/Value pairs. The result from ** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that ** is safe to pass to routines like: ** <ul> @@ -5079,7 +5079,7 @@ typedef struct sqlite3_context sqlite3_context; ** METHOD: sqlite3_stmt ** ** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following +** literals may be replaced by a [parameter] that matches one of the following ** templates: ** ** <ul> @@ -5124,7 +5124,7 @@ typedef struct sqlite3_context sqlite3_context; ** ** [[byte-order determination rules]] ^The byte-order of ** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) -** found in first character, which is removed, or in the absence of a BOM +** found in the first character, which is removed, or in the absence of a BOM ** the byte order is the native byte order of the host ** machine for sqlite3_bind_text16() or the byte order specified in ** the 6th parameter for sqlite3_bind_text64().)^ @@ -5144,7 +5144,7 @@ typedef struct sqlite3_context sqlite3_context; ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occurs at byte offsets less than +** terminated. If any NUL characters occur at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. @@ -5356,7 +5356,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); ** METHOD: sqlite3_stmt ** ** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in +** table column that is the origin of a particular result column in a ** [SELECT] statement. ** ^The name of the database or table or column can be returned as ** either a UTF-8 or UTF-16 string. ^The _database_ routines return @@ -5925,8 +5925,8 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** ** For best security, the [SQLITE_DIRECTONLY] flag is recommended for ** all application-defined SQL functions that do not need to be -** used inside of triggers, view, CHECK constraints, or other elements of -** the database schema. This flags is especially recommended for SQL +** used inside of triggers, views, CHECK constraints, or other elements of +** the database schema. This flag is especially recommended for SQL ** functions that have side effects or reveal internal application state. ** Without this flag, an attacker might be able to modify the schema of ** a database file to include invocations of the function with parameters @@ -5957,7 +5957,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** [user-defined window functions|available here]. ** ** ^(If the final parameter to sqlite3_create_function_v2() or -** sqlite3_create_window_function() is not NULL, then it is destructor for +** sqlite3_create_window_function() is not NULL, then it is the destructor for ** the application data pointer. The destructor is invoked when the function ** is deleted, either by being overloaded or when the database connection ** closes.)^ ^The destructor is also invoked if the call to @@ -6357,7 +6357,7 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** METHOD: sqlite3_value ** ** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] -** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** object V and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a ** memory allocation fails. ^If V is a [pointer value], then the result @@ -6395,7 +6395,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** allocation error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the +** determined by the N parameter on the first successful call. Changing the ** value of N in any subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set @@ -6557,7 +6557,7 @@ SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(voi ** ** Security Warning: These interfaces should not be exposed in scripting ** languages or in other circumstances where it might be possible for an -** an attacker to invoke them. Any agent that can invoke these interfaces +** attacker to invoke them. Any agent that can invoke these interfaces ** can probably also take control of the process. ** ** Database connection client data is only available for SQLite @@ -6671,7 +6671,7 @@ typedef void (*sqlite3_destructor_type)(void*); ** pointed to by the 2nd parameter are taken as the application-defined ** function result. If the 3rd parameter is non-negative, then it ** must be the byte offset into the string where the NUL terminator would -** appear if the string where NUL terminated. If any NUL characters occur +** appear if the string were NUL terminated. If any NUL characters occur ** in the string at a byte offset that is less than the value of the 3rd ** parameter, then the resulting string will contain embedded NULs and the ** result of expressions operating on strings with embedded NULs is undefined. @@ -6729,7 +6729,7 @@ typedef void (*sqlite3_destructor_type)(void*); ** string and preferably a string literal. The sqlite3_result_pointer() ** routine is part of the [pointer passing interface] added for SQLite 3.20.0. ** -** If these routines are called from within the different thread +** If these routines are called from within a different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. */ @@ -7135,7 +7135,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** METHOD: sqlite3 ** ** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name -** for the N-th database on database connection D, or a NULL pointer of N is +** for the N-th database on database connection D, or a NULL pointer if N is ** out of range. An N value of 0 means the main database file. An N of 1 is ** the "temp" schema. Larger values of N correspond to various ATTACH-ed ** databases. @@ -7230,7 +7230,7 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** <dd>The SQLITE_TXN_READ state means that the database is currently ** in a read transaction. Content has been read from the database file ** but nothing in the database file has changed. The transaction state -** will advanced to SQLITE_TXN_WRITE if any changes occur and there are +** will be advanced to SQLITE_TXN_WRITE if any changes occur and there are ** no other conflicting concurrent write transactions. The transaction ** state will revert to SQLITE_TXN_NONE following a [ROLLBACK] or ** [COMMIT].</dd> @@ -7239,7 +7239,7 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** <dd>The SQLITE_TXN_WRITE state means that the database is currently ** in a write transaction. Content has been written to the database file ** but has not yet committed. The transaction state will change to -** to SQLITE_TXN_NONE at the next [ROLLBACK] or [COMMIT].</dd> +** SQLITE_TXN_NONE at the next [ROLLBACK] or [COMMIT].</dd> */ #define SQLITE_TXN_NONE 0 #define SQLITE_TXN_READ 1 @@ -7520,7 +7520,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** CAPI3REF: Impose A Limit On Heap Size ** ** These interfaces impose limits on the amount of heap memory that will be -** by all database connections within a single process. +** used by all database connections within a single process. ** ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the ** soft limit on the amount of heap memory that may be allocated by SQLite. @@ -7578,7 +7578,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** </ul>)^ ** ** The circumstances under which SQLite will enforce the heap limits may -** changes in future releases of SQLite. +** change in future releases of SQLite. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); @@ -7693,8 +7693,8 @@ SQLITE_API int sqlite3_table_column_metadata( ** ^The entry point is zProc. ** ^(zProc may be 0, in which case SQLite will try to come up with an ** entry point name on its own. It first tries "sqlite3_extension_init". -** If that does not work, it constructs a name "sqlite3_X_init" where the -** X is consists of the lower-case equivalent of all ASCII alphabetic +** If that does not work, it constructs a name "sqlite3_X_init" where +** X consists of the lower-case equivalent of all ASCII alphabetic ** characters in the filename from the last "/" to the first following ** "." and omitting any initial "lib".)^ ** ^The sqlite3_load_extension() interface returns @@ -7765,7 +7765,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** ^(Even though the function prototype shows that xEntryPoint() takes ** no arguments and returns void, SQLite invokes xEntryPoint() with three ** arguments and expects an integer result as if the signature of the -** entry point where as follows: +** entry point were as follows: ** ** <blockquote><pre> ** int xEntryPoint( @@ -7929,7 +7929,7 @@ struct sqlite3_module { ** virtual table and might not be checked again by the byte code.)^ ^(The ** aConstraintUsage[].omit flag is an optimization hint. When the omit flag ** is left in its default setting of false, the constraint will always be -** checked separately in byte code. If the omit flag is change to true, then +** checked separately in byte code. If the omit flag is changed to true, then ** the constraint may or may not be checked in byte code. In other words, ** when the omit flag is true there is no guarantee that the constraint will ** not be checked again using byte code.)^ @@ -7955,7 +7955,7 @@ struct sqlite3_module { ** The xBestIndex method may optionally populate the idxFlags field with a ** mask of SQLITE_INDEX_SCAN_* flags. One such flag is ** [SQLITE_INDEX_SCAN_HEX], which if set causes the [EXPLAIN QUERY PLAN] -** output to show the idxNum has hex instead of as decimal. Another flag is +** output to show the idxNum as hex instead of as decimal. Another flag is ** SQLITE_INDEX_SCAN_UNIQUE, which if set indicates that the query plan will ** return at most one row. ** @@ -8096,7 +8096,7 @@ struct sqlite3_index_info { ** the implementation of the [virtual table module]. ^The fourth ** parameter is an arbitrary client data pointer that is passed through ** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. +** when a new virtual table is being created or reinitialized. ** ** ^The sqlite3_create_module_v2() interface has a fifth parameter which ** is a pointer to a destructor for the pClientData. ^SQLite will @@ -8261,7 +8261,7 @@ typedef struct sqlite3_blob sqlite3_blob; ** in *ppBlob. Otherwise an [error code] is returned and, unless the error ** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided ** the API is not misused, it is always safe to call [sqlite3_blob_close()] -** on *ppBlob after this function it returns. +** on *ppBlob after this function returns. ** ** This function fails with SQLITE_ERROR if any of the following are true: ** <ul> @@ -8381,7 +8381,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** ** ^Returns the size in bytes of the BLOB accessible via the ** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing +** incremental blob I/O routines can only read or overwrite existing ** blob content; they cannot change the size of a blob. ** ** This routine only works on a [BLOB handle] which has been created @@ -8531,7 +8531,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ^The sqlite3_mutex_alloc() routine allocates a new ** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() ** routine returns NULL if it is unable to allocate the requested -** mutex. The argument to sqlite3_mutex_alloc() must one of these +** mutex. The argument to sqlite3_mutex_alloc() must be one of these ** integer constants: ** ** <ul> @@ -8764,7 +8764,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); ** CAPI3REF: Retrieve the mutex for a database connection ** METHOD: sqlite3 ** -** ^This interface returns a pointer the [sqlite3_mutex] object that +** ^This interface returns a pointer to the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument ** when the [threading mode] is Serialized. ** ^If the [threading mode] is Single-thread or Multi-thread then this @@ -8887,7 +8887,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** CAPI3REF: SQL Keyword Checking ** ** These routines provide access to the set of SQL language keywords -** recognized by SQLite. Applications can uses these routines to determine +** recognized by SQLite. Applications can use these routines to determine ** whether or not a specific identifier needs to be escaped (for example, ** by enclosing in double-quotes) so as not to confuse the parser. ** @@ -9055,7 +9055,7 @@ SQLITE_API void sqlite3_str_reset(sqlite3_str*); ** content of the dynamic string under construction in X. The value ** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X ** and might be freed or altered by any subsequent method on the same -** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str] object. Applications must not use the pointer returned by ** [sqlite3_str_value(X)] after any subsequent method call on the same ** object. ^Applications may change the content of the string returned ** by [sqlite3_str_value(X)] as long as they do not write into any bytes @@ -9141,7 +9141,7 @@ SQLITE_API int sqlite3_status64( ** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] ** buffer and where forced to overflow to [sqlite3_malloc()]. The ** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to +** were too large (they were larger than the "sz" parameter to ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because ** no space was left in the page cache.</dd>)^ ** @@ -9225,28 +9225,29 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_HIT</dt> ** <dd>This parameter returns the number of malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE</dt> -** <dd>This parameter returns the number malloc attempts that might have +** <dd>This parameter returns the number of malloc attempts that might have ** been satisfied using lookaside memory but failed due to the amount of ** memory requested being larger than the lookaside slot size. ** Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL</dt> -** <dd>This parameter returns the number malloc attempts that might have +** <dd>This parameter returns the number of malloc attempts that might have ** been satisfied using lookaside memory but failed due to all lookaside ** memory already being in use. ** Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_CACHE_USED]] ^(<dt>SQLITE_DBSTATUS_CACHE_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** </dd> ** ** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] ** ^(<dt>SQLITE_DBSTATUS_CACHE_USED_SHARED</dt> @@ -9255,10 +9256,10 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** memory used by that pager cache is divided evenly between the attached ** connections.)^ In other words, if none of the pager caches associated ** with the database connection are shared, this request returns the same -** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** value as DBSTATUS_CACHE_USED. Or, if one or more of the pager caches are ** shared, the value returned by this call will be smaller than that returned ** by DBSTATUS_CACHE_USED. ^The highwater mark associated with -** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0.</dd> ** ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap @@ -9268,6 +9269,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** schema memory is shared with other database connections due to ** [shared cache mode] being enabled. ** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** </dd> ** ** [[SQLITE_DBSTATUS_STMT_USED]] ^(<dt>SQLITE_DBSTATUS_STMT_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap @@ -9304,7 +9306,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** been written to disk in the middle of a transaction due to the page ** cache overflowing. Transactions are more efficient if they are written ** to disk all at once. When pages spill mid-transaction, that introduces -** additional overhead. This parameter can be used help identify +** additional overhead. This parameter can be used to help identify ** inefficiencies that can be resolved by increasing the cache size. ** </dd> ** @@ -9784,7 +9786,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** external process or via a database connection other than the one being ** used by the backup operation, then the backup will be automatically ** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used +** database is modified by using the same database connection as is used ** by the backup operation, then the backup database is automatically ** updated at the same time. ** @@ -9801,7 +9803,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** and may not be used following a call to sqlite3_backup_finish(). ** ** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() errors occurred, regardless of whether or not ** sqlite3_backup_step() completed. ** ^If an out-of-memory condition or IO error occurred during any prior ** sqlite3_backup_step() call on the same [sqlite3_backup] object, then @@ -10871,7 +10873,7 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); ** METHOD: sqlite3 ** ** ^If a write-transaction is open on [database connection] D when the -** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** [sqlite3_db_cacheflush(D)] interface is invoked, any dirty ** pages in the pager-cache that are not currently in use are written out ** to disk. A dirty page may be in use if a database cursor created by an ** active SQL statement is reading from it, or if it is page 1 of a database @@ -15442,8 +15444,8 @@ typedef INT16_TYPE LogEst; ** assuming n is a signed integer type. UMXV(n) is similar for unsigned ** integer types. */ -#define SMXV(n) ((((i64)1)<<(sizeof(n)-1))-1) -#define UMXV(n) ((((i64)1)<<(sizeof(n)))-1) +#define SMXV(n) ((((i64)1)<<(sizeof(n)*8-1))-1) +#define UMXV(n) ((((i64)1)<<(sizeof(n)*8))-1) /* ** Round up a number to the next larger multiple of 8. This is used @@ -19254,7 +19256,7 @@ struct AggInfo { ** from source tables rather than from accumulators */ u8 useSortingIdx; /* In direct mode, reference the sorting index rather ** than the source table */ - u16 nSortingColumn; /* Number of columns in the sorting index */ + u32 nSortingColumn; /* Number of columns in the sorting index */ int sortingIdx; /* Cursor number of the sorting index */ int sortingIdxPTab; /* Cursor number of pseudo-table */ int iFirstReg; /* First register in range for aCol[] and aFunc[] */ @@ -19263,8 +19265,8 @@ struct AggInfo { Table *pTab; /* Source table */ Expr *pCExpr; /* The original expression */ int iTable; /* Cursor number of the source table */ - i16 iColumn; /* Column number within the source table */ - i16 iSorterColumn; /* Column number in the sorting index */ + int iColumn; /* Column number within the source table */ + int iSorterColumn; /* Column number in the sorting index */ } *aCol; int nColumn; /* Number of used entries in aCol[] */ int nAccumulator; /* Number of columns that show through to the output. @@ -54966,7 +54968,9 @@ bitvec_set_rehash: }else{ memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); memset(p->u.apSub, 0, sizeof(p->u.apSub)); - p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR; + p->iDivisor = p->iSize/BITVEC_NPTR; + if( (p->iSize%BITVEC_NPTR)!=0 ) p->iDivisor++; + if( p->iDivisor<BITVEC_NBIT ) p->iDivisor = BITVEC_NBIT; rc = sqlite3BitvecSet(p, i); for(j=0; j<BITVEC_NINT; j++){ if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]); @@ -69654,6 +69658,7 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); } SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + pWal->iReCksum = 0; } return rc; } @@ -69701,6 +69706,9 @@ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ walCleanupHash(pWal); } SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + if( pWal->iReCksum>pWal->hdr.mxFrame ){ + pWal->iReCksum = 0; + } } return rc; @@ -117346,7 +117354,9 @@ static void findOrCreateAggInfoColumn( ){ struct AggInfo_col *pCol; int k; + int mxTerm = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; + assert( mxTerm <= SMXV(i16) ); assert( pAggInfo->iFirstReg==0 ); pCol = pAggInfo->aCol; for(k=0; k<pAggInfo->nColumn; k++, pCol++){ @@ -117364,6 +117374,10 @@ static void findOrCreateAggInfoColumn( assert( pParse->db->mallocFailed ); return; } + if( k>mxTerm ){ + sqlite3ErrorMsg(pParse, "more than %d aggregate terms", mxTerm); + k = mxTerm; + } pCol = &pAggInfo->aCol[k]; assert( ExprUseYTab(pExpr) ); pCol->pTab = pExpr->y.pTab; @@ -117397,6 +117411,7 @@ fix_up_expr: if( pExpr->op==TK_COLUMN ){ pExpr->op = TK_AGG_COLUMN; } + assert( k <= SMXV(pExpr->iAgg) ); pExpr->iAgg = (i16)k; } @@ -117481,13 +117496,19 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ ** function that is already in the pAggInfo structure */ struct AggInfo_func *pItem = pAggInfo->aFunc; + int mxTerm = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; + assert( mxTerm <= SMXV(i16) ); for(i=0; i<pAggInfo->nFunc; i++, pItem++){ if( NEVER(pItem->pFExpr==pExpr) ) break; if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ break; } } - if( i>=pAggInfo->nFunc ){ + if( i>mxTerm ){ + sqlite3ErrorMsg(pParse, "more than %d aggregate terms", mxTerm); + i = mxTerm; + assert( i<pAggInfo->nFunc ); + }else if( i>=pAggInfo->nFunc ){ /* pExpr is original. Make a new entry in pAggInfo->aFunc[] */ u8 enc = ENC(pParse->db); @@ -117541,6 +117562,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(pExpr, EP_NoReduce); + assert( i <= SMXV(pExpr->iAgg) ); pExpr->iAgg = (i16)i; pExpr->pAggInfo = pAggInfo; return WRC_Prune; @@ -131999,7 +132021,7 @@ static void concatFuncCore( int nSep, const char *zSep ){ - i64 j, k, n = 0; + i64 j, n = 0; int i; char *z; for(i=0; i<argc; i++){ @@ -132013,8 +132035,8 @@ static void concatFuncCore( } j = 0; for(i=0; i<argc; i++){ - k = sqlite3_value_bytes(argv[i]); - if( k>0 ){ + if( sqlite3_value_type(argv[i])!=SQLITE_NULL ){ + int k = sqlite3_value_bytes(argv[i]); const char *v = (const char*)sqlite3_value_text(argv[i]); if( v!=0 ){ if( j>0 && nSep>0 ){ @@ -163433,30 +163455,42 @@ static void exprAnalyzeOrTerm( ** 1. The SQLITE_Transitive optimization must be enabled ** 2. Must be either an == or an IS operator ** 3. Not originating in the ON clause of an OUTER JOIN -** 4. The affinities of A and B must be compatible -** 5a. Both operands use the same collating sequence OR -** 5b. The overall collating sequence is BINARY +** 4. The operator is not IS or else the query does not contain RIGHT JOIN +** 5. The affinities of A and B must be compatible +** 6a. Both operands use the same collating sequence OR +** 6b. The overall collating sequence is BINARY ** If this routine returns TRUE, that means that the RHS can be substituted ** for the LHS anyplace else in the WHERE clause where the LHS column occurs. ** This is an optimization. No harm comes from returning 0. But if 1 is ** returned when it should not be, then incorrect answers might result. */ -static int termIsEquivalence(Parse *pParse, Expr *pExpr){ +static int termIsEquivalence(Parse *pParse, Expr *pExpr, SrcList *pSrc){ char aff1, aff2; CollSeq *pColl; - if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; - if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; - if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; /* (1) */ + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; /* (2) */ + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* (3) */ + assert( pSrc!=0 ); + if( pExpr->op==TK_IS + && pSrc->nSrc + && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 + ){ + return 0; /* (4) */ + } aff1 = sqlite3ExprAffinity(pExpr->pLeft); aff2 = sqlite3ExprAffinity(pExpr->pRight); if( aff1!=aff2 && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) ){ - return 0; + return 0; /* (5) */ } pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); - if( sqlite3IsBinary(pColl) ) return 1; - return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); + if( !sqlite3IsBinary(pColl) + && !sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight) + ){ + return 0; /* (6) */ + } + return 1; } /* @@ -163721,8 +163755,8 @@ static void exprAnalyze( if( op==TK_IS ) pNew->wtFlags |= TERM_IS; pTerm = &pWC->a[idxTerm]; pTerm->wtFlags |= TERM_COPIED; - - if( termIsEquivalence(pParse, pDup) ){ + assert( pWInfo->pTabList!=0 ); + if( termIsEquivalence(pParse, pDup, pWInfo->pTabList) ){ pTerm->eOperator |= WO_EQUIV; eExtraOp = WO_EQUIV; } @@ -184424,6 +184458,7 @@ SQLITE_API int sqlite3_setlk_timeout(sqlite3 *db, int ms, int flags){ #endif if( ms<-1 ) return SQLITE_RANGE; #ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3_mutex_enter(db->mutex); db->setlkTimeout = ms; db->setlkFlags = flags; sqlite3BtreeEnterAll(db); @@ -184435,6 +184470,7 @@ SQLITE_API int sqlite3_setlk_timeout(sqlite3 *db, int ms, int flags){ } } sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); #endif #if !defined(SQLITE_ENABLE_API_ARMOR) && !defined(SQLITE_ENABLE_SETLK_TIMEOUT) UNUSED_PARAMETER(db); @@ -257230,7 +257266,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2025-06-06 14:52:32 b77dc5e0f596d2140d9ac682b2893ff65d3a4140aa86067a3efebe29dc914c95", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2025-06-28 14:00:48 2af157d77fb1304a74176eaee7fbc7c7e932d946bf25325e9c26c91db19e3079", -1, SQLITE_TRANSIENT); } /* @@ -258045,6 +258081,7 @@ static int fts5StorageDeleteFromIndex( for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){ if( pConfig->abUnindexed[iCol-1]==0 ){ sqlite3_value *pVal = 0; + sqlite3_value *pFree = 0; const char *pText = 0; int nText = 0; const char *pLoc = 0; @@ -258061,11 +258098,22 @@ static int fts5StorageDeleteFromIndex( if( pConfig->bLocale && sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); }else{ - pText = (const char*)sqlite3_value_text(pVal); - nText = sqlite3_value_bytes(pVal); - if( pConfig->bLocale && pSeek ){ - pLoc = (const char*)sqlite3_column_text(pSeek, iCol + pConfig->nCol); - nLoc = sqlite3_column_bytes(pSeek, iCol + pConfig->nCol); + if( sqlite3_value_type(pVal)!=SQLITE_TEXT ){ + /* Make a copy of the value to work with. This is because the call + ** to sqlite3_value_text() below forces the type of the value to + ** SQLITE_TEXT, and we may need to use it again later. */ + pFree = pVal = sqlite3_value_dup(pVal); + if( pVal==0 ){ + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + pText = (const char*)sqlite3_value_text(pVal); + nText = sqlite3_value_bytes(pVal); + if( pConfig->bLocale && pSeek ){ + pLoc = (const char*)sqlite3_column_text(pSeek, iCol+pConfig->nCol); + nLoc = sqlite3_column_bytes(pSeek, iCol + pConfig->nCol); + } } } @@ -258081,6 +258129,7 @@ static int fts5StorageDeleteFromIndex( } sqlite3Fts5ClearLocale(pConfig); } + sqlite3_value_free(pFree); } } if( rc==SQLITE_OK && p->nTotalRow<1 ){ diff --git a/src/3rdparty/sqlite/sqlite3.h b/src/3rdparty/sqlite/sqlite3.h index dae02e66c20..f56dd8d86a2 100644 --- a/src/3rdparty/sqlite/sqlite3.h +++ b/src/3rdparty/sqlite/sqlite3.h @@ -146,9 +146,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.50.1" -#define SQLITE_VERSION_NUMBER 3050001 -#define SQLITE_SOURCE_ID "2025-06-06 14:52:32 b77dc5e0f596d2140d9ac682b2893ff65d3a4140aa86067a3efebe29dc914c95" +#define SQLITE_VERSION "3.50.2" +#define SQLITE_VERSION_NUMBER 3050002 +#define SQLITE_SOURCE_ID "2025-06-28 14:00:48 2af157d77fb1304a74176eaee7fbc7c7e932d946bf25325e9c26c91db19e3079" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -4079,7 +4079,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of ** database filename D with corresponding journal file J and WAL file W and -** with N URI parameters key/values pairs in the array P. The result from +** an array P of N URI Key/Value pairs. The result from ** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that ** is safe to pass to routines like: ** <ul> @@ -4760,7 +4760,7 @@ typedef struct sqlite3_context sqlite3_context; ** METHOD: sqlite3_stmt ** ** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following +** literals may be replaced by a [parameter] that matches one of the following ** templates: ** ** <ul> @@ -4805,7 +4805,7 @@ typedef struct sqlite3_context sqlite3_context; ** ** [[byte-order determination rules]] ^The byte-order of ** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) -** found in first character, which is removed, or in the absence of a BOM +** found in the first character, which is removed, or in the absence of a BOM ** the byte order is the native byte order of the host ** machine for sqlite3_bind_text16() or the byte order specified in ** the 6th parameter for sqlite3_bind_text64().)^ @@ -4825,7 +4825,7 @@ typedef struct sqlite3_context sqlite3_context; ** or sqlite3_bind_text16() or sqlite3_bind_text64() then ** that parameter must be the byte offset ** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occurs at byte offsets less than +** terminated. If any NUL characters occur at byte offsets less than ** the value of the fourth parameter then the resulting string value will ** contain embedded NULs. The result of expressions involving strings ** with embedded NULs is undefined. @@ -5037,7 +5037,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); ** METHOD: sqlite3_stmt ** ** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in +** table column that is the origin of a particular result column in a ** [SELECT] statement. ** ^The name of the database or table or column can be returned as ** either a UTF-8 or UTF-16 string. ^The _database_ routines return @@ -5606,8 +5606,8 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** ** For best security, the [SQLITE_DIRECTONLY] flag is recommended for ** all application-defined SQL functions that do not need to be -** used inside of triggers, view, CHECK constraints, or other elements of -** the database schema. This flags is especially recommended for SQL +** used inside of triggers, views, CHECK constraints, or other elements of +** the database schema. This flag is especially recommended for SQL ** functions that have side effects or reveal internal application state. ** Without this flag, an attacker might be able to modify the schema of ** a database file to include invocations of the function with parameters @@ -5638,7 +5638,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** [user-defined window functions|available here]. ** ** ^(If the final parameter to sqlite3_create_function_v2() or -** sqlite3_create_window_function() is not NULL, then it is destructor for +** sqlite3_create_window_function() is not NULL, then it is the destructor for ** the application data pointer. The destructor is invoked when the function ** is deleted, either by being overloaded or when the database connection ** closes.)^ ^The destructor is also invoked if the call to @@ -6038,7 +6038,7 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** METHOD: sqlite3_value ** ** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] -** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** object V and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a ** memory allocation fails. ^If V is a [pointer value], then the result @@ -6076,7 +6076,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** allocation error occurs. ** ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the +** determined by the N parameter on the first successful call. Changing the ** value of N in any subsequent call to sqlite3_aggregate_context() within ** the same aggregate function instance will not resize the memory ** allocation.)^ Within the xFinal callback, it is customary to set @@ -6238,7 +6238,7 @@ SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(voi ** ** Security Warning: These interfaces should not be exposed in scripting ** languages or in other circumstances where it might be possible for an -** an attacker to invoke them. Any agent that can invoke these interfaces +** attacker to invoke them. Any agent that can invoke these interfaces ** can probably also take control of the process. ** ** Database connection client data is only available for SQLite @@ -6352,7 +6352,7 @@ typedef void (*sqlite3_destructor_type)(void*); ** pointed to by the 2nd parameter are taken as the application-defined ** function result. If the 3rd parameter is non-negative, then it ** must be the byte offset into the string where the NUL terminator would -** appear if the string where NUL terminated. If any NUL characters occur +** appear if the string were NUL terminated. If any NUL characters occur ** in the string at a byte offset that is less than the value of the 3rd ** parameter, then the resulting string will contain embedded NULs and the ** result of expressions operating on strings with embedded NULs is undefined. @@ -6410,7 +6410,7 @@ typedef void (*sqlite3_destructor_type)(void*); ** string and preferably a string literal. The sqlite3_result_pointer() ** routine is part of the [pointer passing interface] added for SQLite 3.20.0. ** -** If these routines are called from within the different thread +** If these routines are called from within a different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. */ @@ -6816,7 +6816,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** METHOD: sqlite3 ** ** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name -** for the N-th database on database connection D, or a NULL pointer of N is +** for the N-th database on database connection D, or a NULL pointer if N is ** out of range. An N value of 0 means the main database file. An N of 1 is ** the "temp" schema. Larger values of N correspond to various ATTACH-ed ** databases. @@ -6911,7 +6911,7 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** <dd>The SQLITE_TXN_READ state means that the database is currently ** in a read transaction. Content has been read from the database file ** but nothing in the database file has changed. The transaction state -** will advanced to SQLITE_TXN_WRITE if any changes occur and there are +** will be advanced to SQLITE_TXN_WRITE if any changes occur and there are ** no other conflicting concurrent write transactions. The transaction ** state will revert to SQLITE_TXN_NONE following a [ROLLBACK] or ** [COMMIT].</dd> @@ -6920,7 +6920,7 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** <dd>The SQLITE_TXN_WRITE state means that the database is currently ** in a write transaction. Content has been written to the database file ** but has not yet committed. The transaction state will change to -** to SQLITE_TXN_NONE at the next [ROLLBACK] or [COMMIT].</dd> +** SQLITE_TXN_NONE at the next [ROLLBACK] or [COMMIT].</dd> */ #define SQLITE_TXN_NONE 0 #define SQLITE_TXN_READ 1 @@ -7201,7 +7201,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** CAPI3REF: Impose A Limit On Heap Size ** ** These interfaces impose limits on the amount of heap memory that will be -** by all database connections within a single process. +** used by all database connections within a single process. ** ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the ** soft limit on the amount of heap memory that may be allocated by SQLite. @@ -7259,7 +7259,7 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** </ul>)^ ** ** The circumstances under which SQLite will enforce the heap limits may -** changes in future releases of SQLite. +** change in future releases of SQLite. */ SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); @@ -7374,8 +7374,8 @@ SQLITE_API int sqlite3_table_column_metadata( ** ^The entry point is zProc. ** ^(zProc may be 0, in which case SQLite will try to come up with an ** entry point name on its own. It first tries "sqlite3_extension_init". -** If that does not work, it constructs a name "sqlite3_X_init" where the -** X is consists of the lower-case equivalent of all ASCII alphabetic +** If that does not work, it constructs a name "sqlite3_X_init" where +** X consists of the lower-case equivalent of all ASCII alphabetic ** characters in the filename from the last "/" to the first following ** "." and omitting any initial "lib".)^ ** ^The sqlite3_load_extension() interface returns @@ -7446,7 +7446,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** ^(Even though the function prototype shows that xEntryPoint() takes ** no arguments and returns void, SQLite invokes xEntryPoint() with three ** arguments and expects an integer result as if the signature of the -** entry point where as follows: +** entry point were as follows: ** ** <blockquote><pre> ** int xEntryPoint( @@ -7610,7 +7610,7 @@ struct sqlite3_module { ** virtual table and might not be checked again by the byte code.)^ ^(The ** aConstraintUsage[].omit flag is an optimization hint. When the omit flag ** is left in its default setting of false, the constraint will always be -** checked separately in byte code. If the omit flag is change to true, then +** checked separately in byte code. If the omit flag is changed to true, then ** the constraint may or may not be checked in byte code. In other words, ** when the omit flag is true there is no guarantee that the constraint will ** not be checked again using byte code.)^ @@ -7636,7 +7636,7 @@ struct sqlite3_module { ** The xBestIndex method may optionally populate the idxFlags field with a ** mask of SQLITE_INDEX_SCAN_* flags. One such flag is ** [SQLITE_INDEX_SCAN_HEX], which if set causes the [EXPLAIN QUERY PLAN] -** output to show the idxNum has hex instead of as decimal. Another flag is +** output to show the idxNum as hex instead of as decimal. Another flag is ** SQLITE_INDEX_SCAN_UNIQUE, which if set indicates that the query plan will ** return at most one row. ** @@ -7777,7 +7777,7 @@ struct sqlite3_index_info { ** the implementation of the [virtual table module]. ^The fourth ** parameter is an arbitrary client data pointer that is passed through ** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. +** when a new virtual table is being created or reinitialized. ** ** ^The sqlite3_create_module_v2() interface has a fifth parameter which ** is a pointer to a destructor for the pClientData. ^SQLite will @@ -7942,7 +7942,7 @@ typedef struct sqlite3_blob sqlite3_blob; ** in *ppBlob. Otherwise an [error code] is returned and, unless the error ** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided ** the API is not misused, it is always safe to call [sqlite3_blob_close()] -** on *ppBlob after this function it returns. +** on *ppBlob after this function returns. ** ** This function fails with SQLITE_ERROR if any of the following are true: ** <ul> @@ -8062,7 +8062,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** ** ^Returns the size in bytes of the BLOB accessible via the ** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing +** incremental blob I/O routines can only read or overwrite existing ** blob content; they cannot change the size of a blob. ** ** This routine only works on a [BLOB handle] which has been created @@ -8212,7 +8212,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ^The sqlite3_mutex_alloc() routine allocates a new ** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() ** routine returns NULL if it is unable to allocate the requested -** mutex. The argument to sqlite3_mutex_alloc() must one of these +** mutex. The argument to sqlite3_mutex_alloc() must be one of these ** integer constants: ** ** <ul> @@ -8445,7 +8445,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); ** CAPI3REF: Retrieve the mutex for a database connection ** METHOD: sqlite3 ** -** ^This interface returns a pointer the [sqlite3_mutex] object that +** ^This interface returns a pointer to the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument ** when the [threading mode] is Serialized. ** ^If the [threading mode] is Single-thread or Multi-thread then this @@ -8568,7 +8568,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** CAPI3REF: SQL Keyword Checking ** ** These routines provide access to the set of SQL language keywords -** recognized by SQLite. Applications can uses these routines to determine +** recognized by SQLite. Applications can use these routines to determine ** whether or not a specific identifier needs to be escaped (for example, ** by enclosing in double-quotes) so as not to confuse the parser. ** @@ -8736,7 +8736,7 @@ SQLITE_API void sqlite3_str_reset(sqlite3_str*); ** content of the dynamic string under construction in X. The value ** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X ** and might be freed or altered by any subsequent method on the same -** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str] object. Applications must not use the pointer returned by ** [sqlite3_str_value(X)] after any subsequent method call on the same ** object. ^Applications may change the content of the string returned ** by [sqlite3_str_value(X)] as long as they do not write into any bytes @@ -8822,7 +8822,7 @@ SQLITE_API int sqlite3_status64( ** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] ** buffer and where forced to overflow to [sqlite3_malloc()]. The ** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to +** were too large (they were larger than the "sz" parameter to ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because ** no space was left in the page cache.</dd>)^ ** @@ -8906,28 +8906,29 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_HIT</dt> ** <dd>This parameter returns the number of malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE</dt> -** <dd>This parameter returns the number malloc attempts that might have +** <dd>This parameter returns the number of malloc attempts that might have ** been satisfied using lookaside memory but failed due to the amount of ** memory requested being larger than the lookaside slot size. ** Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL</dt> -** <dd>This parameter returns the number malloc attempts that might have +** <dd>This parameter returns the number of malloc attempts that might have ** been satisfied using lookaside memory but failed due to all lookaside ** memory already being in use. ** Only the high-water value is meaningful; -** the current value is always zero.)^ +** the current value is always zero.</dd>)^ ** ** [[SQLITE_DBSTATUS_CACHE_USED]] ^(<dt>SQLITE_DBSTATUS_CACHE_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** </dd> ** ** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] ** ^(<dt>SQLITE_DBSTATUS_CACHE_USED_SHARED</dt> @@ -8936,10 +8937,10 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** memory used by that pager cache is divided evenly between the attached ** connections.)^ In other words, if none of the pager caches associated ** with the database connection are shared, this request returns the same -** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** value as DBSTATUS_CACHE_USED. Or, if one or more of the pager caches are ** shared, the value returned by this call will be smaller than that returned ** by DBSTATUS_CACHE_USED. ^The highwater mark associated with -** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0.</dd> ** ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap @@ -8949,6 +8950,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** schema memory is shared with other database connections due to ** [shared cache mode] being enabled. ** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** </dd> ** ** [[SQLITE_DBSTATUS_STMT_USED]] ^(<dt>SQLITE_DBSTATUS_STMT_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap @@ -8985,7 +8987,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** been written to disk in the middle of a transaction due to the page ** cache overflowing. Transactions are more efficient if they are written ** to disk all at once. When pages spill mid-transaction, that introduces -** additional overhead. This parameter can be used help identify +** additional overhead. This parameter can be used to help identify ** inefficiencies that can be resolved by increasing the cache size. ** </dd> ** @@ -9465,7 +9467,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** external process or via a database connection other than the one being ** used by the backup operation, then the backup will be automatically ** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used +** database is modified by using the same database connection as is used ** by the backup operation, then the backup database is automatically ** updated at the same time. ** @@ -9482,7 +9484,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** and may not be used following a call to sqlite3_backup_finish(). ** ** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() errors occurred, regardless of whether or not ** sqlite3_backup_step() completed. ** ^If an out-of-memory condition or IO error occurred during any prior ** sqlite3_backup_step() call on the same [sqlite3_backup] object, then @@ -10552,7 +10554,7 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); ** METHOD: sqlite3 ** ** ^If a write-transaction is open on [database connection] D when the -** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** [sqlite3_db_cacheflush(D)] interface is invoked, any dirty ** pages in the pager-cache that are not currently in use are written out ** to disk. A dirty page may be in use if a database cursor created by an ** active SQL statement is reading from it, or if it is page 1 of a database diff --git a/src/3rdparty/sqlite/update_sqlite.sh b/src/3rdparty/sqlite/update_sqlite.sh index fb0fb8bbbc3..321e4c1a2e8 100755 --- a/src/3rdparty/sqlite/update_sqlite.sh +++ b/src/3rdparty/sqlite/update_sqlite.sh @@ -8,7 +8,7 @@ version_maj=3 version_min=50 -version_patch=1 +version_patch=2 year=2025 version=${version_maj}.${version_min}.${version_patch} diff --git a/src/android/CMakeLists.txt b/src/android/CMakeLists.txt index 7c99ce7264e..12fbca624b3 100644 --- a/src/android/CMakeLists.txt +++ b/src/android/CMakeLists.txt @@ -9,6 +9,7 @@ if (ANDROID) add_subdirectory(java) add_subdirectory(templates) add_subdirectory(templates_aar) + add_subdirectory(templates_cmake) endif() qt_internal_add_java_documentation(Global) diff --git a/src/android/REUSE.toml b/src/android/REUSE.toml index 7d5a22fd2f7..6d821d52904 100644 --- a/src/android/REUSE.toml +++ b/src/android/REUSE.toml @@ -1,7 +1,7 @@ version = 1 [[annotations]] -path = ["jar/build.gradle", "jar/settings.gradle", "templates/build.gradle"] +path = ["jar/build.gradle", "jar/settings.gradle", "templates/build.gradle", "templates_cmake/**"] precedence = "closest" comment = "double check" SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." 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/android/templates/build.gradle b/src/android/templates/build.gradle index 6595cb5358f..b6c4797fde7 100644 --- a/src/android/templates/build.gradle +++ b/src/android/templates/build.gradle @@ -70,8 +70,8 @@ android { abortOnError = false } - // Do not compress Qt binary resources file aaptOptions { + // Do not compress Qt binary resources file noCompress 'rcc' } diff --git a/src/android/templates_cmake/CMakeLists.txt b/src/android/templates_cmake/CMakeLists.txt new file mode 100644 index 00000000000..546a4fc50f3 --- /dev/null +++ b/src/android/templates_cmake/CMakeLists.txt @@ -0,0 +1,46 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +set(templates_files + "${CMAKE_CURRENT_SOURCE_DIR}/settings.gradle.in" + "${CMAKE_CURRENT_SOURCE_DIR}/gradle.properties.in" +) + +set(app_template_files + "${CMAKE_CURRENT_SOURCE_DIR}/app/gradle.properties.in" + "${CMAKE_CURRENT_SOURCE_DIR}/app/build.gradle.in" + "${CMAKE_CURRENT_SOURCE_DIR}/app/AndroidManifest.xml.in" +) + +set(dynamic_feature_files + "${CMAKE_CURRENT_SOURCE_DIR}/dynamic_feature/AndroidManifest.xml.in" + "${CMAKE_CURRENT_SOURCE_DIR}/dynamic_feature/build.gradle.in" +) + +add_custom_target(Qt6AndroidCMakeTemplates + SOURCES + ${templates_files} +) + +qt_path_join(destination ${QT_INSTALL_DIR} ${INSTALL_DATADIR} "src/android/templates_cmake") + +qt_copy_or_install(FILES ${templates_files} DESTINATION "${destination}") +qt_copy_or_install(FILES ${app_template_files} DESTINATION "${destination}/app") +qt_copy_or_install(FILES ${dynamic_feature_files} DESTINATION "${destination}/dynamic_feature") + +if(NOT QT_WILL_INSTALL) + qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates + FILES ${templates_files} + DESTINATION ${destination} + ) + + qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates + FILES ${app_templates_files} + DESTINATION ${destination}/app + ) + + qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates + FILES ${dynamic_feature_files} + DESTINATION ${destination}/dynamic_feature + ) +endif() diff --git a/src/android/templates_cmake/app/AndroidManifest.xml.in b/src/android/templates_cmake/app/AndroidManifest.xml.in new file mode 100644 index 00000000000..61c33cc7657 --- /dev/null +++ b/src/android/templates_cmake/app/AndroidManifest.xml.in @@ -0,0 +1,54 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:dist="http://schemas.android.com/apk/distribution" + package="@APP_PACKAGE_NAME@" + android:installLocation="auto" + android:versionCode="@APP_VERSION_CODE@" + android:versionName="@APP_VERSION_NAME@"> + @APP_PERMISSIONS@ + @APP_FEATURES@ + <dist:module dist:instant="true"/> + <supports-screens + android:anyDensity="true" + android:largeScreens="true" + android:normalScreens="true" + android:smallScreens="true" /> + <application + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:hardwareAccelerated="true" + android:label="@APP_NAME@" + @APP_ICON@ + android:requestLegacyExternalStorage="true" + android:allowBackup="true" + android:fullBackupOnly="false"> + <activity + android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:launchMode="singleTop" + android:screenOrientation="unspecified" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + <meta-data + android:name="android.app.lib_name" + android:value="@APP_LIB_NAME@" /> + + <meta-data + android:name="android.app.arguments" + android:value="@APP_ARGUMENTS@" /> + </activity> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.qtprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/qtprovider_paths"/> + </provider> + </application> +</manifest> diff --git a/src/android/templates_cmake/app/build.gradle.in b/src/android/templates_cmake/app/build.gradle.in new file mode 100644 index 00000000000..917f371e46f --- /dev/null +++ b/src/android/templates_cmake/app/build.gradle.in @@ -0,0 +1,53 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.10.1' + } +} + +apply plugin: '@GRADLE_PLUGIN_TYPE@' + +dependencies { + @GRADLE_DEPENDENCIES@ +} + +android { + namespace '@PACKAGE_NAME@' + compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@' + buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@' + ndkVersion '@ANDROID_NDK_REVISION@' + + defaultConfig { + @DEFAULT_CONFIG_VALUES@ + } + + sourceSets { + main { +@SOURCE_SETS@ + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + aaptOptions { + // Do not compress Qt binary resources file + noCompress 'rcc' + } + + @ANDROID_DEPLOYMENT_EXTRAS@ +} diff --git a/src/android/templates_cmake/app/gradle.properties.in b/src/android/templates_cmake/app/gradle.properties.in new file mode 100644 index 00000000000..1136551f3fa --- /dev/null +++ b/src/android/templates_cmake/app/gradle.properties.in @@ -0,0 +1 @@ +# Extend this template with the extra gradle properties applicable for Android app. diff --git a/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in b/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in new file mode 100644 index 00000000000..9945ec76f27 --- /dev/null +++ b/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:dist="http://schemas.android.com/apk/distribution" + split="@APP_TARGET@" + android:isFeatureSplit="true"> + <dist:module + dist:instant="true" + dist:title="@TITLE_VAR@"> + <dist:delivery> + <dist:on-demand /> + </dist:delivery> + <dist:fusing dist:include="false" /> + </dist:module> + <application android:hasCode="false"/> +</manifest> diff --git a/src/android/templates_cmake/dynamic_feature/build.gradle.in b/src/android/templates_cmake/dynamic_feature/build.gradle.in new file mode 100644 index 00000000000..917f371e46f --- /dev/null +++ b/src/android/templates_cmake/dynamic_feature/build.gradle.in @@ -0,0 +1,53 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.10.1' + } +} + +apply plugin: '@GRADLE_PLUGIN_TYPE@' + +dependencies { + @GRADLE_DEPENDENCIES@ +} + +android { + namespace '@PACKAGE_NAME@' + compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@' + buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@' + ndkVersion '@ANDROID_NDK_REVISION@' + + defaultConfig { + @DEFAULT_CONFIG_VALUES@ + } + + sourceSets { + main { +@SOURCE_SETS@ + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + aaptOptions { + // Do not compress Qt binary resources file + noCompress 'rcc' + } + + @ANDROID_DEPLOYMENT_EXTRAS@ +} diff --git a/src/android/templates_cmake/gradle.properties.in b/src/android/templates_cmake/gradle.properties.in new file mode 100644 index 00000000000..b751946190a --- /dev/null +++ b/src/android/templates_cmake/gradle.properties.in @@ -0,0 +1,12 @@ +# Project-wide Gradle settings. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# Enable building projects in parallel +org.gradle.parallel=true + +# Allow AndroidX usage +android.useAndroidX=true diff --git a/src/android/templates_cmake/settings.gradle.in b/src/android/templates_cmake/settings.gradle.in new file mode 100644 index 00000000000..03954ae5f9f --- /dev/null +++ b/src/android/templates_cmake/settings.gradle.in @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "@ROOT_PROJECT_NAME@" +include(":app") +@SUBPROJECTS@ diff --git a/src/assets/CMakeLists.txt b/src/assets/CMakeLists.txt index da9c0c14eea..ab07d27696e 100644 --- a/src/assets/CMakeLists.txt +++ b/src/assets/CMakeLists.txt @@ -1,6 +1,5 @@ # Copyright (C) 2024 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -add_subdirectory(icons) if (NOT INTEGRITY AND TARGET Qt6::Network AND TARGET Qt6::Concurrent) add_subdirectory(downloader) diff --git a/src/assets/icons/128x128/document-new.png b/src/assets/icons/128x128/document-new.png Binary files differdeleted file mode 100644 index 8d86a4827a7..00000000000 --- a/src/assets/icons/128x128/document-new.png +++ /dev/null diff --git a/src/assets/icons/128x128/document-open.png b/src/assets/icons/128x128/document-open.png Binary files differdeleted file mode 100644 index 2183dbbea64..00000000000 --- a/src/assets/icons/128x128/document-open.png +++ /dev/null diff --git a/src/assets/icons/128x128/document-print.png b/src/assets/icons/128x128/document-print.png Binary files differdeleted file mode 100644 index 9e7378aab2a..00000000000 --- a/src/assets/icons/128x128/document-print.png +++ /dev/null diff --git a/src/assets/icons/128x128/document-save.png b/src/assets/icons/128x128/document-save.png Binary files differdeleted file mode 100644 index e8b28406433..00000000000 --- a/src/assets/icons/128x128/document-save.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-copy.png b/src/assets/icons/128x128/edit-copy.png Binary files differdeleted file mode 100644 index 7585f4baa0c..00000000000 --- a/src/assets/icons/128x128/edit-copy.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-cut.png b/src/assets/icons/128x128/edit-cut.png Binary files differdeleted file mode 100644 index 51ede2fe37e..00000000000 --- a/src/assets/icons/128x128/edit-cut.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-delete.png b/src/assets/icons/128x128/edit-delete.png Binary files differdeleted file mode 100644 index bdf785c8285..00000000000 --- a/src/assets/icons/128x128/edit-delete.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-paste.png b/src/assets/icons/128x128/edit-paste.png Binary files differdeleted file mode 100644 index 690ffa172d9..00000000000 --- a/src/assets/icons/128x128/edit-paste.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-redo.png b/src/assets/icons/128x128/edit-redo.png Binary files differdeleted file mode 100644 index f1c97f71c25..00000000000 --- a/src/assets/icons/128x128/edit-redo.png +++ /dev/null diff --git a/src/assets/icons/128x128/edit-undo.png b/src/assets/icons/128x128/edit-undo.png Binary files differdeleted file mode 100644 index e728cbf6e03..00000000000 --- a/src/assets/icons/128x128/edit-undo.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-justify-center.png b/src/assets/icons/128x128/format-justify-center.png Binary files differdeleted file mode 100644 index 44ceb2af4d5..00000000000 --- a/src/assets/icons/128x128/format-justify-center.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-justify-fill.png b/src/assets/icons/128x128/format-justify-fill.png Binary files differdeleted file mode 100644 index b99a8507046..00000000000 --- a/src/assets/icons/128x128/format-justify-fill.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-justify-left.png b/src/assets/icons/128x128/format-justify-left.png Binary files differdeleted file mode 100644 index 2b63887b495..00000000000 --- a/src/assets/icons/128x128/format-justify-left.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-justify-right.png b/src/assets/icons/128x128/format-justify-right.png Binary files differdeleted file mode 100644 index 6c61889d595..00000000000 --- a/src/assets/icons/128x128/format-justify-right.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-text-bold.png b/src/assets/icons/128x128/format-text-bold.png Binary files differdeleted file mode 100644 index 96a5ca88a22..00000000000 --- a/src/assets/icons/128x128/format-text-bold.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-text-italic.png b/src/assets/icons/128x128/format-text-italic.png Binary files differdeleted file mode 100644 index 2bb71b4a4d3..00000000000 --- a/src/assets/icons/128x128/format-text-italic.png +++ /dev/null diff --git a/src/assets/icons/128x128/format-text-underline.png b/src/assets/icons/128x128/format-text-underline.png Binary files differdeleted file mode 100644 index ecf6830c929..00000000000 --- a/src/assets/icons/128x128/format-text-underline.png +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 32776b51a96..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 06e188b93b9..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 644e3c149af..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 16fa70493a2..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index b18bead117f..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index d9454cebf1c..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 4081cdb2ca7..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 3358426818d..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index e28b28542c6..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index fe10f57a398..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index d4ad74b0d07..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index bf0dd84bbb0..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index dde68c8514a..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 8a5e7518bdc..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 665d3ce37b5..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 4b6846a6b98..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected] Binary files differdeleted file mode 100644 index 601f73216a3..00000000000 --- a/src/assets/icons/128x128@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16/document-new.png b/src/assets/icons/16x16/document-new.png Binary files differdeleted file mode 100644 index 893e7e1aec4..00000000000 --- a/src/assets/icons/16x16/document-new.png +++ /dev/null diff --git a/src/assets/icons/16x16/document-open.png b/src/assets/icons/16x16/document-open.png Binary files differdeleted file mode 100644 index b07906f40bd..00000000000 --- a/src/assets/icons/16x16/document-open.png +++ /dev/null diff --git a/src/assets/icons/16x16/document-print.png b/src/assets/icons/16x16/document-print.png Binary files differdeleted file mode 100644 index 9341060076f..00000000000 --- a/src/assets/icons/16x16/document-print.png +++ /dev/null diff --git a/src/assets/icons/16x16/document-save.png b/src/assets/icons/16x16/document-save.png Binary files differdeleted file mode 100644 index 6238718191b..00000000000 --- a/src/assets/icons/16x16/document-save.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-copy.png b/src/assets/icons/16x16/edit-copy.png Binary files differdeleted file mode 100644 index 585f5bfc8d8..00000000000 --- a/src/assets/icons/16x16/edit-copy.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-cut.png b/src/assets/icons/16x16/edit-cut.png Binary files differdeleted file mode 100644 index 661ef1ad030..00000000000 --- a/src/assets/icons/16x16/edit-cut.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-delete.png b/src/assets/icons/16x16/edit-delete.png Binary files differdeleted file mode 100644 index 7b5998df8a4..00000000000 --- a/src/assets/icons/16x16/edit-delete.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-paste.png b/src/assets/icons/16x16/edit-paste.png Binary files differdeleted file mode 100644 index 6318a22caf3..00000000000 --- a/src/assets/icons/16x16/edit-paste.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-redo.png b/src/assets/icons/16x16/edit-redo.png Binary files differdeleted file mode 100644 index 7eb10fe899c..00000000000 --- a/src/assets/icons/16x16/edit-redo.png +++ /dev/null diff --git a/src/assets/icons/16x16/edit-undo.png b/src/assets/icons/16x16/edit-undo.png Binary files differdeleted file mode 100644 index 108712547cb..00000000000 --- a/src/assets/icons/16x16/edit-undo.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-justify-center.png b/src/assets/icons/16x16/format-justify-center.png Binary files differdeleted file mode 100644 index 6b0951fa5dd..00000000000 --- a/src/assets/icons/16x16/format-justify-center.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-justify-fill.png b/src/assets/icons/16x16/format-justify-fill.png Binary files differdeleted file mode 100644 index 6e1c10d7c45..00000000000 --- a/src/assets/icons/16x16/format-justify-fill.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-justify-left.png b/src/assets/icons/16x16/format-justify-left.png Binary files differdeleted file mode 100644 index 9dfdc89b68a..00000000000 --- a/src/assets/icons/16x16/format-justify-left.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-justify-right.png b/src/assets/icons/16x16/format-justify-right.png Binary files differdeleted file mode 100644 index 36a52081f18..00000000000 --- a/src/assets/icons/16x16/format-justify-right.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-text-bold.png b/src/assets/icons/16x16/format-text-bold.png Binary files differdeleted file mode 100644 index a079317a947..00000000000 --- a/src/assets/icons/16x16/format-text-bold.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-text-italic.png b/src/assets/icons/16x16/format-text-italic.png Binary files differdeleted file mode 100644 index 04202b2842f..00000000000 --- a/src/assets/icons/16x16/format-text-italic.png +++ /dev/null diff --git a/src/assets/icons/16x16/format-text-underline.png b/src/assets/icons/16x16/format-text-underline.png Binary files differdeleted file mode 100644 index a80368212d8..00000000000 --- a/src/assets/icons/16x16/format-text-underline.png +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 482ae52024e..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 9858b146f44..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 1672ec58971..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index f04de746731..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index bbb34cc4c22..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index d89ef6c0167..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 4c97ee24952..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 299fa776867..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 4f8849c7110..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index b3d366c53f6..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 80c3afd9a6e..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 33589ea25d0..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index ba028211355..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 8e15d0cb44f..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 754efdd9755..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 6db31a4f697..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected] Binary files differdeleted file mode 100644 index 977cde9d974..00000000000 --- a/src/assets/icons/16x16@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256/document-new.png b/src/assets/icons/256x256/document-new.png Binary files differdeleted file mode 100644 index 32776b51a96..00000000000 --- a/src/assets/icons/256x256/document-new.png +++ /dev/null diff --git a/src/assets/icons/256x256/document-open.png b/src/assets/icons/256x256/document-open.png Binary files differdeleted file mode 100644 index 06e188b93b9..00000000000 --- a/src/assets/icons/256x256/document-open.png +++ /dev/null diff --git a/src/assets/icons/256x256/document-print.png b/src/assets/icons/256x256/document-print.png Binary files differdeleted file mode 100644 index 644e3c149af..00000000000 --- a/src/assets/icons/256x256/document-print.png +++ /dev/null diff --git a/src/assets/icons/256x256/document-save.png b/src/assets/icons/256x256/document-save.png Binary files differdeleted file mode 100644 index 16fa70493a2..00000000000 --- a/src/assets/icons/256x256/document-save.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-copy.png b/src/assets/icons/256x256/edit-copy.png Binary files differdeleted file mode 100644 index b18bead117f..00000000000 --- a/src/assets/icons/256x256/edit-copy.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-cut.png b/src/assets/icons/256x256/edit-cut.png Binary files differdeleted file mode 100644 index d9454cebf1c..00000000000 --- a/src/assets/icons/256x256/edit-cut.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-delete.png b/src/assets/icons/256x256/edit-delete.png Binary files differdeleted file mode 100644 index 4081cdb2ca7..00000000000 --- a/src/assets/icons/256x256/edit-delete.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-paste.png b/src/assets/icons/256x256/edit-paste.png Binary files differdeleted file mode 100644 index 3358426818d..00000000000 --- a/src/assets/icons/256x256/edit-paste.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-redo.png b/src/assets/icons/256x256/edit-redo.png Binary files differdeleted file mode 100644 index e28b28542c6..00000000000 --- a/src/assets/icons/256x256/edit-redo.png +++ /dev/null diff --git a/src/assets/icons/256x256/edit-undo.png b/src/assets/icons/256x256/edit-undo.png Binary files differdeleted file mode 100644 index fe10f57a398..00000000000 --- a/src/assets/icons/256x256/edit-undo.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-justify-center.png b/src/assets/icons/256x256/format-justify-center.png Binary files differdeleted file mode 100644 index d4ad74b0d07..00000000000 --- a/src/assets/icons/256x256/format-justify-center.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-justify-fill.png b/src/assets/icons/256x256/format-justify-fill.png Binary files differdeleted file mode 100644 index bf0dd84bbb0..00000000000 --- a/src/assets/icons/256x256/format-justify-fill.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-justify-left.png b/src/assets/icons/256x256/format-justify-left.png Binary files differdeleted file mode 100644 index dde68c8514a..00000000000 --- a/src/assets/icons/256x256/format-justify-left.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-justify-right.png b/src/assets/icons/256x256/format-justify-right.png Binary files differdeleted file mode 100644 index 8a5e7518bdc..00000000000 --- a/src/assets/icons/256x256/format-justify-right.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-text-bold.png b/src/assets/icons/256x256/format-text-bold.png Binary files differdeleted file mode 100644 index 665d3ce37b5..00000000000 --- a/src/assets/icons/256x256/format-text-bold.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-text-italic.png b/src/assets/icons/256x256/format-text-italic.png Binary files differdeleted file mode 100644 index 4b6846a6b98..00000000000 --- a/src/assets/icons/256x256/format-text-italic.png +++ /dev/null diff --git a/src/assets/icons/256x256/format-text-underline.png b/src/assets/icons/256x256/format-text-underline.png Binary files differdeleted file mode 100644 index 601f73216a3..00000000000 --- a/src/assets/icons/256x256/format-text-underline.png +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index bfec6d0e6d1..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 630a05f622c..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index c8611c31c49..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 6f460959818..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 2f350041a05..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index e11cf6d2347..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index efe6b90bf59..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 32f54b39598..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 1f6e366535b..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 980ed370621..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index af7044ddee1..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index da14563bd68..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index c1025bf0102..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 3a07e06e0f3..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index b0f4cb09958..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 85f0cfc1d65..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected] Binary files differdeleted file mode 100644 index 51ee0aa7783..00000000000 --- a/src/assets/icons/256x256@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32/document-new.png b/src/assets/icons/32x32/document-new.png Binary files differdeleted file mode 100644 index 482ae52024e..00000000000 --- a/src/assets/icons/32x32/document-new.png +++ /dev/null diff --git a/src/assets/icons/32x32/document-open.png b/src/assets/icons/32x32/document-open.png Binary files differdeleted file mode 100644 index 9858b146f44..00000000000 --- a/src/assets/icons/32x32/document-open.png +++ /dev/null diff --git a/src/assets/icons/32x32/document-print.png b/src/assets/icons/32x32/document-print.png Binary files differdeleted file mode 100644 index 1672ec58971..00000000000 --- a/src/assets/icons/32x32/document-print.png +++ /dev/null diff --git a/src/assets/icons/32x32/document-save.png b/src/assets/icons/32x32/document-save.png Binary files differdeleted file mode 100644 index f04de746731..00000000000 --- a/src/assets/icons/32x32/document-save.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-copy.png b/src/assets/icons/32x32/edit-copy.png Binary files differdeleted file mode 100644 index bbb34cc4c22..00000000000 --- a/src/assets/icons/32x32/edit-copy.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-cut.png b/src/assets/icons/32x32/edit-cut.png Binary files differdeleted file mode 100644 index d89ef6c0167..00000000000 --- a/src/assets/icons/32x32/edit-cut.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-delete.png b/src/assets/icons/32x32/edit-delete.png Binary files differdeleted file mode 100644 index 4c97ee24952..00000000000 --- a/src/assets/icons/32x32/edit-delete.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-paste.png b/src/assets/icons/32x32/edit-paste.png Binary files differdeleted file mode 100644 index 299fa776867..00000000000 --- a/src/assets/icons/32x32/edit-paste.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-redo.png b/src/assets/icons/32x32/edit-redo.png Binary files differdeleted file mode 100644 index 4f8849c7110..00000000000 --- a/src/assets/icons/32x32/edit-redo.png +++ /dev/null diff --git a/src/assets/icons/32x32/edit-undo.png b/src/assets/icons/32x32/edit-undo.png Binary files differdeleted file mode 100644 index b3d366c53f6..00000000000 --- a/src/assets/icons/32x32/edit-undo.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-justify-center.png b/src/assets/icons/32x32/format-justify-center.png Binary files differdeleted file mode 100644 index 80c3afd9a6e..00000000000 --- a/src/assets/icons/32x32/format-justify-center.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-justify-fill.png b/src/assets/icons/32x32/format-justify-fill.png Binary files differdeleted file mode 100644 index 33589ea25d0..00000000000 --- a/src/assets/icons/32x32/format-justify-fill.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-justify-left.png b/src/assets/icons/32x32/format-justify-left.png Binary files differdeleted file mode 100644 index ba028211355..00000000000 --- a/src/assets/icons/32x32/format-justify-left.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-justify-right.png b/src/assets/icons/32x32/format-justify-right.png Binary files differdeleted file mode 100644 index 8e15d0cb44f..00000000000 --- a/src/assets/icons/32x32/format-justify-right.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-text-bold.png b/src/assets/icons/32x32/format-text-bold.png Binary files differdeleted file mode 100644 index 754efdd9755..00000000000 --- a/src/assets/icons/32x32/format-text-bold.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-text-italic.png b/src/assets/icons/32x32/format-text-italic.png Binary files differdeleted file mode 100644 index 6db31a4f697..00000000000 --- a/src/assets/icons/32x32/format-text-italic.png +++ /dev/null diff --git a/src/assets/icons/32x32/format-text-underline.png b/src/assets/icons/32x32/format-text-underline.png Binary files differdeleted file mode 100644 index 977cde9d974..00000000000 --- a/src/assets/icons/32x32/format-text-underline.png +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index c9245760612..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 68e75b549a0..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index b7843367393..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index f4cca4b3238..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 9690d6bb041..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 408b0ae19b0..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 58abfc1fa53..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index b8c288f6c70..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 89fcd33c300..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 6f7ad2cb402..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 9b2cc1ed160..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 1212e9f7613..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 8c0eca3037e..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index fb0ed702525..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 0e67ead0b8c..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index f746f8956f8..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected] Binary files differdeleted file mode 100644 index 47d6fced026..00000000000 --- a/src/assets/icons/32x32@2/[email protected] +++ /dev/null diff --git a/src/assets/icons/CMakeLists.txt b/src/assets/icons/CMakeLists.txt deleted file mode 100644 index f5adb229d85..00000000000 --- a/src/assets/icons/CMakeLists.txt +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright (C) 2023 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -qt_internal_add_module(ExampleIconsPrivate - CONFIG_MODULE_NAME example_icons - STATIC - INTERNAL_MODULE - NO_GENERATE_CPP_EXPORTS -) - -set(icons_resource_files - index.theme - 16x16/document-new.png - 16x16/document-open.png - 16x16/document-print.png - 16x16/document-save.png - 16x16/edit-copy.png - 16x16/edit-cut.png - 16x16/edit-delete.png - 16x16/edit-paste.png - 16x16/edit-redo.png - 16x16/edit-undo.png - 16x16/format-justify-center.png - 16x16/format-justify-fill.png - 16x16/format-justify-left.png - 16x16/format-justify-right.png - 16x16/format-text-bold.png - 16x16/format-text-italic.png - 16x16/format-text-underline.png - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 16x16@2/[email protected] - 32x32/document-new.png - 32x32/document-open.png - 32x32/document-print.png - 32x32/document-save.png - 32x32/edit-copy.png - 32x32/edit-cut.png - 32x32/edit-delete.png - 32x32/edit-paste.png - 32x32/edit-redo.png - 32x32/edit-undo.png - 32x32/format-justify-center.png - 32x32/format-justify-fill.png - 32x32/format-justify-left.png - 32x32/format-justify-right.png - 32x32/format-text-bold.png - 32x32/format-text-italic.png - 32x32/format-text-underline.png - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 32x32@2/[email protected] - 128x128/document-new.png - 128x128/document-open.png - 128x128/document-print.png - 128x128/document-save.png - 128x128/edit-copy.png - 128x128/edit-cut.png - 128x128/edit-delete.png - 128x128/edit-paste.png - 128x128/edit-redo.png - 128x128/edit-undo.png - 128x128/format-justify-center.png - 128x128/format-justify-fill.png - 128x128/format-justify-left.png - 128x128/format-justify-right.png - 128x128/format-text-bold.png - 128x128/format-text-italic.png - 128x128/format-text-underline.png - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 128x128@2/[email protected] - 256x256/document-new.png - 256x256/document-open.png - 256x256/document-print.png - 256x256/document-save.png - 256x256/edit-copy.png - 256x256/edit-cut.png - 256x256/edit-delete.png - 256x256/edit-paste.png - 256x256/edit-redo.png - 256x256/edit-undo.png - 256x256/format-justify-center.png - 256x256/format-justify-fill.png - 256x256/format-justify-left.png - 256x256/format-justify-right.png - 256x256/format-text-bold.png - 256x256/format-text-italic.png - 256x256/format-text-underline.png - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - 256x256@2/[email protected] - scalable/document-new.svg - scalable/document-open.svg - scalable/document-print.svg - scalable/document-save.svg - scalable/edit-copy.svg - scalable/edit-cut.svg - scalable/edit-delete.svg - scalable/edit-paste.svg - scalable/edit-redo.svg - scalable/edit-undo.svg - scalable/format-justify-center.svg - scalable/format-justify-fill.svg - scalable/format-justify-left.svg - scalable/format-justify-right.svg - scalable/format-text-bold.svg - scalable/format-text-italic.svg - scalable/format-text-underline.svg -) - -qt_internal_add_resource(ExampleIconsPrivate "example_icons" - PREFIX - "/qt-project.org/icons/example_icons" - FILES - ${icons_resource_files} -) - diff --git a/src/assets/icons/README b/src/assets/icons/README deleted file mode 100644 index 26d94e9ff13..00000000000 --- a/src/assets/icons/README +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (C) 2023 The Qt Company Ltd. -SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -Setting up a project for using Example icon library - -1. Add ExampleIconsPrivate component to your project CMakeList.txt file - ... - find_package(Qt6 - REQUIRED COMPONENTS Core Gui Widgets ExampleIconsPrivate - ) - - target_link_libraries(imageviewer PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets - Qt6::ExampleIconsPrivate - ) - ... - -2. Load the theme - ... - QIcon::setThemeSearchPaths(QIcon::themeSearchPaths() << u":/qt-project.org/icons"_s); - QIcon::setFallbackThemeName(u"example_icons"_s); - ... - -3. Use the icons - ... - const QIcon openIcon = QIcon::fromTheme("document-open"); - ... diff --git a/src/assets/icons/index.theme b/src/assets/icons/index.theme deleted file mode 100644 index e389719e01c..00000000000 --- a/src/assets/icons/index.theme +++ /dev/null @@ -1,46 +0,0 @@ -[Icon Theme] -Name=example_icons - -Directories=16x16,16x16@2,32x32,32x32@2,128x128,128x128@2,256x256,256x256@2,scalable - -[16x16] -Size=16 -Type=Fixed - -[16x16@2] -Size=16 -Scale=2 -Type=Fixed - -[32x32] -Size=32 -Type=Fixed - -[32x32@2] -Size=32 -Scale=2 -Type=Fixed - -[128x128] -Size=128 -Type=Fixed - -[128x128@2] -Size=128 -Scale=2 -Type=Fixed - -[256x256] -Size=256 -Type=Fixed - -[256x256@2] -Size=256 -Scale=2 -Type=Fixed - -[scalable] -Size=512 -Type=Scalable -MinSize=16 -MaxSize=512 diff --git a/src/assets/icons/scalable/document-new.svg b/src/assets/icons/scalable/document-new.svg deleted file mode 100644 index b926a7b0e11..00000000000 --- a/src/assets/icons/scalable/document-new.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_New" d="m15,13c0,.28-.22.5-.5.5h-2v2c0,.28-.22.5-.5.5s-.5-.22-.5-.5v-2h-2c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h2v-2c0-.28.22-.5.5-.5s.5.22.5.5v2h2c.28,0,.5.22.5.5Zm-12,2h5v1H3c-1.1,0-2-.9-2-2V2C1,.9,1.9,0,3,0h7c1.14,1.14,2.93,2.93,4,4v5h-1v-4h-2c-1.1,0-2-.9-2-2V1H3c-.55,0-1,.45-1,1v12c0,.55.45,1,1,1ZM10,1.41v1.59c0,.55.45,1,1,1h1.59l-.82-.82-1.76-1.76Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/document-open.svg b/src/assets/icons/scalable/document-open.svg deleted file mode 100644 index 778c1b7c6e9..00000000000 --- a/src/assets/icons/scalable/document-open.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Open" d="m14.5,5h-1.5v-1c0-1.1-.9-2-2-2h-5L4,0h-2C.9,0,0,.9,0,2v12c0,1.1.9,2,2,2h9s0,0,0,0c.12,0,.25-.01.36-.03.98-.16,1.94-.94,2.24-1.87l2.29-7.19c.33-1.05-.29-1.91-1.39-1.91ZM1,14V2c0-.55.45-1,1-1h1.59l1.71,1.71c.19.19.44.29.71.29h5c.55,0,1,.45,1,1v1h-5.5c-1.1,0-2.27.86-2.61,1.91l-2.29,7.19c-.09.28-.11.54-.07.78-.32-.17-.54-.49-.54-.87Zm13.94-7.4l-2.29,7.19c-.2.63-.99,1.21-1.65,1.21H3c-.2,0-.36-.05-.43-.15-.07-.1-.07-.26-.01-.45l2.29-7.19c.2-.63.99-1.21,1.65-1.21h8c.2,0,.36.05.43.15.07.1.07.26.01.45Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/document-print.svg b/src/assets/icons/scalable/document-print.svg deleted file mode 100644 index fb8436af81a..00000000000 --- a/src/assets/icons/scalable/document-print.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Print" d="m14,4h-2v-2c0-1.1-.9-2-2-2h-4c-1.1,0-2,.9-2,2v2h-2c-1.1,0-2,.9-2,2v4c0,1.1.9,2,2,2h2v2c0,1.1.9,2,2,2h4c1.1,0,2-.9,2-2v-2h2c1.1,0,2-.9,2-2v-4c0-1.1-.9-2-2-2ZM5,2c0-.55.45-1,1-1h4c.55,0,1,.45,1,1v2h-6v-2Zm5,13h-4c-.55,0-1-.45-1-1v-5h6v5c0,.55-.45,1-1,1Zm5-5c0,.55-.45,1-1,1h-2v-2h.5c.28,0,.5-.22.5-.5s-.22-.5-.5-.5h-.5s-8,0-8,0h0s-.5,0-.5,0c-.28,0-.5.22-.5.5s.22.5.5.5h.5v2h-2c-.55,0-1-.45-1-1v-4c0-.55.45-1,1-1h12c.55,0,1,.45,1,1v4Zm-5,1.5c0,.28-.22.5-.5.5h-3c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h3c.28,0,.5.22.5.5Zm0,2c0,.28-.22.5-.5.5h-3c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h3c.28,0,.5.22.5.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/document-save.svg b/src/assets/icons/scalable/document-save.svg deleted file mode 100644 index 03675f4dab0..00000000000 --- a/src/assets/icons/scalable/document-save.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Save" d="m16,11h0V2.29c0-1.26-1.02-2.29-2.29-2.29H2.29C1.02,0,0,1.02,0,2.29v8.71h0v1h0v1.71c0,1.26,1.02,2.29,2.29,2.29h11.43c1.26,0,2.29-1.02,2.29-2.29v-1.71h0v-1ZM5.71,1h5.29v4.5c0,.28-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5V1h.71ZM1,2.29c0-.71.58-1.29,1.29-1.29h1.71v4.5c0,.83.67,1.5,1.5,1.5h5c.83,0,1.5-.67,1.5-1.5V1h1.71c.71,0,1.29.58,1.29,1.29v8.71H1V2.29Zm14,11.43c0,.71-.58,1.29-1.29,1.29H2.29c-.71,0-1.29-.58-1.29-1.29v-1.71h14v1.71Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-copy.svg b/src/assets/icons/scalable/edit-copy.svg deleted file mode 100644 index db53ff11624..00000000000 --- a/src/assets/icons/scalable/edit-copy.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Copy" d="m12,0h-5c-1.1,0-2,.9-2,2h1c0-.55.45-1,1-1h4v2c0,1.1.9,2,2,2h2v6c0,.55-.45,1-1,1h-2v1h2c1.1,0,2-.9,2-2v-7c-1.07-1.07-2.86-2.86-4-4Zm1,4c-.55,0-1-.45-1-1v-1.59l1.29,1.29,1.29,1.29h-1.59Zm-6-1H2c-1.1,0-2,.9-2,2v9c0,1.1.9,2,2,2h7c1.1,0,2-.9,2-2v-7c-1.07-1.07-2.86-2.86-4-4Zm3,6v5c0,.55-.45,1-1,1H2c-.55,0-1-.45-1-1V5c0-.55.45-1,1-1h4v2c0,1.1.9,2,2,2h2v1Zm-2-2c-.55,0-1-.45-1-1v-1.59l1.29,1.29,1.29,1.29h-1.59Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-cut.svg b/src/assets/icons/scalable/edit-cut.svg deleted file mode 100644 index 7f75d0b829d..00000000000 --- a/src/assets/icons/scalable/edit-cut.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Cut" d="m15.22,12.05l-7.39-3.55,7.39-3.55c.25-.12.35-.42.23-.67-.12-.25-.42-.35-.67-.23l-8.12,3.9-2.48-1.19c1.07-.46,1.81-1.52,1.81-2.75,0-1.66-1.34-3-3-3S0,2.34,0,4c0,1.28.81,2.36,1.93,2.8.1.05.22.1.35.15l3.23,1.55-3.23,1.55c-.1.05-.18.09-.26.13-1.18.41-2.02,1.51-2.02,2.82,0,1.66,1.34,3,3,3s3-1.34,3-3c0-1.24-.75-2.29-1.81-2.75l2.48-1.19,8.12,3.9c.07.03.14.05.22.05.19,0,.37-.1.45-.28.12-.25.01-.55-.23-.67ZM3,2c1.1,0,2,.9,2,2s-.9,2-2,2-2-.9-2-2,.9-2,2-2Zm2,11c0,1.1-.9,2-2,2s-2-.9-2-2,.9-2,2-2,2,.9,2,2Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-delete.svg b/src/assets/icons/scalable/edit-delete.svg deleted file mode 100644 index 15d1a9c7fd6..00000000000 --- a/src/assets/icons/scalable/edit-delete.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Delete" d="m8,0C3.58,0,0,3.58,0,8s3.58,8,8,8,8-3.58,8-8S12.42,0,8,0Zm0,15c-3.86,0-7-3.14-7-7S4.14,1,8,1s7,3.14,7,7-3.14,7-7,7Zm2.83-9.12l-2.12,2.12,2.12,2.12c.2.2.2.51,0,.71-.1.1-.23.15-.35.15s-.26-.05-.35-.15l-2.12-2.12-2.12,2.12c-.1.1-.23.15-.35.15s-.26-.05-.35-.15c-.2-.2-.2-.51,0-.71l2.12-2.12-2.12-2.12c-.2-.2-.2-.51,0-.71s.51-.2.71,0l2.12,2.12,2.12-2.12c.2-.2.51-.2.71,0s.2.51,0,.71Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-paste.svg b/src/assets/icons/scalable/edit-paste.svg deleted file mode 100644 index 57e94d917d2..00000000000 --- a/src/assets/icons/scalable/edit-paste.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Paste" d="m14.09,6.09c-.71-.74-1.44-1.5-2.09-2.09h-3.78c-1.23,0-2.22.9-2.22,2v8c0,1.1.99,2,2.22,2h5.56c1.23,0,2.22-.9,2.22-2v-6c-.52-.52-1.21-1.21-1.91-1.91Zm-2.09-.68l1.38,1.38c.41.43.8.83,1.18,1.21h-1.56c-.55,0-1-.45-1-1v-1.59Zm3,5.59v3c0,.55-.55,1-1.22,1h-5.56c-.67,0-1.22-.45-1.22-1V6c0-.55.55-1,1.22-1h2.78v2c0,1.1.9,2,2,2h2v2Zm-6.5,0h5c.28,0,.5.22.5.5s-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5s.22-.5.5-.5ZM5.5,3h1c.83,0,1.5-.67,1.5-1.5v-.5h2c.55,0,1,.45,1,1v1h1v-1C12,.9,11.1,0,10,0h-2s-4,0-4,0h0s-2,0-2,0C.9,0,0,.9,0,2v10c0,1.1.9,2,2,2h3v-1h-3c-.55,0-1-.45-1-1V2c0-.55.45-1,1-1h2v.5c0,.83.67,1.5,1.5,1.5Zm1.5-1.5c0,.28-.22.5-.5.5h-1c-.28,0-.5-.22-.5-.5v-.5h2v.5Zm7,12c0,.28-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h5c.28,0,.5.22.5.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-redo.svg b/src/assets/icons/scalable/edit-redo.svg deleted file mode 100644 index 92d60e1dd8c..00000000000 --- a/src/assets/icons/scalable/edit-redo.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Redo" d="m15.85,4.68l-3.54-3.54c-.2-.2-.51-.2-.71,0s-.2.51,0,.71l2.68,2.68H2.5c-1.38,0-2.5,1.12-2.5,2.5v4c0,1.38,1.12,2.5,2.5,2.5h7c.28,0,.5-.22.5-.5s-.22-.5-.5-.5H2.5c-.83,0-1.5-.67-1.5-1.5v-4c0-.83.67-1.5,1.5-1.5h11.79l-2.68,2.68c-.2.2-.2.51,0,.71.1.1.23.15.35.15s.26-.05.35-.15l3.54-3.54c.2-.2.2-.51,0-.71Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/edit-undo.svg b/src/assets/icons/scalable/edit-undo.svg deleted file mode 100644 index 91731bb86fa..00000000000 --- a/src/assets/icons/scalable/edit-undo.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Undo" d="m13.5,4.54H1.71l2.68-2.68c.2-.2.2-.51,0-.71s-.51-.2-.71,0L.15,4.68c-.2.2-.2.51,0,.71l3.54,3.54c.1.1.23.15.35.15s.26-.05.35-.15c.2-.2.2-.51,0-.71l-2.68-2.68h11.79c.83,0,1.5.67,1.5,1.5v4c0,.83-.67,1.5-1.5,1.5h-7c-.28,0-.5.22-.5.5s.22.5.5.5h7c1.38,0,2.5-1.12,2.5-2.5v-4c0-1.38-1.12-2.5-2.5-2.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-justify-center.svg b/src/assets/icons/scalable/format-justify-center.svg deleted file mode 100644 index 9822c95f2fa..00000000000 --- a/src/assets/icons/scalable/format-justify-center.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignCenter" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm-2,3.5h0c0-.28-.22-.5-.5-.5H3c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm2.5,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm-2.5-12h0c0-.28-.22-.5-.5-.5H3c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-justify-fill.svg b/src/assets/icons/scalable/format-justify-fill.svg deleted file mode 100644 index 2fa7ddfa40d..00000000000 --- a/src/assets/icons/scalable/format-justify-fill.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignJustify" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm.5,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0-12h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-justify-left.svg b/src/assets/icons/scalable/format-justify-left.svg deleted file mode 100644 index 99d666428d9..00000000000 --- a/src/assets/icons/scalable/format-justify-left.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignLeft" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm-4.5,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm5,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5ZM11,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-justify-right.svg b/src/assets/icons/scalable/format-justify-right.svg deleted file mode 100644 index 7041f5e3f88..00000000000 --- a/src/assets/icons/scalable/format-justify-right.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignRight" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm.5,3.5h0c0-.28-.22-.5-.5-.5H5.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm0,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0-12h0c0-.28-.22-.5-.5-.5H5.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-text-bold.svg b/src/assets/icons/scalable/format-text-bold.svg deleted file mode 100644 index c0f43e0a692..00000000000 --- a/src/assets/icons/scalable/format-text-bold.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_Bold" d="m12.06,7.75c.65-.36,1.13-.81,1.44-1.35.3-.55.46-1.29.46-2.24,0-1.45-.4-2.5-1.21-3.16-.81-.66-2.03-.99-3.67-.99H3v16h6.26c3.39,0,5.09-1.51,5.09-4.53,0-1.88-.76-3.12-2.29-3.71ZM5.59,2.24h3.34c1.59,0,2.38.74,2.38,2.22,0,1.57-.76,2.36-2.29,2.36h-3.43V2.24Zm5.45,10.98c-.43.36-1.07.54-1.93.54h-3.53v-4.74h3.48c.75,0,1.37.17,1.87.53.5.35.75.96.75,1.83s-.21,1.49-.64,1.85Z"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-text-italic.svg b/src/assets/icons/scalable/format-text-italic.svg deleted file mode 100644 index 43df7ca54dc..00000000000 --- a/src/assets/icons/scalable/format-text-italic.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><polygon id="iconTextEditor_Italic" points="6.63 0 6.18 2.01 8.18 2.01 5.45 13.99 3.45 13.99 3 16 9.56 16 10.01 13.99 8.01 13.99 10.74 2.01 12.74 2.01 13.19 0 6.63 0"/></svg>
\ No newline at end of file diff --git a/src/assets/icons/scalable/format-text-underline.svg b/src/assets/icons/scalable/format-text-underline.svg deleted file mode 100644 index 62778fc579e..00000000000 --- a/src/assets/icons/scalable/format-text-underline.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_Underline" d="m3.38,11.88c-.92-.75-1.38-1.94-1.38-3.57V0h2.44v8.35c0,1.79,1.02,2.69,3.06,2.69s3.06-.9,3.06-2.69V0h2.44v8.31c0,1.63-.46,2.82-1.39,3.57-.92.75-2.3,1.12-4.13,1.12s-3.2-.37-4.11-1.12Zm10.12,3.12H1.5c-.28,0-.5.22-.5.5s.22.5.5.5h12c.28,0,.5-.22.5-.5s-.22-.5-.5-.5Z"/></svg>
\ No newline at end of file diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 4d83bbf794e..249b9b8c1ee 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -16,7 +16,11 @@ qt_internal_extend_sbom(WrapZLIB::WrapZLIB if(ANDROID) set(corelib_extra_cmake_files - "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidMacros.cmake") + "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidMacros.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidDynamicFeatureHelpers.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidGradleHelpers.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidPermissionHelpers.cmake" + ) endif() if(WASM) set(corelib_extra_cmake_files diff --git a/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake b/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake new file mode 100644 index 00000000000..e8a81bde1d7 --- /dev/null +++ b/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake @@ -0,0 +1,152 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause +# Collects the dynamic features for the target + +function(_qt_internal_android_add_dynamic_feature_deployment target) + get_target_property(dynamic_features ${target} _qt_android_dynamic_features) + if(NOT dynamic_features) + return() + endif() + + foreach(dynamic_feature IN LISTS dynamic_features) + get_target_property(is_imported ${dynamic_feature} IMPORTED) + if(is_imported) + message(FATAL_ERROR "Imported target ${dynamic_feature} can not be a" + " 'DYNAMIC_FEATURE'.") + endif() + + get_target_property(type ${dynamic_feature} TYPE) + if(NOT type STREQUAL "SHARED_LIBRARY") + message(FATAL_ERROR "Cannot make ${dynamic_feature} 'DYNAMIC_FEATURE'." + " The target must be the 'SHARED_LIBRARY'.") + endif() + + get_target_property(android_type ${dynamic_feature} _qt_android_target_type) + if(NOT android_type STREQUAL "" AND NOT android_type MATCHES "-NOTFOUND$" + AND NOT android_type STREQUAL "DYNAMIC_FEATURE") + message(FATAL_ERROR "Cannot make ${dynamic_feature} 'DYNAMIC_FEATURE'," + " it's already '${android_type}'. The target must be the plain 'SHARED_LIBRARY'.") + endif() + + # Mark the target as DYNAMIC_FEATURE, since we used it in this role once. + set_target_properties(${dynamic_feature} PROPERTIES _qt_android_target_type DYNAMIC_FEATURE) + _qt_internal_set_android_dynamic_feature_gradle_defaults(${dynamic_feature}) + + _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir + ${target} ${dynamic_feature}) + _qt_internal_android_generate_target_build_gradle(${dynamic_feature} + DEPLOYMENT_DIR "${dynamic_feature_deployment_dir}") + _qt_internal_android_generate_dynamic_feature_manifest(${target} ${dynamic_feature}) + _qt_internal_android_copy_dynamic_feature(${target} ${dynamic_feature}) + endforeach() +endfunction() + +# Sets the default values of the gradle properties for the Android dynamic feature target. +function(_qt_internal_set_android_dynamic_feature_gradle_defaults target) + _qt_internal_android_java_dir(android_java_dir) + + # TODO: make androidx.core:core versionc configurable. + # Currently, it is hardcoded to 1.16.0. + set(implementation_dependencies "project(':app')" "'androidx.core:core:1.16.0'") + + set_target_properties(${target} PROPERTIES + _qt_android_gradle_java_source_dirs "src;java" + _qt_android_gradle_aidl_source_dirs "src;aidl" + _qt_android_gradle_res_source_dirs "res" + _qt_android_gradle_resources_source_dirs "resources" + _qt_android_gradle_renderscript_source_dirs "src" + _qt_android_gradle_assets_source_dirs "assets" + _qt_android_gradle_jniLibs_source_dirs "libs" + _qt_android_manifest "AndroidManifest.xml" + _qt_android_gradle_implementation_dependencies "${implementation_dependencies}" + ) +endfunction() + +# Copies the dynamic feature library to the respective gradle build tree. +function(_qt_internal_android_copy_dynamic_feature target dynamic_feature) + if(NOT TARGET ${dynamic_feature}) + message(FATAL_ERROR "${dynamic_feature} is not a target.") + endif() + + _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir + ${target} ${dynamic_feature}) + + set(dynamic_feature_libs_dir "${dynamic_feature_deployment_dir}/libs/${CMAKE_ANDROID_ARCH_ABI}") + get_target_property(output_name ${dynamic_feature} OUTPUT_NAME) + if(NOT output_name) + get_target_property(suffix "${dynamic_feature}" SUFFIX) + set(output_name "lib${dynamic_feature}${suffix}") + endif() + set(output_file_path "${dynamic_feature_libs_dir}/${output_name}") + _qt_internal_copy_file_if_different_command(copy_command + "$<TARGET_FILE:${dynamic_feature}>" + "${output_file_path}" + ) + add_custom_command(OUTPUT ${output_file_path} + COMMAND ${copy_command} + DEPENDS ${dynamic_feature} + COMMENT "Copying ${dynamic_feature} dynamic feature to ${target} deployment directory" + ) + add_custom_target(${target}_deploy_dynamic_features DEPENDS "${output_file_path}") +endfunction() + +# Generates the feature name strings and copy them to the respective deployment directory. +function(_qt_internal_android_generate_dynamic_feature_names target) + get_target_property(dynamic_features ${target} _qt_android_dynamic_features) + if(NOT dynamic_features) + return() + endif() + + # Collect the titles + string(JOIN "\n" content + "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<resources>" + ) + foreach(feature IN LISTS dynamic_features) + string(APPEND content "\n <string name=\"${feature}_title\">${feature}</string>") + endforeach() + string(APPEND content "\n</resources>") + + _qt_internal_android_get_target_deployment_dir(deployment_dir ${target}) + # TODO: androiddeployqt wipes the android build directory. Generate feature_names.xml target + # build dir and copy after androiddeployqt run. We should skip feature_names.xml copying when + # androiddeployqt is not involved into the deployment process anymore. + # + # set(output_file "${deployment_dir}/res/values/feature_names.xml") + set(output_file "$<TARGET_PROPERTY:${target},BINARY_DIR>/res/values/feature_names.xml") + _qt_internal_configure_file(GENERATE OUTPUT "${output_file}" CONTENT "${content}") + set(output_file_in_deployment_dir "${deployment_dir}/res/values/feature_names.xml") + add_custom_command(OUTPUT "${output_file_in_deployment_dir}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${output_file}" + "${output_file_in_deployment_dir}" + DEPENDS "${output_file}" ${target}_android_deploy_aux + VERBATIM + ) + add_custom_target(${target}_copy_feature_names + DEPENDS + "${output_file_in_deployment_dir}" + ) +endfunction() + +# Returns the dynamic feature deployment directory in the target build tree. +function(_qt_internal_android_get_dynamic_feature_deployment_dir out_var target dynamic_feature) + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(${out_var} "${android_build_dir}/${dynamic_feature}" PARENT_SCOPE) +endfunction() + +# Generates the AndroidManifest.xml file for the dynamic_feature. +function(_qt_internal_android_generate_dynamic_feature_manifest target dynamic_feature) + set(android_manifest_filename AndroidManifest.xml) + _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir ${target} + ${dynamic_feature}) + + _qt_internal_android_get_template_path(template_file ${target} + "dynamic_feature/${android_manifest_filename}") + + set(APP_TARGET "${target}") + set(TITLE_VAR "@string/${dynamic_feature}_title") + + set(output_file "${dynamic_feature_deployment_dir}/AndroidManifest.xml") + _qt_internal_configure_file(CONFIGURE OUTPUT "${output_file}" INPUT "${template_file}") +endfunction() diff --git a/src/corelib/Qt6AndroidGradleHelpers.cmake b/src/corelib/Qt6AndroidGradleHelpers.cmake new file mode 100644 index 00000000000..09184c93b69 --- /dev/null +++ b/src/corelib/Qt6AndroidGradleHelpers.cmake @@ -0,0 +1,631 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Returns the path to the template file from either user defined template directory, or +# Qt default template directory. +function(_qt_internal_android_get_template_path out_var target template_name) + if(template_name STREQUAL "") + message(FATAL_ERROR "Template name is empty." + " This is the Qt issue, please report a bug at https://bugreports.qt.io.") + endif() + + _qt_internal_android_template_dir(template_directory) + get_filename_component(template_directory "${template_directory}" ABSOLUTE) + + # The paths are ordered according to their priority, from highest to lowest. + set(possible_paths + "${template_directory}/${template_name}.in" + ) + + get_target_property(android_target_type ${target} _qt_android_target_type) + if(android_target_type STREQUAL "APPLICATION") + _qt_internal_android_get_package_source_dir(user_template_directory ${target}) + get_filename_component(user_template_directory "${user_template_directory}" ABSOLUTE) + + # Add user template with the higher priority + list(PREPEND possible_paths "${user_template_directory}/${template_name}.in") + endif() + + set(template_path "") + foreach(possible_path IN LISTS possible_paths) + if(EXISTS "${possible_path}") + set(template_path "${possible_path}") + break() + endif() + endforeach() + + if(template_path STREQUAL "") + message(FATAL_ERROR "'${template_name}' is not found." + " This is the Qt issue, please report a bug at https://bugreports.qt.io.") + endif() + + set(${out_var} "${template_path}" PARENT_SCOPE) +endfunction() + +# Generates the settings.gradle file for the target. Writes the result to the target android build +# directory. +function(_qt_internal_android_generate_bundle_settings_gradle target) + set(settings_gradle_filename "settings.gradle") + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(settings_gradle_file "${android_build_dir}/${settings_gradle_filename}") + + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${settings_gradle_file}" IN_LIST deployment_files) + return() + endif() + + _qt_internal_android_get_template_path(template_file ${target} "${settings_gradle_filename}") + + set(android_app_name "$<TARGET_PROPERTY:${target},QT_ANDROID_APP_NAME>") + string(JOIN "" ROOT_PROJECT_NAME + "$<IF:$<BOOL:${android_app_name}>," + "${android_app_name}," + "${target}" + ">" + ) + + set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>") + set(include_prefix "include(\":") + set(include_suffix "\")") + set(include_glue "${include_suffix}\n${include_prefix}") + string(JOIN "" SUBPROJECTS + "$<$<BOOL:${target_dynamic_features}>:" + "${include_prefix}" + "$<JOIN:${target_dynamic_features},${include_glue}>" + "${include_suffix}" + ">" + ) + + _qt_internal_configure_file(GENERATE OUTPUT ${settings_gradle_file} + INPUT "${template_file}") + set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files + "${settings_gradle_file}") +endfunction() + +# Generates the source sets for the target. +function(_qt_internal_android_get_gradle_source_sets out_var target) + set(known_types java aidl res resources renderscript assets jniLibs) + set(source_set "") + set(indent " ") + foreach(type IN LISTS known_types) + set(source_dirs + "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_android_gradle_${type}_source_dirs>>") + string(JOIN "" source_set + "${source_set}" + "$<$<BOOL:${source_dirs}>:" + "${indent}${type}.srcDirs = ['$<JOIN:${source_dirs},'$<COMMA> '>']\n" + ">" + ) + endforeach() + + set(manifest + "$<TARGET_PROPERTY:${target},_qt_android_manifest>") + string(JOIN "" source_set + "${source_set}" + "$<$<BOOL:${manifest}>:" + "${indent}manifest.srcFile '${manifest}'\n" + ">" + ) + set(${out_var} "${source_set}" PARENT_SCOPE) +endfunction() + +# Generates the gradle dependency list for the target. +function(_qt_internal_android_get_gradle_dependencies out_var target) + # Use dependencies from file tree by default + set(known_dependencies + "implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])") + foreach(dep_type implementation api) + string(JOIN "\n " dep_prefix + "\n //noinspection GradleDependency" + "${dep_type} " + ) + set(dep_postfix "") + set(dep_property "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_android_gradle_${dep_type}_dependencies>>") + string(JOIN "" known_dependencies + "${known_dependencies}" + "$<$<BOOL:${dep_property}>:" + "${dep_prefix}$<JOIN:${dep_property},${dep_postfix}${dep_prefix}>${dep_postfix}" + ">" + ) + endforeach() + set(${out_var} "${known_dependencies}" PARENT_SCOPE) +endfunction() + +# Sets the default values of the gradle properties for the Android executable target. +function(_qt_internal_set_android_application_gradle_defaults target) + _qt_internal_android_java_dir(android_java_dir) + + set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>") + string(JOIN "" implementation_dependencies + "$<$<BOOL:${target_dynamic_features}>:'com.google.android.play:feature-delivery:2.1.0'>" + ) + # TODO: make androidx.core:core version configurable. + # Currently, it is hardcoded to 1.16.0. + list(APPEND implementation_dependencies "'androidx.core:core:1.16.0'") + + set_target_properties(${target} PROPERTIES + _qt_android_gradle_java_source_dirs "${android_java_dir}/src;src;java" + _qt_android_gradle_aidl_source_dirs "${android_java_dir}/src;src;aidl" + _qt_android_gradle_res_source_dirs "${android_java_dir}/res;res" + _qt_android_gradle_resources_source_dirs "resources" + _qt_android_gradle_renderscript_source_dirs "src" + _qt_android_gradle_assets_source_dirs "assets" + _qt_android_gradle_jniLibs_source_dirs "libs" + _qt_android_manifest "AndroidManifest.xml" + _qt_android_gradle_implementation_dependencies "${implementation_dependencies}" + ) +endfunction() + +# Generates the build.gradle file for the target. Writes the result to the target app deployment +# directory. +function(_qt_internal_android_generate_target_build_gradle target) + cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "") + + if(NOT arg_DEPLOYMENT_DIR) + message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.") + endif() + + set(build_gradle_filename "build.gradle") + set(out_file "${arg_DEPLOYMENT_DIR}/${build_gradle_filename}") + + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${out_file}" IN_LIST deployment_files) + return() + endif() + + # TODO: The current build.gradle.in templates hardcodes couple values that needs to be + # configurable in the future. For example the buildscript dependencies, or the use of + # androidx.core:core:1.13.1 and the dependency for all user applications. + + _qt_internal_android_get_gradle_property(PACKAGE_NAME ${target} + QT_ANDROID_PACKAGE_NAME "org.qtproject.example.$<MAKE_C_IDENTIFIER:${target}>") + + _qt_internal_android_get_target_sdk_build_tools_revision(ANDROID_BUILD_TOOLS_VERSION + ${target}) + + _qt_internal_detect_latest_android_platform(ANDROID_COMPILE_SDK_VERSION) + if(NOT ANDROID_COMPILE_SDK_VERSION) + message(FATAL_ERROR "Unable to detect the android platform in ${ANDROID_SDK_ROOT}. " + "Please check your Android SDK installation.") + endif() + + _qt_internal_android_get_gradle_source_sets(SOURCE_SETS ${target}) + _qt_internal_android_get_gradle_dependencies(GRADLE_DEPENDENCIES ${target}) + + _qt_internal_android_get_gradle_property(min_sdk_version ${target} + QT_ANDROID_MIN_SDK_VERSION "28") + + _qt_internal_android_get_gradle_property(target_sdk_version ${target} + QT_ANDROID_TARGET_SDK_VERSION "34") + + set(target_abis "$<TARGET_PROPERTY:${target},_qt_android_abis>") + set(target_abi_list "$<JOIN:${target_abis};${CMAKE_ANDROID_ARCH_ABI},'$<COMMA> '>") + + string(JOIN "\n " DEFAULT_CONFIG_VALUES + "resConfig 'en'" + "minSdkVersion ${min_sdk_version}" + "targetSdkVersion ${target_sdk_version}" + "ndk.abiFilters = ['${target_abi_list}']" + ) + + set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>") + set(include_prefix "\":") + set(include_suffix "\"") + set(include_glue "${include_suffix}$<COMMA>${include_prefix}") + string(APPEND ANDROID_DEPLOYMENT_EXTRAS + "$<$<BOOL:${target_dynamic_features}>:dynamicFeatures = [" + "${include_prefix}" + "$<JOIN:${target_dynamic_features},${include_glue}>" + "${include_suffix}]" + ">" + ) + + get_target_property(android_target_type ${target} _qt_android_target_type) + if(android_target_type STREQUAL "APPLICATION") + set(GRADLE_PLUGIN_TYPE "com.android.application") + set(template_subdir "app") + elseif(android_target_type STREQUAL "DYNAMIC_FEATURE") + set(GRADLE_PLUGIN_TYPE "com.android.dynamic-feature") + set(template_subdir "dynamic_feature") + else() + message(FATAL_ERROR "Unsupported target type for android bundle deployment ${target}") + endif() + + _qt_internal_android_get_template_path(template_file ${target} + "${template_subdir}/${build_gradle_filename}") + _qt_internal_configure_file(GENERATE + OUTPUT "${out_file}" + INPUT "${template_file}" + ) + set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}") +endfunction() + +# Prepares the artifacts for the gradle build of the target. +function(_qt_internal_android_prepare_gradle_build target) + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + _qt_internal_android_get_target_deployment_dir(deployment_dir ${target}) + + _qt_internal_android_copy_gradle_files(${target} "${android_build_dir}") + _qt_internal_android_copy_target_package_sources(${target}) + + _qt_internal_android_generate_bundle_gradle_properties(${target}) + _qt_internal_android_generate_bundle_settings_gradle(${target}) + _qt_internal_android_generate_bundle_local_properties(${target}) + _qt_internal_android_generate_target_build_gradle(${target} DEPLOYMENT_DIR "${deployment_dir}") + _qt_internal_android_generate_target_gradle_properties(${target} + DEPLOYMENT_DIR "${deployment_dir}") + _qt_internal_android_generate_target_android_manifest(${target} + DEPLOYMENT_DIR "${deployment_dir}") + + + _qt_internal_android_add_gradle_build(${target} apk) + _qt_internal_android_add_gradle_build(${target} aab) + + # Make global apk, aab, and aar targets depend on the respective targets. + _qt_internal_android_add_global_package_dependencies(${target}) + _qt_internal_create_global_apk_all_target_if_needed() +endfunction() + +# Adds the modern gradle build targets. +# These targets use the settings.gradle based build directory structure. +function(_qt_internal_android_add_gradle_build target type) + _qt_internal_android_get_deployment_type_option(android_deployment_type_option + "assembleRelease" "assembleDebug") + + _qt_internal_android_gradlew_name(gradlew_file_name) + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(gradlew "${android_build_dir}/${gradlew_file_name}") + + set(extra_args "") + if(type STREQUAL "aab") + set(extra_args "bundle") + endif() + + set(package_file_path "${android_build_dir}/${target}.${type}") + + _qt_internal_android_package_path(package_build_dir ${target} ${type}) + _qt_internal_android_get_deployment_type_option(deployment_type_suffix + "release" "debug") + set(package_build_file_path + "${package_build_dir}/${deployment_type_suffix}/app-${deployment_type_suffix}.${type}") + + set(extra_deps "") + if(TARGET ${target}_copy_feature_names) + list(APPEND extra_deps ${target}_copy_feature_names) + endif() + + if(TARGET ${target}_deploy_dynamic_features) + list(APPEND extra_deps ${target}_deploy_dynamic_features) + endif() + + set(gradle_scripts "$<TARGET_PROPERTY:${target},_qt_android_deployment_files>") + add_custom_command(OUTPUT "${package_file_path}" + BYPRODUCTS "${package_build_file_path}" + COMMAND + "${gradlew}" ${android_deployment_type_option} ${extra_args} + COMMAND + ${CMAKE_COMMAND} -E copy_if_different + "${package_build_file_path}" "${package_file_path}" + DEPENDS + ${target} + ${gradle_scripts} + ${target}_copy_gradle_files + ${target}_android_deploy_aux + ${extra_deps} + WORKING_DIRECTORY + "${android_build_dir}" + VERBATIM + ) + + add_custom_target(${target}_make_${type} DEPENDS "${package_file_path}") +endfunction() + +# Returns the path to the android executable package either apk or aab. +function(_qt_internal_android_package_path out_var target type) + set(supported_package_types apk aab) + if(NOT type IN_LIST supported_package_types) + message(FATAL_ERROR "Invalid package type, supported types: ${supported_package_types}") + endif() + + # aab packages are located in the bundle directory + if(type STREQUAL "aab") + set(type "bundle") + endif() + + _qt_internal_android_get_target_deployment_dir(deployment_dir ${target}) + + set(${out_var} "${deployment_dir}/build/outputs/${type}" PARENT_SCOPE) +endfunction() + +# Returns the path to the gradle build directory. +function(_qt_internal_android_gradle_template_dir out_var) + if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD) + set(${out_var} "${QtBase_SOURCE_DIR}/src/3rdparty/gradle" PARENT_SCOPE) + else() + set(${out_var} "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/3rdparty/gradle" PARENT_SCOPE) + endif() +endfunction() + +# Returns the path to the android java dir. +function(_qt_internal_android_java_dir out_var) + if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD) + set(${out_var} "${QtBase_SOURCE_DIR}/src/android/java" PARENT_SCOPE) + else() + set(${out_var} "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/android/java" PARENT_SCOPE) + endif() +endfunction() + +# Returns the platform-spefic name of the gradlew script. +function(_qt_internal_android_gradlew_name out_var) + if(CMAKE_HOST_WIN32) + set(gradlew_file_name "gradlew.bat") + else() + set(gradlew_file_name "gradlew") + endif() + + set(${out_var} "${gradlew_file_name}" PARENT_SCOPE) +endfunction() + +# Return the path to the gradlew script. +function(_qt_internal_android_gradlew_path out_var target) + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(${out_var} "${android_build_dir}/${gradlew_file_name}" PARENT_SCOPE) +endfunction() + +# Returns the generator expression for the gradle_property value. Defaults to the default_value +# argument. +function(_qt_internal_android_get_gradle_property out_var target target_property default_value) + set(target_property_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${target_property}>>") + string(JOIN "" result + "$<IF:$<BOOL:${target_property_genex}>," + "${target_property_genex}," + "${default_value}" + ">" + ) + set(${out_var} "${result}" PARENT_SCOPE) +endfunction() + +# Generates gradle.properties for the specific target. Usually contains the +# target build type(executable, dynamic feature, library). +function(_qt_internal_android_generate_target_gradle_properties target) + cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "") + + if(NOT arg_DEPLOYMENT_DIR) + message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.") + endif() + + set(gradle_properties_file_name "gradle.properties") + set(out_file "${arg_DEPLOYMENT_DIR}/${gradle_properties_file_name}") + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${out_file}" IN_LIST deployment_files) + return() + endif() + + _qt_internal_android_get_template_path(template_file ${target} + "app/${gradle_properties_file_name}") + _qt_internal_configure_file(CONFIGURE + OUTPUT "${out_file}" + INPUT "${template_file}" + ) + set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}") +endfunction() + +# Constucts generator expression that returns either target property or the default value +function(_qt_internal_android_get_manifest_property out_var target property default) + set(target_property "$<TARGET_PROPERTY:${target},${property}>") + string(JOIN "" out_genex + "$<IF:$<BOOL:${target_property}>," + "${target_property}," + "${default}" + ">" + ) + + set(${out_var} "${out_genex}" PARENT_SCOPE) +endfunction() + +# Generates the target AndroidManifest.xml +function(_qt_internal_android_generate_target_android_manifest target) + cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "") + + if(NOT arg_DEPLOYMENT_DIR) + message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.") + endif() + + set(android_manifest_filename "AndroidManifest.xml") + set(out_file "${arg_DEPLOYMENT_DIR}/${android_manifest_filename}") + + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${out_file}" IN_LIST deployment_files) + return() + endif() + + _qt_internal_android_get_template_path(template_file ${target} + "app/${android_manifest_filename}") + set(temporary_file "${out_file}.tmp") + + # The file cannot be generated at cmake configure time, because androiddeployqt + # will override it at build time. We use this trick with temporary file to override + # it after the aux run of androiddeployqt. + add_custom_command(OUTPUT "${out_file}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${temporary_file}" + "${out_file}" + DEPENDS + "${template_file}" + "${temporary_file}" + ${target}_android_deploy_aux + ) + + _qt_internal_android_get_manifest_property(APP_PACKAGE_NAME ${target} + QT_ANDROID_PACKAGE_NAME "org.qtproject.example.$<MAKE_C_IDENTIFIER:${target}>") + _qt_internal_android_get_manifest_property(APP_NAME ${target} + QT_ANDROID_APP_NAME "${target}") + _qt_internal_android_get_manifest_property(APP_VERSION_CODE ${target} + QT_ANDROID_VERSION_CODE "1") + _qt_internal_android_get_manifest_property(APP_VERSION_NAME ${target} + QT_ANDROID_VERSION_NAME "1") + _qt_internal_android_get_manifest_property(APP_LIB_NAME ${target} OUTPUT_NAME "${target}") + + # For application icon we substitute the whole attribute definition, but not only value + # otherwise it leads to the Manifest processing issue. + set(target_property "$<TARGET_PROPERTY:${target},QT_ANDROID_APP_ICON>") + string(JOIN "" APP_ICON + "$<$<BOOL:${target_property}>:" + "android:icon=\"${target_property}\"" + ">" + ) + + file(READ "${template_file}" manifest_content) + string(REPLACE ">" "$<ANGLE-R>" manifest_content "${manifest_content}") + string(REPLACE ";" "$<SEMICOLON>" manifest_content "${manifest_content}") + string(REPLACE "," "$<COMMA>" manifest_content "${manifest_content}") + + _qt_internal_android_convert_permissions(APP_PERMISSIONS ${target} XML) + + set(feature_prefix "\n <uses-feature android:name=\"") + set(feature_suffix " \" android:required=\"false\" /$<ANGLE-R>") + set(feature_property "$<TARGET_PROPERTY:${target},QT_ANDROID_FEATURES>") + string(JOIN "" APP_FEATURES + "$<$<BOOL:${feature_property}>:" + "${feature_prefix}" + "$<JOIN:${feature_property},${feature_suffix},${feature_prefix}>" + "${feature_suffix}" + ">" + ) + + set(APP_ARGUMENTS "${QT_ANDROID_APPLICATION_ARGUMENTS}") + + _qt_internal_configure_file(GENERATE OUTPUT "${temporary_file}" + CONTENT "${manifest_content}") + + set_property(TARGET ${target} APPEND PROPERTY + _qt_android_deployment_files "${out_file}" "${temporary_file}") +endfunction() + +# Generates the top-level gradle.properties in the android-build directory +# The file contains the information about the versions of the android build +# tools, the list of supported ABIs. +function(_qt_internal_android_generate_bundle_gradle_properties target) + set(EXTRA_PROPERTIES "") + + set(gradle_properties_file_name "gradle.properties") + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(out_file "${android_build_dir}/${gradle_properties_file_name}") + + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${out_file}" IN_LIST deployment_files) + return() + endif() + + _qt_internal_android_get_template_path(template_file ${target} "${gradle_properties_file_name}") + _qt_internal_configure_file(CONFIGURE + OUTPUT "${out_file}" + INPUT "${template_file}" + ) + set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}") +endfunction() + +# Generates the local.properties for gradle builds. Contains the path to the +# Android SDK root. +function(_qt_internal_android_generate_bundle_local_properties target) + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + set(out_file "${android_build_dir}/local.properties") + + # Skip generating the file if it's already provided by user. + get_target_property(deployment_files ${target} _qt_android_deployment_files) + if("${out_file}" IN_LIST deployment_files) + return() + endif() + + file(TO_CMAKE_PATH "${ANDROID_SDK_ROOT}" ANDROID_SDK_ROOT_NATIVE) + _qt_internal_configure_file(CONFIGURE OUTPUT "${out_file}" + CONTENT "sdk.dir=${ANDROID_SDK_ROOT_NATIVE}\n") +endfunction() + +# Copies the customized Android package sources to the Android build directory +function(_qt_internal_android_copy_target_package_sources target) + _qt_internal_android_get_package_source_dir(package_source_dir ${target}) + + if(NOT package_source_dir) + return() + endif() + get_filename_component(package_source_dir "${package_source_dir}" ABSOLUTE) + + # Collect deployment files from use-defined package source directory + file(GLOB_RECURSE package_files + LIST_DIRECTORIES false + RELATIVE "${package_source_dir}" + "${package_source_dir}/*" + ) + + # Do not copy files that we treat as CMake templates, having '.in' extention. + # + # TODO: If it ever will be an issue we may exclude only templates that are + # known by our build system. + list(FILTER package_files EXCLUDE REGEX ".+\\.in$") + + _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + list(TRANSFORM package_files PREPEND "${android_build_dir}/" OUTPUT_VARIABLE out_package_files) + list(TRANSFORM package_files PREPEND "${package_source_dir}/" OUTPUT_VARIABLE in_package_files) + + if(in_package_files) + # TODO: Add cmake < 3.26 support + if(CMAKE_VERSION VERSION_LESS 3.26) + message(FATAL_ERROR "The use of QT_ANDROID_PACKAGE_SOURCE_DIR property with + the QT_USE_ANDROID_MODERN_BUNDLE option enabled requires CMake version >= 3.26.") + endif() + set(copy_commands COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different + "${package_source_dir}" "${android_build_dir}") + else() + # We actually have nothing to deploy. + return() + endif() + + add_custom_command(OUTPUT ${out_package_files} + ${copy_commands} + DEPENDS + ${in_package_files} + VERBATIM + ) + + set_target_properties(${target} PROPERTIES _qt_android_deployment_files "${out_package_files}") +endfunction() + +# Copies gradle scripts to a build directory. +function(_qt_internal_android_copy_gradle_files target output_directory) + _qt_internal_android_gradlew_name(gradlew_file_name) + _qt_internal_android_gradle_template_dir(gradle_template_dir) + + set(gradlew_file_src "${gradle_template_dir}/${gradlew_file_name}") + set(gradlew_file_dst "${output_directory}/${gradlew_file_name}") + + add_custom_command(OUTPUT "${gradlew_file_dst}" + COMMAND + ${CMAKE_COMMAND} -E copy_if_different "${gradlew_file_src}" "${gradlew_file_dst}" + DEPENDS "${gradlew_file_src}" + COMMENT "Copying gradlew script for ${target}" + VERBATIM + ) + + # TODO: make a more precise directory copying + set(gradle_dir_src "${gradle_template_dir}/gradle") + set(gradle_dir_dst "${output_directory}/gradle") + add_custom_command(OUTPUT "${gradle_dir_dst}" + COMMAND + ${CMAKE_COMMAND} -E copy_directory "${gradle_dir_src}" "${gradle_dir_dst}" + DEPENDS "${gradle_dir_src}" + COMMENT "Copying gradle support files for ${target}" + VERBATIM + ) + + add_custom_target(${target}_copy_gradle_files + DEPENDS + "${gradlew_file_dst}" + "${gradle_dir_dst}" + ) +endfunction() diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake index aa0e5bfed24..ed97a42c83f 100644 --- a/src/corelib/Qt6AndroidMacros.cmake +++ b/src/corelib/Qt6AndroidMacros.cmake @@ -120,6 +120,29 @@ function(_qt_internal_generate_android_permissions_json out_result target) set(${out_result} "${result}" PARENT_SCOPE) endfunction() +# Add the specific dynamic library as the dynamic feature for the Android application target. +function(qt6_add_android_dynamic_features target) + cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "FEATURE_TARGETS") + if(NOT QT_USE_ANDROID_MODERN_BUNDLE) + message(FATAL_ERROR "qt6_add_android_dynamic_features is only supported with" + " 'QT_USE_ANDROID_MODERN_BUNDLE' enabled.") + endif() + if(NOT TARGET ${target}) + message(FATAL_ERROR "${target} is not a target. Cannot add the dynamic features.") + endif() + get_target_property(android_type ${target} _qt_android_target_type) + if(NOT android_type STREQUAL "APPLICATION") + message(FATAL_ERROR "${target} is not an android executable target." + " Cannot add the dynamic features.") + endif() + if(arg_FEATURE_TARGETS) + set_property(TARGET ${target} + APPEND PROPERTY _qt_android_dynamic_features ${arg_FEATURE_TARGETS}) + else() + message(WARNING "No dynamic features provided.") + endif() +endfunction() + # Generate the deployment settings json file for a cmake target. function(qt6_android_generate_deployment_settings target) # Information extracted from mkspecs/features/android/android_deployment_settings.prf @@ -324,8 +347,9 @@ function(qt6_android_generate_deployment_settings target) __qt_internal_collect_plugin_library_files_v2("${target}" "${plugin_targets}" plugin_targets) string(APPEND file_contents " \"android-deploy-plugins\":\"${plugin_targets}\",\n") - _qt_internal_generate_android_permissions_json(permissions_json_array "${target}") - string(APPEND file_contents " \"permissions\": ${permissions_json_array},\n") + + _qt_internal_android_convert_permissions(permissions_genex ${target} JSON) + string(APPEND file_contents " \"permissions\": ${permissions_genex},\n") # App binary string(APPEND file_contents @@ -415,44 +439,6 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endfunction() endif() -function(_qt_internal_add_android_permission target) - if(NOT TARGET ${target}) - message(FATAL_ERROR "Empty or invalid target for adding Android permission: (${target})") - endif() - - cmake_parse_arguments(arg "" "NAME" "ATTRIBUTES" ${ARGN}) - - if(NOT arg_NAME) - message(FATAL_ERROR "NAME for adding Android permission cannot be empty (${target})") - endif() - - set(permission_entry "${arg_NAME}") - - if(arg_ATTRIBUTES) - # Permission with additional attributes - list(LENGTH arg_ATTRIBUTES attributes_len) - math(EXPR attributes_modulus "${attributes_len} % 2") - if(NOT (attributes_len GREATER 1 AND attributes_modulus EQUAL 0)) - message(FATAL_ERROR "Android permission: ${arg_NAME} attributes: ${arg_ATTRIBUTES} must" - " be name-value pairs (for example: minSdkVersion 30)") - endif() - # Combine name-value pairs - set(index 0) - set(attributes "") - while(index LESS attributes_len) - list(GET arg_ATTRIBUTES ${index} name) - math(EXPR index "${index} + 1") - list(GET arg_ATTRIBUTES ${index} value) - string(APPEND attributes "android:${name}=\'${value}\' ") - math(EXPR index "${index} + 1") - endwhile() - set(permission_entry "${permission_entry}\;${attributes}") - endif() - - # Append the permission to the target's property - set_property(TARGET ${target} APPEND PROPERTY QT_ANDROID_PERMISSIONS "${permission_entry}") -endfunction() - function(qt6_add_android_permission target) _qt_internal_add_android_permission(${ARGV}) endfunction() @@ -519,18 +505,6 @@ function(qt6_android_add_apk_target target) ">" ) - # Make global apk and aab targets depend on the current apk target. - if(TARGET aab) - add_dependencies(aab ${target}_make_aab) - endif() - if(TARGET aar) - add_dependencies(aar ${target}_make_aar) - endif() - if(TARGET apk) - add_dependencies(apk ${target}_make_apk) - _qt_internal_create_global_apk_all_target_if_needed() - endif() - _qt_internal_android_get_deployment_tool(deployment_tool) # No need to use genex for the BINARY_DIR since it's read-only. @@ -719,6 +693,10 @@ function(qt6_android_add_apk_target target) ) add_dependencies(${target}_make_aab ${target}_prepare_apk_dir) + # Make global apk, aab, and aar targets depend on the respective targets. + _qt_internal_android_add_global_package_dependencies(${target}) + _qt_internal_create_global_apk_all_target_if_needed() + if(QT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT) # When building per-ABI external projects we only need to copy ABI-specific libraries and # resources to the "main" ABI android build folder. @@ -1661,13 +1639,26 @@ endfunction() # module and is executed implicitly when configuring user projects. function(_qt_internal_android_executable_finalizer target) set_property(TARGET ${target} PROPERTY _qt_android_executable_finalizer_called TRUE) + set_property(TARGET ${target} PROPERTY _qt_android_in_finalizer "EXECUTABLE") _qt_internal_expose_android_package_source_dir_to_ide(${target}) _qt_internal_configure_android_multiabi_target("${target}") qt6_android_generate_deployment_settings("${target}") - qt6_android_add_apk_target("${target}") + if(QT_USE_ANDROID_MODERN_BUNDLE) + _qt_internal_android_generate_dynamic_feature_names("${target}") + _qt_internal_android_add_dynamic_feature_deployment("${target}") + + _qt_internal_android_prepare_gradle_build("${target}") + _qt_internal_android_add_aux_deployment("${target}") + + _qt_internal_collect_apk_dependencies_defer() + _qt_internal_collect_apk_imported_dependencies_defer("${target}") + else() + qt6_android_add_apk_target("${target}") + endif() _qt_internal_android_create_runner_wrapper("${target}") + set_property(TARGET ${target} PROPERTY _qt_android_in_finalizer "") endfunction() # Helper to add the android executable finalizer. @@ -1737,8 +1728,9 @@ function(_qt_internal_android_app_runner_arguments target out_runner_path out_ar set(${out_runner_path} "${runner_dir}/qt-android-runner.py" PARENT_SCOPE) _qt_internal_android_get_target_android_build_dir(android_build_dir ${target}) + _qt_internal_android_get_platform_tools_path(platform_tools) set(${out_arguments} - "--adb" "${ANDROID_SDK_ROOT}/platform-tools/adb" + "--adb" "${platform_tools}/adb" "--build-path" "${android_build_dir}" "--apk" "${android_build_dir}/${target}.apk" PARENT_SCOPE @@ -1754,8 +1746,13 @@ function(_qt_internal_android_get_target_android_build_dir out_build_dir target) endif() endfunction() +function(_qt_internal_android_get_target_deployment_dir out_deploy_dir target) + _qt_internal_android_get_target_android_build_dir(build_dir ${target}) + set(${out_deploy_dir} "${build_dir}/app" PARENT_SCOPE) +endfunction() + function(_qt_internal_expose_android_package_source_dir_to_ide target) - get_target_property(android_package_source_dir ${target} QT_ANDROID_PACKAGE_SOURCE_DIR) + _qt_internal_android_get_package_source_dir(android_package_source_dir ${target}) if(android_package_source_dir) get_target_property(target_source_dir ${target} SOURCE_DIR) if(NOT IS_ABSOLUTE "${android_package_source_dir}") @@ -1778,6 +1775,71 @@ function(_qt_internal_expose_android_package_source_dir_to_ide target) endif() endfunction() +function(_qt_internal_android_add_aux_deployment target) + cmake_parse_arguments(arg "" "OUTPUT_TARGET_NAME;DEPLOYMENT_DIRECTORY" "EXTRA_ARGS" ${ARGN}) + _qt_internal_validate_all_args_are_parsed(arg) + + string(JOIN "" deployment_file + "$<GENEX_EVAL:" + "$<TARGET_PROPERTY:${target},QT_ANDROID_DEPLOYMENT_SETTINGS_FILE>" + ">" + ) + + _qt_internal_android_get_deployment_tool(deployment_tool) + if(arg_DEPLOYMENT_DIRECTORY) + set(deployment_dir "${arg_DEPLOYMENT_DIRECTORY}") + else() + _qt_internal_android_get_target_deployment_dir(deployment_dir ${target}) + endif() + + cmake_policy(PUSH) + if(POLICY CMP0116) + # Without explicitly setting this policy to NEW, we get a warning + # even though we ensure there's actually no problem here. + # See https://gitlab.kitware.com/cmake/cmake/-/issues/21959 + cmake_policy(SET CMP0116 NEW) + set(relative_to_dir ${CMAKE_CURRENT_BINARY_DIR}) + else() + set(relative_to_dir ${CMAKE_BINARY_DIR}) + endif() + + set(target_file_copy_relative_path + "libs/${CMAKE_ANDROID_ARCH_ABI}/$<TARGET_FILE_NAME:${target}>") + _qt_internal_copy_file_if_different_command(copy_command + "$<TARGET_FILE:${target}>" + "${deployment_dir}/${target_file_copy_relative_path}" + ) + + _qt_internal_android_get_use_terminal_for_deployment(uses_terminal) + + # TODO: We use androiddeployqt to collect target depdenencies and produce the lib.xml file + # which autoloads the collected libraries. Should be done using GRE and transitive properties + # in the future. + set(libs_xml "${deployment_dir}/res/values/libs.xml") + add_custom_command(OUTPUT "${libs_xml}" + COMMAND ${copy_command} + COMMAND "${deployment_tool}" + --input "${deployment_file}" + --output "${deployment_dir}" + --builddir "${relative_to_dir}" + --aux-mode + ${arg_EXTRA_ARGS} + #TODO: Support signing + COMMENT "Deploying Android artifacts for ${target}" + DEPENDS "${target}" "${deployment_file}" + VERBATIM + ${uses_terminal} + ) + + if(NOT arg_OUTPUT_TARGET_NAME) + set(arg_OUTPUT_TARGET_NAME ${target}_android_deploy_aux) + endif() + + add_custom_target(${arg_OUTPUT_TARGET_NAME} DEPENDS "${libs_xml}") + + cmake_policy(POP) +endfunction() + # Enables the terminal usage for the add_custom_command calls when verbose deployment is enabled. function(_qt_internal_android_get_use_terminal_for_deployment out_var) if(QT_ENABLE_VERBOSE_DEPLOYMENT) @@ -1822,6 +1884,45 @@ function(_qt_internal_android_get_deployment_type_option out_var release_flag de endif() endfunction() +# Returns the path to the android template directory, that are used by CMake +# deployment procedures. +function(_qt_internal_android_template_dir out_var) + if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD) + set(${out_var} "${QtBase_SOURCE_DIR}/src/android/templates_cmake" PARENT_SCOPE) + else() + set(${out_var} + "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/android/templates_cmake" PARENT_SCOPE) + endif() +endfunction() + +# Return the path to the target template directory if it's set for the target. +# Then this path is stored in the target QT_ANDROID_PACKAGE_SOURCE_DIR property +# and can only be effectively read in android finalizers. +function(_qt_internal_android_get_package_source_dir out_var target) + get_target_property(in_finalizer ${target} _qt_android_in_finalizer) + if(NOT in_finalizer) + message(FATAL_ERROR "The '_qt_internal_android_get_package_source_dir' function is" + " called outside the Android finalizer." + " This is the Qt issue, please report a bug at https://bugreports.qt.io.") + endif() + get_target_property(package_src_dir ${target} QT_ANDROID_PACKAGE_SOURCE_DIR) + if(NOT package_src_dir) + set(package_src_dir "") + endif() + set(${out_var} "${package_src_dir}" PARENT_SCOPE) +endfunction() + +# Add target_make_<apk|aab> as the depednecy for the respective global apk/aab +# target. +function(_qt_internal_android_add_global_package_dependencies target) + foreach(type apk aab aar) + # Make global apk and aab targets depend on the current apk target. + if(TARGET ${type} AND TARGET ${target}_make_${type}) + add_dependencies(${type} ${target}_make_${type}) + endif() + endforeach() +endfunction() + function(_qt_internal_android_get_target_abis out_abis target) get_target_property(target_abis ${target} QT_ANDROID_ABIS) if(target_abis) @@ -1840,5 +1941,10 @@ function(_qt_internal_android_get_target_abis out_abis target) set(${out_abis} "${android_abis}" PARENT_SCOPE) endfunction() +# Returns the path to the Android platform-tools(adb is located there). +function(_qt_internal_android_get_platform_tools_path out_var) + set(${out_var} "${ANDROID_SDK_ROOT}/platform-tools" PARENT_SCOPE) +endfunction() + set(QT_INTERNAL_ANDROID_TARGET_BUILD_DIR_SUPPORT ON CACHE INTERNAL "Indicates that Qt supports per-target Android build directories") diff --git a/src/corelib/Qt6AndroidPermissionHelpers.cmake b/src/corelib/Qt6AndroidPermissionHelpers.cmake new file mode 100644 index 00000000000..7f851e14667 --- /dev/null +++ b/src/corelib/Qt6AndroidPermissionHelpers.cmake @@ -0,0 +1,126 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generates the generator expression that converts the 'target' +# QT_ANDROID_PERMISSIONS property to the specific 'type'. +# +# It's expected that each element in QT_ANDROID_PERMISSIONS list has specific +# format: +# <name>\;<permission>\\\;<extra1>\;<value>\\\;<extra2>\;<value> +# +# Synopsis +# _qt_internal_android_convert_permissions(out_var target <JSON|XML>) +# +# Arguments +# +# `out_var` +# The name of the variable where the resulting generator expression is +# stored. +# +# `target` +# The name of the target. +# +# `JSON` +# Generate JSON array known by androiddeployqt. +# +# `XML` +# Generate XML content compatible with AndroidManifest.xml. +function(_qt_internal_android_convert_permissions out_var target type) + set(permissions_property "$<TARGET_PROPERTY:${target},QT_ANDROID_PERMISSIONS>") + set(permissions_genex "$<$<BOOL:${permissions_property}>:") + if(type STREQUAL "JSON") + set(pref "{ \"") + set(post "\" }") + set(indent "\n ") + string(APPEND permissions_genex + "[${indent}$<JOIN:" + "$<JOIN:" + "${pref}$<JOIN:" + "${permissions_property}," + "${post}$<COMMA>${indent}${pref}" + ">${post}," + "\": \"" + ">," + "\"$<COMMA> \"" + ">\n ]" + ) + elseif(type STREQUAL "XML") + set(pref "<uses-permission\n android:") + set(post "' /$<ANGLE-R>\n") + string(APPEND permissions_genex + "$<JOIN:" + "$<JOIN:" + "${pref}$<JOIN:" + "${permissions_property}," + "${post}${pref}" + ">${post}\n," + "='" + ">," + "' android:" + ">" + ) + else() + message(FATAL_ERROR "Invalid type ${type}. Supported types: JSON, XML") + endif() + string(APPEND permissions_genex ">") + + set(${out_var} "${permissions_genex}" PARENT_SCOPE) +endfunction() + +# Add the specific Android permission to the target. The permission is stored +# in the QT_ANDROID_PERMISSIONS property(the property is not a public API) +# and has the following format: +# <name>\;<permission>\\\;<extra1>\;<value>\\\;<extra2>\;<value> +# +# Synopsis +# _qt_internal_add_android_permission(target NAME <permission> +# ATTRIBUTES <extra1> <value1> +# [<extra2> <value2>]... +# ) +# +# Arguments +# +# `target` +# The Android target. +# +# `NAME` +# The permission name. E.g. 'android.permission.CAMERA'. +# +# `ATTRIBUTES` +# Extra permission attribute key-value pairs. +# See https://developer.android.com/guide/topics/manifest/uses-permission-element +# for details. +function(_qt_internal_add_android_permission target) + if(NOT TARGET ${target}) + message(FATAL_ERROR "Empty or invalid target for adding Android permission: (${target})") + endif() + + cmake_parse_arguments(arg "" "NAME" "ATTRIBUTES" ${ARGN}) + + if(NOT arg_NAME) + message(FATAL_ERROR "NAME for adding Android permission cannot be empty (${target})") + endif() + + set(permission_entry "name\;${arg_NAME}") + if(arg_ATTRIBUTES) + # Permission with additional attributes + list(LENGTH arg_ATTRIBUTES attributes_len) + math(EXPR attributes_modulus "${attributes_len} % 2") + if(NOT (attributes_len GREATER 1 AND attributes_modulus EQUAL 0)) + message(FATAL_ERROR "Android permission: ${arg_NAME} attributes: ${arg_ATTRIBUTES}" + " must be name-value pairs (for example: minSdkVersion 30)") + endif() + # Combine name-value pairs + set(index 0) + while(index LESS attributes_len) + list(GET arg_ATTRIBUTES ${index} name) + math(EXPR index "${index} + 1") + list(GET arg_ATTRIBUTES ${index} value) + string(APPEND permission_entry "\\\;${name}\;${value}") + math(EXPR index "${index} + 1") + endwhile() + endif() + + # Append the permission to the target's property + set_property(TARGET ${target} APPEND PROPERTY QT_ANDROID_PERMISSIONS "${permission_entry}") +endfunction() diff --git a/src/corelib/Qt6CoreConfigExtras.cmake.in b/src/corelib/Qt6CoreConfigExtras.cmake.in index 15405197a61..8a88d558fa8 100644 --- a/src/corelib/Qt6CoreConfigExtras.cmake.in +++ b/src/corelib/Qt6CoreConfigExtras.cmake.in @@ -30,6 +30,10 @@ _qt_internal_setup_deploy_support() if(ANDROID_PLATFORM) include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]") + include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]") + include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]") + include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]") + _qt_internal_create_global_android_targets() _qt_internal_collect_default_android_abis() if(__qt_Core_targets_file_included) diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index 3f5f9180805..5bc85ae7f7a 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -683,6 +683,9 @@ function(_qt_internal_create_executable target) ) qt6_android_apply_arch_suffix("${target}") + if(QT_USE_ANDROID_MODERN_BUNDLE) + _qt_internal_set_android_application_gradle_defaults(${target}) + endif() else() cmake_policy(PUSH) __qt_internal_set_cmp0156() @@ -3799,7 +3802,7 @@ function(qt6_generate_deploy_app_script) qt6_generate_deploy_script(${generate_args} CONTENT " qt6_deploy_runtime_dependencies( - EXECUTABLE $<TARGET_FILE_NAME:${arg_TARGET}>.app + EXECUTABLE \"$<TARGET_FILE_NAME:${arg_TARGET}>.app\" ${common_deploy_args}) ") @@ -3807,7 +3810,7 @@ ${common_deploy_args}) qt6_generate_deploy_script(${generate_args} CONTENT " qt6_deploy_runtime_dependencies( - EXECUTABLE $<TARGET_FILE:${arg_TARGET}> + EXECUTABLE \"$<TARGET_FILE:${arg_TARGET}>\" GENERATE_QT_CONF ${common_deploy_args}) ") @@ -3817,7 +3820,7 @@ ${common_deploy_args}) qt6_generate_deploy_script(${generate_args} CONTENT " qt6_deploy_runtime_dependencies( - EXECUTABLE $<TARGET_FILE:${arg_TARGET}> + EXECUTABLE \"$<TARGET_FILE:${arg_TARGET}>\" GENERATE_QT_CONF ${common_deploy_args}) ") diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp index d74894e1e42..4388122b7b9 100644 --- a/src/corelib/animation/qabstractanimation.cpp +++ b/src/corelib/animation/qabstractanimation.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QAbstractAnimation diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h index 69a30556a3a..b4b43e64a1d 100644 --- a/src/corelib/animation/qabstractanimation.h +++ b/src/corelib/animation/qabstractanimation.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTANIMATION_H #define QABSTRACTANIMATION_H diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h index d6c245f36f0..51c635f1bed 100644 --- a/src/corelib/animation/qabstractanimation_p.h +++ b/src/corelib/animation/qabstractanimation_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTANIMATION_P_H #define QABSTRACTANIMATION_P_H diff --git a/src/corelib/animation/qanimationgroup.cpp b/src/corelib/animation/qanimationgroup.cpp index d2572a7462b..ae96069e86f 100644 --- a/src/corelib/animation/qanimationgroup.cpp +++ b/src/corelib/animation/qanimationgroup.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QAnimationGroup diff --git a/src/corelib/animation/qanimationgroup.h b/src/corelib/animation/qanimationgroup.h index 412e2d442ea..07d24ae1f73 100644 --- a/src/corelib/animation/qanimationgroup.h +++ b/src/corelib/animation/qanimationgroup.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QANIMATIONGROUP_H #define QANIMATIONGROUP_H diff --git a/src/corelib/animation/qanimationgroup_p.h b/src/corelib/animation/qanimationgroup_p.h index 334f780968a..a09bc6ebcc6 100644 --- a/src/corelib/animation/qanimationgroup_p.h +++ b/src/corelib/animation/qanimationgroup_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QANIMATIONGROUP_P_H #define QANIMATIONGROUP_P_H diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp index 86e9417b595..0b43a73434f 100644 --- a/src/corelib/animation/qparallelanimationgroup.cpp +++ b/src/corelib/animation/qparallelanimationgroup.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QParallelAnimationGroup diff --git a/src/corelib/animation/qparallelanimationgroup.h b/src/corelib/animation/qparallelanimationgroup.h index 77bc6eabac7..9442f4f7355 100644 --- a/src/corelib/animation/qparallelanimationgroup.h +++ b/src/corelib/animation/qparallelanimationgroup.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QPARALLELANIMATIONGROUP_H #define QPARALLELANIMATIONGROUP_H diff --git a/src/corelib/animation/qparallelanimationgroup_p.h b/src/corelib/animation/qparallelanimationgroup_p.h index 62c53d36097..482b9555c7d 100644 --- a/src/corelib/animation/qparallelanimationgroup_p.h +++ b/src/corelib/animation/qparallelanimationgroup_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QPARALLELANIMATIONGROUP_P_H #define QPARALLELANIMATIONGROUP_P_H diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp index 344b21946e3..74e22e2f053 100644 --- a/src/corelib/animation/qpauseanimation.cpp +++ b/src/corelib/animation/qpauseanimation.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QPauseAnimation diff --git a/src/corelib/animation/qpauseanimation.h b/src/corelib/animation/qpauseanimation.h index f661459f835..bf7863a171c 100644 --- a/src/corelib/animation/qpauseanimation.h +++ b/src/corelib/animation/qpauseanimation.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QPAUSEANIMATION_H #define QPAUSEANIMATION_H diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp index 04f048af753..b4c6b6ff8a6 100644 --- a/src/corelib/animation/qpropertyanimation.cpp +++ b/src/corelib/animation/qpropertyanimation.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QPropertyAnimation diff --git a/src/corelib/animation/qpropertyanimation.h b/src/corelib/animation/qpropertyanimation.h index 038c202b8f3..590a6ddaf15 100644 --- a/src/corelib/animation/qpropertyanimation.h +++ b/src/corelib/animation/qpropertyanimation.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QPROPERTYANIMATION_H #define QPROPERTYANIMATION_H diff --git a/src/corelib/animation/qpropertyanimation_p.h b/src/corelib/animation/qpropertyanimation_p.h index ef5534cd9c3..c1918ae1bf8 100644 --- a/src/corelib/animation/qpropertyanimation_p.h +++ b/src/corelib/animation/qpropertyanimation_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QPROPERTYANIMATION_P_H #define QPROPERTYANIMATION_P_H diff --git a/src/corelib/animation/qsequentialanimationgroup.cpp b/src/corelib/animation/qsequentialanimationgroup.cpp index 260481dbef5..d11249ca7ed 100644 --- a/src/corelib/animation/qsequentialanimationgroup.cpp +++ b/src/corelib/animation/qsequentialanimationgroup.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /*! \class QSequentialAnimationGroup diff --git a/src/corelib/animation/qsequentialanimationgroup.h b/src/corelib/animation/qsequentialanimationgroup.h index 6786078170d..b7f9c1b17a1 100644 --- a/src/corelib/animation/qsequentialanimationgroup.h +++ b/src/corelib/animation/qsequentialanimationgroup.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSEQUENTIALANIMATIONGROUP_H #define QSEQUENTIALANIMATIONGROUP_H diff --git a/src/corelib/animation/qsequentialanimationgroup_p.h b/src/corelib/animation/qsequentialanimationgroup_p.h index cbdf204d0a6..131902b5aa5 100644 --- a/src/corelib/animation/qsequentialanimationgroup_p.h +++ b/src/corelib/animation/qsequentialanimationgroup_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSEQUENTIALANIMATIONGROUP_P_H #define QSEQUENTIALANIMATIONGROUP_P_H diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp index be5c09519e9..bd12d5dae95 100644 --- a/src/corelib/animation/qvariantanimation.cpp +++ b/src/corelib/animation/qvariantanimation.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qvariantanimation.h" #include "qvariantanimation_p.h" diff --git a/src/corelib/animation/qvariantanimation.h b/src/corelib/animation/qvariantanimation.h index 4bdb9713578..172ee0d6090 100644 --- a/src/corelib/animation/qvariantanimation.h +++ b/src/corelib/animation/qvariantanimation.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QVARIANTANIMATION_H #define QVARIANTANIMATION_H diff --git a/src/corelib/animation/qvariantanimation_p.h b/src/corelib/animation/qvariantanimation_p.h index 0ac238a882b..5fdd9666dba 100644 --- a/src/corelib/animation/qvariantanimation_p.h +++ b/src/corelib/animation/qvariantanimation_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QVARIANTANIMATION_P_H #define QVARIANTANIMATION_P_H diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake index 909041cf44b..096dce9e84e 100644 --- a/src/corelib/configure.cmake +++ b/src/corelib/configure.cmake @@ -591,6 +591,7 @@ qt_config_compile_test(cpp_winrt runtimeobject CODE "// Including winrt/base.h causes an error in some configurations (Windows 10 SDK + c++20) +# include <guiddef.h> // required by clang-cl: https://github.com/microsoft/cppwinrt/issues/1179 # include <winrt/base.h> int main(void) diff --git a/src/corelib/doc/snippets/CMakeLists.txt b/src/corelib/doc/snippets/CMakeLists.txt index 4fda2ed54ea..937433f2e21 100644 --- a/src/corelib/doc/snippets/CMakeLists.txt +++ b/src/corelib/doc/snippets/CMakeLists.txt @@ -53,19 +53,6 @@ qt_internal_extend_target(corelib_snippets CONDITION QT_FEATURE_gui qdebug/qdebugsnippet.cpp ) -find_package(Qt6 OPTIONAL_COMPONENTS Qml) - -if(Qt6Qml_FOUND) - qt_internal_extend_target(corelib_snippets - LIBRARIES - Qt::Qml - SOURCES - qlogging/qlogging.cpp - ) -else() - message("Qml was not found") -endif() - if ("${CMAKE_CXX_COMPILE_FEATURES}" MATCHES "cxx_std_23") set_property(TARGET corelib_snippets PROPERTY CXX_STANDARD 23) endif() diff --git a/src/corelib/doc/snippets/jni/src_qjniobject.cpp b/src/corelib/doc/snippets/jni/src_qjniobject.cpp index 33221405220..ab1a1b5ca03 100644 --- a/src/corelib/doc/snippets/jni/src_qjniobject.cpp +++ b/src/corelib/doc/snippets/jni/src_qjniobject.cpp @@ -1,8 +1,13 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include <QtCore/qglobal.h> +#include <QtCore/qdebug.h> #if defined(Q_QDOC) || defined(Q_OS_ANDROID) + +#include <QtCore/qjniobject.h> +#include <QtCore/qjnitypes.h> + //! [QJniObject scope] void functionScope() { @@ -13,7 +18,8 @@ void functionScope() myJString = string.object<jstring>(); } - // Ops! myJString is no longer valid. + // Ops! myJString is no longer valid. + QString myQtString = QJniObject(myJString).toString(); } //! [QJniObject scope] @@ -47,6 +53,7 @@ void foo() } //! [C++ native methods] +#if 0 // Java code //! [Java native methods] class FooJavaClass { @@ -63,5 +70,6 @@ private static native void callNativeTwo(int x); } //! [Java native methods] +#endif #endif diff --git a/src/corelib/doc/snippets/qprocess/CMakeLists.txt b/src/corelib/doc/snippets/qprocess/CMakeLists.txt index 07b66d0b36b..d410d479f7f 100644 --- a/src/corelib/doc/snippets/qprocess/CMakeLists.txt +++ b/src/corelib/doc/snippets/qprocess/CMakeLists.txt @@ -1,3 +1,5 @@ +set(CMAKE_UNITY_BUILD OFF) + add_library(snippets_qprocess OBJECT qprocess-createprocessargumentsmodifier.cpp qprocess-simpleexecution.cpp diff --git a/src/corelib/doc/src/cmake/qt_add_resources.qdoc b/src/corelib/doc/src/cmake/qt_add_resources.qdoc index 570272c6097..445e37e000a 100644 --- a/src/corelib/doc/src/cmake/qt_add_resources.qdoc +++ b/src/corelib/doc/src/cmake/qt_add_resources.qdoc @@ -111,5 +111,9 @@ resources linked into the final target. This especially affects static builds. There, the same resource name in different static libraries conflict in the consuming target. +In contrast to \l{qmake}'s \c{RESOURCES}, \c qt_add_resources does not +attempt to compile any QML or JavaScript files using \l{qmlcachegen}. Use +\l{qt_add_qml_module} for this. + \sa {qt6_add_big_resources}{qt_add_big_resources()} */ diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 1ecec63aed4..d1fc672564f 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2021 The Qt Company Ltd. // Copyright (C) 2021 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:execute-external-code #include "qdir.h" #include "qstringlist.h" diff --git a/src/corelib/global/qnumeric.cpp b/src/corelib/global/qnumeric.cpp index 16b2b7ca408..8b153bcdb84 100644 --- a/src/corelib/global/qnumeric.cpp +++ b/src/corelib/global/qnumeric.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qnumeric.h" #include "qnumeric_p.h" diff --git a/src/corelib/global/qnumeric.h b/src/corelib/global/qnumeric.h index 2c7110c97a6..bc2bbf9e53e 100644 --- a/src/corelib/global/qnumeric.h +++ b/src/corelib/global/qnumeric.h @@ -1,6 +1,7 @@ // Copyright (C) 2021 The Qt Company Ltd. // Copyright (C) 2025 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Giuseppe D'Angelo <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #ifndef QNUMERIC_H #define QNUMERIC_H diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp index fd742898f81..dab903f51fb 100644 --- a/src/corelib/global/qrandom.cpp +++ b/src/corelib/global/qrandom.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2021 Intel Corporation. // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:cryptography // for rand_s #define _CRT_RAND_S diff --git a/src/corelib/global/qrandom.h b/src/corelib/global/qrandom.h index 5ac864e79ef..30599413d75 100644 --- a/src/corelib/global/qrandom.h +++ b/src/corelib/global/qrandom.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:cryptography #ifndef QRANDOM_H #define QRANDOM_H 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/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 6f995fe082e..5a0be1d895e 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -893,6 +893,12 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM { Q_CHECK_FILE_NAME(entry, false); + // Detection of WasDeletedAttribute is imperfect: in general, if we can + // successfully stat() or access() a file, it hasn't been deleted (though + // there are exceptions, like /proc/XXX/fd/ entries on Linux). So we have + // to restore this flag in case we fail to stat() anything. + auto hadBeenDeleted = data.entryFlags & QFileSystemMetaData::WasDeletedAttribute; + #if defined(Q_OS_DARWIN) if (what & (QFileSystemMetaData::BundleType | QFileSystemMetaData::CaseSensitive)) { if (!data.hasFlags(QFileSystemMetaData::DirectoryType)) @@ -1103,6 +1109,11 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM if (entryErrno != 0) { what &= ~QFileSystemMetaData::LinkType; // don't clear link: could be broken symlink data.clearFlags(what); + + // see comment at the top + data.entryFlags |= hadBeenDeleted; + data.knownFlagsMask |= hadBeenDeleted; + return false; } return true; diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp index 064be4c2112..cd72f21acdf 100644 --- a/src/corelib/io/qfilesystemwatcher.cpp +++ b/src/corelib/io/qfilesystemwatcher.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qfilesystemwatcher.h" #include "qfilesystemwatcher_p.h" diff --git a/src/corelib/io/qfilesystemwatcher.h b/src/corelib/io/qfilesystemwatcher.h index 668bc143b20..9523945435e 100644 --- a/src/corelib/io/qfilesystemwatcher.h +++ b/src/corelib/io/qfilesystemwatcher.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_H #define QFILESYSTEMWATCHER_H diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm index 0d9b84890ae..0f49d43bc02 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents.mm +++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include <qplatformdefs.h> diff --git a/src/corelib/io/qfilesystemwatcher_fsevents_p.h b/src/corelib/io/qfilesystemwatcher_fsevents_p.h index d6ce176a30f..2fc95a99931 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents_p.h +++ b/src/corelib/io/qfilesystemwatcher_fsevents_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_FSEVENTS_P_H #define QFILESYSTEMWATCHER_FSEVENTS_P_H diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp index e60f6881109..4971b41c102 100644 --- a/src/corelib/io/qfilesystemwatcher_inotify.cpp +++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qfilesystemwatcher.h" #include "qfilesystemwatcher_inotify_p.h" diff --git a/src/corelib/io/qfilesystemwatcher_inotify_p.h b/src/corelib/io/qfilesystemwatcher_inotify_p.h index 05f87df14c1..705fe71725a 100644 --- a/src/corelib/io/qfilesystemwatcher_inotify_p.h +++ b/src/corelib/io/qfilesystemwatcher_inotify_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_INOTIFY_P_H #define QFILESYSTEMWATCHER_INOTIFY_P_H diff --git a/src/corelib/io/qfilesystemwatcher_kqueue.cpp b/src/corelib/io/qfilesystemwatcher_kqueue.cpp index 7a9be337bf8..bc331c9dd2a 100644 --- a/src/corelib/io/qfilesystemwatcher_kqueue.cpp +++ b/src/corelib/io/qfilesystemwatcher_kqueue.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include <qplatformdefs.h> diff --git a/src/corelib/io/qfilesystemwatcher_kqueue_p.h b/src/corelib/io/qfilesystemwatcher_kqueue_p.h index 05844d5be95..a460da6882e 100644 --- a/src/corelib/io/qfilesystemwatcher_kqueue_p.h +++ b/src/corelib/io/qfilesystemwatcher_kqueue_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_KQUEUE_P_H #define QFILESYSTEMWATCHER_KQUEUE_P_H diff --git a/src/corelib/io/qfilesystemwatcher_p.h b/src/corelib/io/qfilesystemwatcher_p.h index c34e3e2408f..79cf7443e37 100644 --- a/src/corelib/io/qfilesystemwatcher_p.h +++ b/src/corelib/io/qfilesystemwatcher_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_P_H #define QFILESYSTEMWATCHER_P_H diff --git a/src/corelib/io/qfilesystemwatcher_polling.cpp b/src/corelib/io/qfilesystemwatcher_polling.cpp index 5ec13a77f6c..ea374141563 100644 --- a/src/corelib/io/qfilesystemwatcher_polling.cpp +++ b/src/corelib/io/qfilesystemwatcher_polling.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qfilesystemwatcher_polling_p.h" diff --git a/src/corelib/io/qfilesystemwatcher_polling_p.h b/src/corelib/io/qfilesystemwatcher_polling_p.h index 80d7b7d1526..2ace2947be4 100644 --- a/src/corelib/io/qfilesystemwatcher_polling_p.h +++ b/src/corelib/io/qfilesystemwatcher_polling_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_POLLING_P_H #define QFILESYSTEMWATCHER_POLLING_P_H diff --git a/src/corelib/io/qfilesystemwatcher_win.cpp b/src/corelib/io/qfilesystemwatcher_win.cpp index 5418265ba2c..3a2cb02c3d7 100644 --- a/src/corelib/io/qfilesystemwatcher_win.cpp +++ b/src/corelib/io/qfilesystemwatcher_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qfilesystemwatcher.h" #include "qfilesystemwatcher_win_p.h" diff --git a/src/corelib/io/qfilesystemwatcher_win_p.h b/src/corelib/io/qfilesystemwatcher_win_p.h index f6c6fd6c923..0687080b0ed 100644 --- a/src/corelib/io/qfilesystemwatcher_win_p.h +++ b/src/corelib/io/qfilesystemwatcher_win_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFILESYSTEMWATCHER_WIN_P_H #define QFILESYSTEMWATCHER_WIN_P_H diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index c45b7a58acd..acb9675c2de 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qfsfileengine_p.h" #include "qfsfileengine_iterator_p.h" diff --git a/src/corelib/io/qfsfileengine_iterator.cpp b/src/corelib/io/qfsfileengine_iterator.cpp index bdb2ecdafe7..409963724e5 100644 --- a/src/corelib/io/qfsfileengine_iterator.cpp +++ b/src/corelib/io/qfsfileengine_iterator.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qfsfileengine_iterator_p.h" #include "qfileinfo_p.h" diff --git a/src/corelib/io/qfsfileengine_iterator_p.h b/src/corelib/io/qfsfileengine_iterator_p.h index f3ffc336844..78c4b509666 100644 --- a/src/corelib/io/qfsfileengine_iterator_p.h +++ b/src/corelib/io/qfsfileengine_iterator_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFSFILEENGINE_ITERATOR_P_H #define QFSFILEENGINE_ITERATOR_P_H diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h index 837ec55b93a..d002fefa181 100644 --- a/src/corelib/io/qfsfileengine_p.h +++ b/src/corelib/io/qfsfileengine_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QFSFILEENGINE_P_H #define QFSFILEENGINE_P_H diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp index ec0ae9c8b11..abf5a0c7db4 100644 --- a/src/corelib/io/qfsfileengine_unix.cpp +++ b/src/corelib/io/qfsfileengine_unix.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qplatformdefs.h" #include "private/qabstractfileengine_p.h" diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index c436d4cd26b..1575a2ec5bc 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qplatformdefs.h" #include "private/qabstractfileengine_p.h" diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index 585a07158ea..9c1bb45dd2d 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol //#define QIODEVICE_DEBUG @@ -1308,8 +1309,11 @@ QByteArray QIODevice::readAll() The newline character ('\\n') is included in the buffer. If a newline is not encountered before maxSize - 1 bytes are read, a - newline will not be inserted into the buffer. On windows newline - characters are replaced with '\\n'. + newline will not be inserted into the buffer. + + \note Newline translation(e.g., converting \r to \n) is performed + only when the device is opened for reading with QIODevice::Text + flag. Note that on sequential devices, data may not be immediately available, which may result in a partial line being returned. By calling the diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h index 6bf7149e9af..263214ff012 100644 --- a/src/corelib/io/qiodevice.h +++ b/src/corelib/io/qiodevice.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:header-decls-only #ifndef QIODEVICE_H #define QIODEVICE_H diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h index 151548fb04e..6a1a91e1dea 100644 --- a/src/corelib/io/qiodevice_p.h +++ b/src/corelib/io/qiodevice_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QIODEVICE_P_H #define QIODEVICE_P_H diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp index be9ac52899a..6950ccfcbef 100644 --- a/src/corelib/io/qstandardpaths.cpp +++ b/src/corelib/io/qstandardpaths.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" diff --git a/src/corelib/io/qstandardpaths.h b/src/corelib/io/qstandardpaths.h index 56aa2b100c2..e32e4b3f0f1 100644 --- a/src/corelib/io/qstandardpaths.h +++ b/src/corelib/io/qstandardpaths.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:header-decls-only #ifndef QSTANDARDPATHS_H #define QSTANDARDPATHS_H diff --git a/src/corelib/io/qstandardpaths_android.cpp b/src/corelib/io/qstandardpaths_android.cpp index 3dbbfc1e1cf..c505ebefa75 100644 --- a/src/corelib/io/qstandardpaths_android.cpp +++ b/src/corelib/io/qstandardpaths_android.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" diff --git a/src/corelib/io/qstandardpaths_haiku.cpp b/src/corelib/io/qstandardpaths_haiku.cpp index 93eba134f35..f473ebe633a 100644 --- a/src/corelib/io/qstandardpaths_haiku.cpp +++ b/src/corelib/io/qstandardpaths_haiku.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Tobias Koenig <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" diff --git a/src/corelib/io/qstandardpaths_mac.mm b/src/corelib/io/qstandardpaths_mac.mm index 2acbe927361..8958afc30ef 100644 --- a/src/corelib/io/qstandardpaths_mac.mm +++ b/src/corelib/io/qstandardpaths_mac.mm @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" diff --git a/src/corelib/io/qstandardpaths_unix.cpp b/src/corelib/io/qstandardpaths_unix.cpp index 4fe8739bcc0..744505a9136 100644 --- a/src/corelib/io/qstandardpaths_unix.cpp +++ b/src/corelib/io/qstandardpaths_unix.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // Copyright (C) 2020 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" #include <qdir.h> diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp index 805ce65a5ac..c6471bf7917 100644 --- a/src/corelib/io/qstandardpaths_win.cpp +++ b/src/corelib/io/qstandardpaths_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:provides-trusted-directory-paths #include "qstandardpaths.h" diff --git a/src/corelib/io/qstorageinfo.cpp b/src/corelib/io/qstorageinfo.cpp index 950af69ab82..aa7c67e8596 100644 --- a/src/corelib/io/qstorageinfo.cpp +++ b/src/corelib/io/qstorageinfo.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2015 Ivan Komissarov <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo.h" #include "qstorageinfo_p.h" @@ -12,6 +13,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 +77,7 @@ QStorageInfo::QStorageInfo() \sa setPath() */ QStorageInfo::QStorageInfo(const QString &path) - : d(new QStorageInfoPrivate) + : QStorageInfo() { setPath(path); } @@ -85,39 +87,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..846cfaf4f41 100644 --- a/src/corelib/io/qstorageinfo.h +++ b/src/corelib/io/qstorageinfo.h @@ -1,5 +1,6 @@ // Copyright (C) 2014 Ivan Komissarov <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSTORAGEINFO_H #define QSTORAGEINFO_H @@ -17,6 +18,7 @@ QT_BEGIN_NAMESPACE class QDebug; class QStorageInfoPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QStorageInfoPrivate) class Q_CORE_EXPORT QStorageInfo { public: @@ -24,6 +26,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/io/qstorageinfo_linux.cpp b/src/corelib/io/qstorageinfo_linux.cpp index 00331a57127..f706650c637 100644 --- a/src/corelib/io/qstorageinfo_linux.cpp +++ b/src/corelib/io/qstorageinfo_linux.cpp @@ -3,6 +3,7 @@ // Copyright (C) 2016 Intel Corporation. // Copyright (C) 2023 Ahmad Samir <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo_linux_p.h" diff --git a/src/corelib/io/qstorageinfo_linux_p.h b/src/corelib/io/qstorageinfo_linux_p.h index 8f92b9e9783..26a60dcbc13 100644 --- a/src/corelib/io/qstorageinfo_linux_p.h +++ b/src/corelib/io/qstorageinfo_linux_p.h @@ -3,6 +3,7 @@ // Copyright (C) 2016 Intel Corporation. // Copyright (C) 2023 Ahmad Samir <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSTORAGEINFO_LINUX_P_H #define QSTORAGEINFO_LINUX_P_H diff --git a/src/corelib/io/qstorageinfo_mac.cpp b/src/corelib/io/qstorageinfo_mac.cpp index c6c0f501dab..acfa21d8146 100644 --- a/src/corelib/io/qstorageinfo_mac.cpp +++ b/src/corelib/io/qstorageinfo_mac.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2014 Ivan Komissarov <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo_p.h" diff --git a/src/corelib/io/qstorageinfo_p.h b/src/corelib/io/qstorageinfo_p.h index a917763fe36..0e3f81151e7 100644 --- a/src/corelib/io/qstorageinfo_p.h +++ b/src/corelib/io/qstorageinfo_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2014 Ivan Komissarov <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSTORAGEINFO_P_H #define QSTORAGEINFO_P_H diff --git a/src/corelib/io/qstorageinfo_stub.cpp b/src/corelib/io/qstorageinfo_stub.cpp index f2f7d2eb656..805b66b893c 100644 --- a/src/corelib/io/qstorageinfo_stub.cpp +++ b/src/corelib/io/qstorageinfo_stub.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo_p.h" diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index 40580e3be17..34ba7b9682b 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -2,6 +2,7 @@ // Copyright (C) 2014 Ivan Komissarov <[email protected]> // Copyright (C) 2016 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo_p.h" diff --git a/src/corelib/io/qstorageinfo_win.cpp b/src/corelib/io/qstorageinfo_win.cpp index 3582612508c..cbaf01848e2 100644 --- a/src/corelib/io/qstorageinfo_win.cpp +++ b/src/corelib/io/qstorageinfo_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2014 Ivan Komissarov <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qstorageinfo_p.h" diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index c1f01267949..038db4d857e 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2017 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qtemporaryfile.h" @@ -881,6 +882,11 @@ void QTemporaryFile::setFileTemplate(const QString &name) be used for a similar purpose too, particularly if the destination file is not temporary. + \note Calling rename() does not disable autoRemove. If you want the renamed + file to persist, you must call setAutoRemove and set it to \c false after + calling rename(). Otherwise, the file will be deleted when the QTemporaryFile + object is destroyed. + \sa QSaveFile, QSaveFile::commit(), QFile::rename() */ bool QTemporaryFile::rename(const QString &newName) diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 565ce04c6ce..a4fbf69da8b 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -3660,17 +3660,29 @@ QList<QUrl> QUrl::fromStringList(const QStringList &urls, ParsingMode mode) */ size_t qHash(const QUrl &url, size_t seed) noexcept { + QtPrivate::QHashCombineWithSeed hasher(seed); + + // non-commutative, we must hash the port first if (!url.d) - return qHash(-1, seed); // the hash of an unset port (-1) - - return qHash(url.d->scheme) ^ - qHash(url.d->userName) ^ - qHash(url.d->password) ^ - qHash(url.d->host) ^ - qHash(url.d->port, seed) ^ - qHash(url.d->path) ^ - qHash(url.d->query) ^ - qHash(url.d->fragment); + return hasher(0, -1); + size_t state = hasher(0, url.d->port); + + if (url.d->hasScheme()) + state = hasher(state, url.d->scheme); + if (url.d->hasUserInfo()) { + // see presentSections(), appendUserName(), etc. + state = hasher(state, url.d->userName); + state = hasher(state, url.d->password); + } + if (url.d->hasHost() || url.d->isLocalFile()) // for XDG compatibility + state = hasher(state, url.d->host); + if (url.d->hasPath()) + state = hasher(state, url.d->path); + if (url.d->hasQuery()) + state = hasher(state, url.d->query); + if (url.d->hasFragment()) + state = hasher(state, url.d->fragment); + return state; } static QUrl adjustFtpPath(QUrl url) diff --git a/src/corelib/ipc/qsharedmemory.cpp b/src/corelib/ipc/qsharedmemory.cpp index a2f6e42579e..7345753ce5b 100644 --- a/src/corelib/ipc/qsharedmemory.cpp +++ b/src/corelib/ipc/qsharedmemory.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsharedmemory.h" #include "qsharedmemory_p.h" diff --git a/src/corelib/ipc/qsharedmemory.h b/src/corelib/ipc/qsharedmemory.h index ab448b15c16..eec7d82160c 100644 --- a/src/corelib/ipc/qsharedmemory.h +++ b/src/corelib/ipc/qsharedmemory.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSHAREDMEMORY_H #define QSHAREDMEMORY_H diff --git a/src/corelib/ipc/qsharedmemory_p.h b/src/corelib/ipc/qsharedmemory_p.h index 82cce8919ac..df0a6963598 100644 --- a/src/corelib/ipc/qsharedmemory_p.h +++ b/src/corelib/ipc/qsharedmemory_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSHAREDMEMORY_P_H #define QSHAREDMEMORY_P_H diff --git a/src/corelib/ipc/qsharedmemory_posix.cpp b/src/corelib/ipc/qsharedmemory_posix.cpp index 582c6628e19..fa215c3b538 100644 --- a/src/corelib/ipc/qsharedmemory_posix.cpp +++ b/src/corelib/ipc/qsharedmemory_posix.cpp @@ -2,6 +2,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Tobias Koenig <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsharedmemory.h" #include "qsharedmemory_p.h" diff --git a/src/corelib/ipc/qsharedmemory_systemv.cpp b/src/corelib/ipc/qsharedmemory_systemv.cpp index dc9de11091d..1777236bacc 100644 --- a/src/corelib/ipc/qsharedmemory_systemv.cpp +++ b/src/corelib/ipc/qsharedmemory_systemv.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsharedmemory.h" #include "qsharedmemory_p.h" diff --git a/src/corelib/ipc/qsharedmemory_win.cpp b/src/corelib/ipc/qsharedmemory_win.cpp index 472f34f9a18..b46d0da0c8c 100644 --- a/src/corelib/ipc/qsharedmemory_win.cpp +++ b/src/corelib/ipc/qsharedmemory_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsharedmemory.h" #include "qsharedmemory_p.h" diff --git a/src/corelib/ipc/qsystemsemaphore.cpp b/src/corelib/ipc/qsystemsemaphore.cpp index 24f4789f975..67e8c4bf757 100644 --- a/src/corelib/ipc/qsystemsemaphore.cpp +++ b/src/corelib/ipc/qsystemsemaphore.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" diff --git a/src/corelib/ipc/qsystemsemaphore.h b/src/corelib/ipc/qsystemsemaphore.h index 0981a7eecee..2d80955b85c 100644 --- a/src/corelib/ipc/qsystemsemaphore.h +++ b/src/corelib/ipc/qsystemsemaphore.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSYSTEMSEMAPHORE_H #define QSYSTEMSEMAPHORE_H diff --git a/src/corelib/ipc/qsystemsemaphore_p.h b/src/corelib/ipc/qsystemsemaphore_p.h index 788c4fb7844..5b4630a20a8 100644 --- a/src/corelib/ipc/qsystemsemaphore_p.h +++ b/src/corelib/ipc/qsystemsemaphore_p.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSYSTEMSEMAPHORE_P_H #define QSYSTEMSEMAPHORE_P_H diff --git a/src/corelib/ipc/qsystemsemaphore_posix.cpp b/src/corelib/ipc/qsystemsemaphore_posix.cpp index 7df9593513c..89a75048b4c 100644 --- a/src/corelib/ipc/qsystemsemaphore_posix.cpp +++ b/src/corelib/ipc/qsystemsemaphore_posix.cpp @@ -3,6 +3,7 @@ // Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Tobias Koenig <[email protected]> // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" diff --git a/src/corelib/ipc/qsystemsemaphore_systemv.cpp b/src/corelib/ipc/qsystemsemaphore_systemv.cpp index e5d231d1d42..54e62c615cf 100644 --- a/src/corelib/ipc/qsystemsemaphore_systemv.cpp +++ b/src/corelib/ipc/qsystemsemaphore_systemv.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" diff --git a/src/corelib/ipc/qsystemsemaphore_win.cpp b/src/corelib/ipc/qsystemsemaphore_win.cpp index f42fecf71f6..a157dec0dd2 100644 --- a/src/corelib/ipc/qsystemsemaphore_win.cpp +++ b/src/corelib/ipc/qsystemsemaphore_win.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" diff --git a/src/corelib/ipc/qtipccommon.cpp b/src/corelib/ipc/qtipccommon.cpp index 355f6fbc602..e56046497c5 100644 --- a/src/corelib/ipc/qtipccommon.cpp +++ b/src/corelib/ipc/qtipccommon.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qtipccommon.h" #include "qtipccommon_p.h" diff --git a/src/corelib/ipc/qtipccommon.h b/src/corelib/ipc/qtipccommon.h index 658a426914f..375100f9837 100644 --- a/src/corelib/ipc/qtipccommon.h +++ b/src/corelib/ipc/qtipccommon.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTIPCCOMMON_H #define QTIPCCOMMON_H diff --git a/src/corelib/ipc/qtipccommon_p.h b/src/corelib/ipc/qtipccommon_p.h index 8836cd64421..dc8619299fc 100644 --- a/src/corelib/ipc/qtipccommon_p.h +++ b/src/corelib/ipc/qtipccommon_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTIPCCOMMON_P_H #define QTIPCCOMMON_P_H diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index 604b4a19c69..f759f467cfc 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Giuseppe D'Angelo <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qabstractitemmodel.h" #include <private/qabstractitemmodel_p.h> diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h index 5444bdc8f1f..8de9fee7f0a 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.h +++ b/src/corelib/itemmodels/qabstractitemmodel.h @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Giuseppe D'Angelo <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTITEMMODEL_H #define QABSTRACTITEMMODEL_H diff --git a/src/corelib/itemmodels/qabstractitemmodel_p.h b/src/corelib/itemmodels/qabstractitemmodel_p.h index d22a0a50823..b52559de84c 100644 --- a/src/corelib/itemmodels/qabstractitemmodel_p.h +++ b/src/corelib/itemmodels/qabstractitemmodel_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTITEMMODEL_P_H #define QABSTRACTITEMMODEL_P_H diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index abdeefb4da6..3f843edeedb 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.cpp +++ b/src/corelib/itemmodels/qabstractproxymodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qabstractproxymodel.h" #include "qitemselectionmodel.h" diff --git a/src/corelib/itemmodels/qabstractproxymodel.h b/src/corelib/itemmodels/qabstractproxymodel.h index 8652f500df0..5ccad8c8388 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.h +++ b/src/corelib/itemmodels/qabstractproxymodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTPROXYMODEL_H #define QABSTRACTPROXYMODEL_H diff --git a/src/corelib/itemmodels/qabstractproxymodel_p.h b/src/corelib/itemmodels/qabstractproxymodel_p.h index d33666d00bb..68043fe8901 100644 --- a/src/corelib/itemmodels/qabstractproxymodel_p.h +++ b/src/corelib/itemmodels/qabstractproxymodel_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QABSTRACTPROXYMODEL_P_H #define QABSTRACTPROXYMODEL_P_H diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp index a328a229f96..6d7b8f89b7b 100644 --- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp +++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author David Faure <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qconcatenatetablesproxymodel.h" #include <private/qabstractitemmodel_p.h> diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h index c432597dc16..94aa4cbe2cb 100644 --- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h +++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author David Faure <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QCONCATENATEROWSPROXYMODEL_H #define QCONCATENATEROWSPROXYMODEL_H diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp index 1a97dd5b05d..c0a5f6bf17d 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.cpp +++ b/src/corelib/itemmodels/qidentityproxymodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Stephen Kelly <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qidentityproxymodel.h" #include "qidentityproxymodel_p.h" @@ -197,19 +198,7 @@ QModelIndex QIdentityProxyModel::mapToSource(const QModelIndex& proxyIndex) cons */ QModelIndexList QIdentityProxyModel::match(const QModelIndex& start, int role, const QVariant& value, int hits, Qt::MatchFlags flags) const { - Q_D(const QIdentityProxyModel); - Q_ASSERT(start.isValid() ? start.model() == this : true); - if (!d->model) - return QModelIndexList(); - - const QModelIndexList sourceList = d->model->match(mapToSource(start), role, value, hits, flags); - QModelIndexList::const_iterator it = sourceList.constBegin(); - const QModelIndexList::const_iterator end = sourceList.constEnd(); - QModelIndexList proxyList; - proxyList.reserve(sourceList.size()); - for ( ; it != end; ++it) - proxyList.append(mapFromSource(*it)); - return proxyList; + return QAbstractProxyModel::match(start, role, value, hits, flags); } /*! diff --git a/src/corelib/itemmodels/qidentityproxymodel.h b/src/corelib/itemmodels/qidentityproxymodel.h index af3534160a7..3520d6c5c28 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.h +++ b/src/corelib/itemmodels/qidentityproxymodel.h @@ -1,6 +1,6 @@ // Copyright (C) 2011 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Stephen Kelly <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - +// Qt-Security score:significant reason:default #ifndef QIDENTITYPROXYMODEL_H #define QIDENTITYPROXYMODEL_H diff --git a/src/corelib/itemmodels/qidentityproxymodel_p.h b/src/corelib/itemmodels/qidentityproxymodel_p.h index 9762110de21..a3edef2ad45 100644 --- a/src/corelib/itemmodels/qidentityproxymodel_p.h +++ b/src/corelib/itemmodels/qidentityproxymodel_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Stephen Kelly <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QIDENTITYPROXYMODEL_P_H #define QIDENTITYPROXYMODEL_P_H diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index 3c84e8797d0..c57cddd22dd 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qitemselectionmodel.h" #include "qitemselectionmodel_p.h" diff --git a/src/corelib/itemmodels/qitemselectionmodel.h b/src/corelib/itemmodels/qitemselectionmodel.h index 9c4ac1177bb..230bc47f8fd 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.h +++ b/src/corelib/itemmodels/qitemselectionmodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QITEMSELECTIONMODEL_H #define QITEMSELECTIONMODEL_H diff --git a/src/corelib/itemmodels/qitemselectionmodel_p.h b/src/corelib/itemmodels/qitemselectionmodel_p.h index 6f905c846c7..328ab9d15d5 100644 --- a/src/corelib/itemmodels/qitemselectionmodel_p.h +++ b/src/corelib/itemmodels/qitemselectionmodel_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QITEMSELECTIONMODEL_P_H #define QITEMSELECTIONMODEL_P_H diff --git a/src/corelib/itemmodels/qrangemodel.cpp b/src/corelib/itemmodels/qrangemodel.cpp index 93ca91967ca..51043eb0e24 100644 --- a/src/corelib/itemmodels/qrangemodel.cpp +++ b/src/corelib/itemmodels/qrangemodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qrangemodel.h" #include <QtCore/qsize.h> diff --git a/src/corelib/itemmodels/qrangemodel.h b/src/corelib/itemmodels/qrangemodel.h index afe5a81b56b..328966f26fd 100644 --- a/src/corelib/itemmodels/qrangemodel.h +++ b/src/corelib/itemmodels/qrangemodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QRANGEMODEL_H #define QRANGEMODEL_H diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h index 9e5a5e173f2..38378fdcc64 100644 --- a/src/corelib/itemmodels/qrangemodel_impl.h +++ b/src/corelib/itemmodels/qrangemodel_impl.h @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QRANGEMODEL_IMPL_H #define QRANGEMODEL_IMPL_H @@ -951,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); @@ -980,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) @@ -998,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) @@ -1063,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); } @@ -1107,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. @@ -1147,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) @@ -1546,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/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index c078fe06d0c..51436189629 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qsortfilterproxymodel.h" #include "qitemselectionmodel.h" diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h index e4a2d31636d..297242b3952 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.h +++ b/src/corelib/itemmodels/qsortfilterproxymodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSORTFILTERPROXYMODEL_H #define QSORTFILTERPROXYMODEL_H diff --git a/src/corelib/itemmodels/qstringlistmodel.cpp b/src/corelib/itemmodels/qstringlistmodel.cpp index 2c0cf2785c8..0882b722c80 100644 --- a/src/corelib/itemmodels/qstringlistmodel.cpp +++ b/src/corelib/itemmodels/qstringlistmodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default /* A simple model that uses a QStringList as its data source. diff --git a/src/corelib/itemmodels/qstringlistmodel.h b/src/corelib/itemmodels/qstringlistmodel.h index b93a9c71734..b45b5e16832 100644 --- a/src/corelib/itemmodels/qstringlistmodel.h +++ b/src/corelib/itemmodels/qstringlistmodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QSTRINGLISTMODEL_H #define QSTRINGLISTMODEL_H diff --git a/src/corelib/itemmodels/qtransposeproxymodel.cpp b/src/corelib/itemmodels/qtransposeproxymodel.cpp index 621b54782ef..9c80d5c6ed4 100644 --- a/src/corelib/itemmodels/qtransposeproxymodel.cpp +++ b/src/corelib/itemmodels/qtransposeproxymodel.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 Luca Beldi <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qtransposeproxymodel.h" #include <private/qtransposeproxymodel_p.h> diff --git a/src/corelib/itemmodels/qtransposeproxymodel.h b/src/corelib/itemmodels/qtransposeproxymodel.h index 67ce6f3befe..c219fb29884 100644 --- a/src/corelib/itemmodels/qtransposeproxymodel.h +++ b/src/corelib/itemmodels/qtransposeproxymodel.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 Luca Beldi <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTRANSPOSEPROXYMODEL_H #define QTRANSPOSEPROXYMODEL_H diff --git a/src/corelib/itemmodels/qtransposeproxymodel_p.h b/src/corelib/itemmodels/qtransposeproxymodel_p.h index 2e0c09b95bf..abb7346d835 100644 --- a/src/corelib/itemmodels/qtransposeproxymodel_p.h +++ b/src/corelib/itemmodels/qtransposeproxymodel_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 Luca Beldi <[email protected]> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTRANSPOSEPROXYMODEL_P_H #define QTRANSPOSEPROXYMODEL_P_H diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index a19e39685f1..3b92c5f48f2 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -2189,7 +2189,7 @@ bool QCoreApplication::installTranslator(QTranslator *translationFile) QCoreApplicationPrivate *d = self->d_func(); { - QMutexLocker locker(&d->translateMutex); + QWriteLocker locker(&d->translateMutex); d->translators.prepend(translationFile); } @@ -2221,7 +2221,7 @@ bool QCoreApplication::removeTranslator(QTranslator *translationFile) if (!QCoreApplicationPrivate::checkInstance("removeTranslator")) return false; QCoreApplicationPrivate *d = self->d_func(); - QMutexLocker locker(&d->translateMutex); + QWriteLocker locker(&d->translateMutex); if (d->translators.removeAll(translationFile)) { #ifndef QT_NO_QOBJECT locker.unlock(); @@ -2306,7 +2306,7 @@ QString QCoreApplication::translate(const char *context, const char *sourceText, if (self) { QCoreApplicationPrivate *d = self->d_func(); - QMutexLocker locker(&d->translateMutex); + QReadLocker locker(&d->translateMutex); if (!d->translators.isEmpty()) { QList<QTranslator*>::ConstIterator it; QTranslator *translationFile; @@ -2332,23 +2332,13 @@ QString qtTrId(const char *id, int n) return QCoreApplication::translate(nullptr, id, nullptr, n); } -/*! - \internal - Returns a locked mutex handle if \a translator is registered in QCoreApplication, - and might be therefore queried for translations from other threads. - Returns an unlocked/dummy QMutexLocker otherwise. - */ -std::unique_lock<QMutex> QCoreApplicationPrivate::mutexLockerForTranslator(QTranslator *translator) +bool QCoreApplicationPrivate::isTranslatorInstalled(QTranslator *translator) { if (!QCoreApplication::self) - return std::unique_lock<QMutex>(); - + return false; QCoreApplicationPrivate *d = QCoreApplication::self->d_func(); - std::unique_lock<QMutex> locker(d->translateMutex); - if (!d->translators.contains(translator)) - locker.unlock(); - - return locker; + QReadLocker locker(&d->translateMutex); + return d->translators.contains(translator); } #else diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h index 4cb6254e98d..0027b1ad57f 100644 --- a/src/corelib/kernel/qcoreapplication_p.h +++ b/src/corelib/kernel/qcoreapplication_p.h @@ -30,12 +30,10 @@ #include "private/qcore_mac_p.h" #endif -#ifndef QT_NO_TRANSLATION -#include <mutex> -#endif - QT_BEGIN_NAMESPACE +typedef QList<QTranslator*> QTranslatorList; + class QAbstractEventDispatcher; #ifndef QT_NO_QOBJECT @@ -149,9 +147,9 @@ public: static bool is_app_closing; #endif #ifndef QT_NO_TRANSLATION - QList<QTranslator*> translators; - QMutex translateMutex; - static std::unique_lock<QMutex> mutexLockerForTranslator(QTranslator *translator); + QTranslatorList translators; + QReadWriteLock translateMutex; + static bool isTranslatorInstalled(QTranslator *translator); #endif static bool setuidAllowed; diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 795cc531114..2356611a5cf 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -17,7 +17,7 @@ #include <qthread.h> #include "private/qthread_p.h" #if QT_CONFIG(thread) -#include <qsemaphore.h> +#include "private/qlatch_p.h" #endif // for normalizeTypeInternal @@ -1748,9 +1748,9 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase * if (receiverInSameThread) qWarning("QMetaObject::invokeMethod: Dead lock detected"); - QSemaphore semaphore; - QCoreApplication::postEvent(object, new QMetaCallEvent(std::move(slot), nullptr, -1, argv, &semaphore)); - semaphore.acquire(); + QLatch latch(1); + QCoreApplication::postEvent(object, new QMetaCallEvent(std::move(slot), nullptr, -1, argv, &latch)); + latch.wait(); #endif // QT_CONFIG(thread) } else { qWarning("QMetaObject::invokeMethod: Unknown connection type"); @@ -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 { @@ -2922,10 +2922,10 @@ auto QMetaMethodInvoker::invokeImpl(QMetaMethod self, void *target, return InvokeFailReason::DeadLockDetected; } - QSemaphore semaphore; + QLatch latch(1); QCoreApplication::postEvent(object, new QMetaCallEvent(idx_offset, idx_relative, callFunction, - nullptr, -1, param, &semaphore)); - semaphore.acquire(); + nullptr, -1, param, &latch)); + latch.wait(); #endif // QT_CONFIG(thread) } return {}; diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 60bcdedba13..7fe36d37bce 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -2080,6 +2080,17 @@ bool QMetaPropertyBuilder::isBindable() const else return false; } +/*! + Returns \c true if the property is required. + The default is \c false. + */ +bool QMetaPropertyBuilder::isRequired() const +{ + if (auto d = d_func()) + return d->flag(Bindable); + else + return false; +} /*! Sets this property to readable if \a value is true. @@ -2236,6 +2247,15 @@ void QMetaPropertyBuilder::setBindable(bool value) } /*! + Sets the\c REQUIRED flag on this property to \a value + */ +void QMetaPropertyBuilder::setRequired(bool value) +{ + if (auto d = d_func()) + d->setFlag(Required, value); +} + +/*! Returns the revision of this property. \sa setRevision() diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h index cf64e51c30c..36cd08d908c 100644 --- a/src/corelib/kernel/qmetaobjectbuilder_p.h +++ b/src/corelib/kernel/qmetaobjectbuilder_p.h @@ -216,6 +216,7 @@ public: bool isFinal() const; bool isAlias() const; bool isBindable() const; + bool isRequired() const; void setReadable(bool value); void setWritable(bool value); @@ -230,6 +231,7 @@ public: void setFinal(bool value); void setAlias(bool value); void setBindable(bool value); + void setRequired(bool value); int revision() const; void setRevision(int revision); diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 1242a40f185..45c947004f5 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -981,12 +981,6 @@ void QMetaType::unregisterMetaType(QMetaType type) than the QMetaType \a rhs, otherwise returns \c false. */ -/*! \internal */ -bool QMetaTypeModuleHelper::convert(const void *, int, void *, int) const -{ - return false; -} - static constexpr auto createStaticTypeToIdMap() { #define QT_ADD_STATIC_METATYPE(MetaTypeName, MetaTypeId, RealName) \ @@ -1049,8 +1043,8 @@ static bool qIntegerConversionFromFPHelper(From from, To *to) return true; } -// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class -static constexpr struct : QMetaTypeModuleHelper +namespace { +struct QCoreVariantHelper : QMetaTypeModuleHelper { template<typename T, typename LiteralWrapper = std::conditional_t<std::is_same_v<T, QString>, QLatin1StringView, const char *>> @@ -1060,7 +1054,8 @@ static constexpr struct : QMetaTypeModuleHelper return !(str.isEmpty() || str == LiteralWrapper("0") || str == LiteralWrapper("false")); } - const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override { + static const QtPrivate::QMetaTypeInterface *interfaceForType(int type) + { switch (type) { QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_CONVERT_ID_TO_TYPE) QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_CONVERT_ID_TO_TYPE) @@ -1072,11 +1067,14 @@ static constexpr struct : QMetaTypeModuleHelper } } -#ifndef QT_BOOTSTRAPPED - bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override + static bool convert(const void *from, int fromTypeId, void *to, int toTypeId) { Q_ASSERT(fromTypeId != toTypeId); +#ifdef QT_BOOTSTRAPPED + Q_UNUSED(from); + Q_UNUSED(to); +#else // canConvert calls with two nullptr bool onlyCheck = (from == nullptr && to == nullptr); @@ -1747,26 +1745,28 @@ QT_WARNING_DISABLE_CLANG("-Wtautological-compare") QT_WARNING_POP } +#endif // !QT_BOOTSTRAPPED return false; } -#endif // !QT_BOOTSTRAPPED -} metatypeHelper = {}; +}; +} // unnamed namespace -Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper = nullptr; -Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper = nullptr; +Q_CONSTINIT Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeGuiHelper = {}; +Q_CONSTINIT Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeWidgetsHelper = {}; -static const QMetaTypeModuleHelper *qModuleHelperForType(int type) +#ifndef QT_BOOTSTRAPPED +static bool tryConvertBuiltinTypes(const void *from, int fromTypeId, void *to, int toTypeId) { + int type = qMax(fromTypeId, toTypeId); if (type <= QMetaType::LastCoreType) - return &metatypeHelper; + return QCoreVariantHelper::convert(from, fromTypeId, to, toTypeId); if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType) - return qMetaTypeGuiHelper; + return qMetaTypeGuiHelper.convert(from, fromTypeId, to, toTypeId); else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType) - return qMetaTypeWidgetsHelper; - return nullptr; + return qMetaTypeWidgetsHelper.convert(from, fromTypeId, to, toTypeId); + return false; } -#ifndef QT_BOOTSTRAPPED template<typename T, typename Key> class QMetaTypeFunctionRegistry { @@ -2471,10 +2471,8 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType, int fromTypeId = fromType.id(); int toTypeId = toType.id(); - if (auto moduleHelper = qModuleHelperForType(qMax(fromTypeId, toTypeId))) { - if (moduleHelper->convert(from, fromTypeId, to, toTypeId)) - return true; - } + if (tryConvertBuiltinTypes(from, fromTypeId, to, toTypeId)) + return true; const auto f = customTypesConversionRegistry()->function({fromTypeId, toTypeId}); if (f) return (*f)(from, to); @@ -2676,10 +2674,9 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType) if (fromTypeId == toTypeId) return true; - if (auto moduleHelper = qModuleHelperForType(qMax(fromTypeId, toTypeId))) { - if (moduleHelper->convert(nullptr, fromTypeId, nullptr, toTypeId)) - return true; - } + if (tryConvertBuiltinTypes(nullptr, fromTypeId, nullptr, toTypeId)) + return true; + const ConverterFunction * const f = customTypesConversionRegistry()->function(std::make_pair(fromTypeId, toTypeId)); if (f) @@ -2879,8 +2876,12 @@ void QMetaType::registerNormalizedTypedef(const NS(QByteArray) & normalizedTypeN static const QtPrivate::QMetaTypeInterface *interfaceForStaticType(int typeId) { Q_ASSERT(typeId < QMetaType::User); - if (auto moduleHelper = qModuleHelperForType(typeId)) - return moduleHelper->interfaceForType(typeId); + if (typeId <= QMetaType::LastCoreType) + return QCoreVariantHelper::interfaceForType(typeId); + if (typeId >= QMetaType::FirstGuiType && typeId <= QMetaType::LastGuiType) + return qMetaTypeGuiHelper.interfaceForType(typeId); + if (typeId >= QMetaType::FirstWidgetsType && typeId <= QMetaType::LastWidgetsType) + return qMetaTypeWidgetsHelper.interfaceForType(typeId); return nullptr; } @@ -2909,40 +2910,18 @@ bool QMetaType::isRegistered(int type) return interfaceForTypeNoWarning(type) != nullptr; } -namespace { -enum NormalizeTypeMode { - DontNormalizeType, - TryNormalizeType -}; -} -template <NormalizeTypeMode tryNormalizedType> static inline -const QtPrivate::QMetaTypeInterface *qMetaTypeTypeImpl(QByteArrayView name) +static const QtPrivate::QMetaTypeInterface *findMetaTypeByName(QByteArrayView name) { - if (name.isEmpty()) - return nullptr; - + Q_PRE(!name.isEmpty()); int type = qMetaTypeStaticType(name); if (type != QMetaType::UnknownType) { return interfaceForStaticType(type); #ifndef QT_BOOTSTRAPPED - } else { - QReadLocker locker(&customTypeRegistry()->lock); + } else if (customTypeRegistry.exists()) { + QReadLocker locker(&customTypeRegistry->lock); auto it = customTypeRegistry->aliases.constFind(name); if (it != customTypeRegistry->aliases.constEnd()) return it.value().data(); - -#ifndef QT_NO_QOBJECT - if (tryNormalizedType) { - const char *typeName = name.constData(); - const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName); - type = qMetaTypeStaticType(normalizedTypeName); - if (type == QMetaType::UnknownType) { - return customTypeRegistry->aliases.value(normalizedTypeName).data(); - } else { - return interfaceForStaticType(type); - } - } -#endif #endif } return nullptr; @@ -2969,7 +2948,9 @@ const QtPrivate::QMetaTypeInterface *qMetaTypeTypeImpl(QByteArrayView name) */ int qMetaTypeTypeInternal(QByteArrayView name) { - const QtPrivate::QMetaTypeInterface *iface = qMetaTypeTypeImpl<DontNormalizeType>(name); + const QtPrivate::QMetaTypeInterface *iface = nullptr; + if (!name.isEmpty()) + iface = findMetaTypeByName(name); return iface ? iface->typeId.loadRelaxed() : QMetaType::UnknownType; } @@ -3138,7 +3119,20 @@ QMetaType QMetaType::underlyingType() const */ QMetaType QMetaType::fromName(QByteArrayView typeName) { - return QMetaType(qMetaTypeTypeImpl<TryNormalizeType>(typeName)); + if (typeName.isEmpty()) + return QMetaType(); + + const QtPrivate::QMetaTypeInterface *iface = findMetaTypeByName(typeName); + if (iface) + return QMetaType(iface); + +#if !defined(QT_NO_QOBJECT) + const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName.constData()); + if (normalizedTypeName != typeName) + iface = findMetaTypeByName(normalizedTypeName); +#endif + + return QMetaType(iface); } /*! 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/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h index c05bce5fc8f..b39e1de0be2 100644 --- a/src/corelib/kernel/qmetatype_p.h +++ b/src/corelib/kernel/qmetatype_p.h @@ -40,25 +40,29 @@ QT_BEGIN_NAMESPACE assign_and_return \ } -class Q_CORE_EXPORT QMetaTypeModuleHelper +struct QMetaTypeModuleHelper { - Q_DISABLE_COPY_MOVE(QMetaTypeModuleHelper) -protected: - QMetaTypeModuleHelper() = default; - ~QMetaTypeModuleHelper() = default; -public: - Q_WEAK_OVERLOAD // prevent it from entering the ABI and rendering constexpr useless static constexpr auto makePair(int from, int to) -> quint64 { return (quint64(from) << 32) + quint64(to); } - virtual const QtPrivate::QMetaTypeInterface *interfaceForType(int) const = 0; - virtual bool convert(const void *, int, void *, int) const; + static const QtPrivate::QMetaTypeInterface *interfaceForType_dummy(int) + { + return nullptr; + } + + static bool convert_dummy(const void *, int, void *, int) + { + return false; + } + + decltype(&interfaceForType_dummy) interfaceForType = &interfaceForType_dummy; + decltype(&convert_dummy) convert = &convert_dummy; }; -extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper; -extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper; +extern Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeGuiHelper; +extern Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeWidgetsHelper; namespace QtMetaTypePrivate { template<typename T> diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 46f2ad7d1c4..888c71f5a49 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -27,7 +27,7 @@ #include <qscopeguard.h> #include <qset.h> #if QT_CONFIG(thread) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #endif #include <private/qorderedmutexlocker_p.h> @@ -476,8 +476,8 @@ void QObjectPrivate::reinitBindingStorageAfterThreadMove() QAbstractMetaCallEvent::~QAbstractMetaCallEvent() { #if QT_CONFIG(thread) - if (semaphore_) - semaphore_->release(); + if (latch) + latch->countDown(); #endif } @@ -506,8 +506,8 @@ inline void QMetaCallEvent::allocArgs() QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d({nullptr, args, callFunction, 0, method_offset, method_relative}), prealloc_() { @@ -521,8 +521,8 @@ QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, */ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d({QtPrivate::SlotObjUniquePtr{slotO}, args, nullptr, 0, 0, ushort(-1)}), prealloc_() { @@ -538,8 +538,8 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, */ QMetaCallEvent::QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotO, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d{std::move(slotO), args, nullptr, 0, 0, ushort(-1)}, prealloc_() { @@ -3912,7 +3912,7 @@ void QMetaObject::connectSlotsByName(QObject *o) /*! \fn template<typename PointerToMemberFunction> QMetaObject::Connection QMetaObject::connect( - const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type) + const QObject *sender, const QMetaMethod &signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type) \threadsafe \overload connect() @@ -3937,13 +3937,15 @@ void QMetaObject::connectSlotsByName(QObject *o) conversions and type checking are not handled by this function. Overloaded slots need to be explicitly be resolved with help of \l qOverload. + \a signal needs to be the meta-method of a signal, otherwise an + invalid connection will be returned. \sa QObject::connect(), QObject::disconnect() */ /*! - \fn template<typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QMetaObject::connect( - const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type) + \fn template<typename Functor> QMetaObject::Connection QMetaObject::connect( + const QObject *sender, const QMetaMethod &signal, const QObject *context, Functor functor, Qt::ConnectionType type) \threadsafe \overload connect() @@ -3967,6 +3969,8 @@ void QMetaObject::connectSlotsByName(QObject *o) conversions and type checking are not handled by this function. Overloaded functors need to be explicitly be resolved with help of \l qOverload. + \a signal needs to be the meta-method of a signal, otherwise an + invalid connection will be returned. The connection will automatically disconnect if the sender or the context is destroyed. @@ -4194,18 +4198,18 @@ void doActivate(QObject *sender, int signal_index, void **argv) if (c->isSingleShot && !QObjectPrivate::removeConnection(c)) continue; - QSemaphore semaphore; + QLatch latch(1); { QMutexLocker locker(signalSlotLock(receiver)); if (!c->isSingleShot && !c->receiver.loadAcquire()) continue; QMetaCallEvent *ev = c->isSlotObject ? - new QMetaCallEvent(c->slotObj, sender, signal_index, argv, &semaphore) : + new QMetaCallEvent(c->slotObj, sender, signal_index, argv, &latch) : new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, - sender, signal_index, argv, &semaphore); + sender, signal_index, argv, &latch); QCoreApplication::postEvent(receiver, ev); } - semaphore.acquire(); + latch.wait(); continue; #endif } diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 20c454506ab..dca9c1af932 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -328,16 +328,13 @@ bool QObjectPrivate::disconnect(const typename QtPrivate::FunctionPointer< Func1 &SignalType::Object::staticMetaObject); } -class QSemaphore; +class QLatch; class Q_CORE_EXPORT QAbstractMetaCallEvent : public QEvent { public: - QAbstractMetaCallEvent(const QObject *sender, int signalId, QSemaphore *semaphore = nullptr) - : QEvent(MetaCall), signalId_(signalId), sender_(sender) -#if QT_CONFIG(thread) - , semaphore_(semaphore) -#endif - { Q_UNUSED(semaphore); } + QAbstractMetaCallEvent(const QObject *sender, int signalId, QLatch *latch = nullptr) + : QEvent(MetaCall), signalId_(signalId), sender_(sender), latch(latch) + {} ~QAbstractMetaCallEvent(); virtual void placeMetaCall(QObject *object) = 0; @@ -348,25 +345,23 @@ public: private: int signalId_; const QObject *sender_; -#if QT_CONFIG(thread) - QSemaphore *semaphore_; -#endif + QLatch *latch; }; class Q_CORE_EXPORT QMetaCallEvent : public QAbstractMetaCallEvent { public: - // blocking queued with semaphore - args always owned by caller + // blocking queued with latch - args always owned by caller QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); // queued - args allocated by event, copied by caller QMetaCallEvent(ushort method_offset, ushort method_relative, 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/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index b369d2ed8f7..79dcd82f0c5 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -294,9 +294,9 @@ struct Q_CORE_EXPORT QMetaObject #ifdef Q_QDOC template<typename PointerToMemberFunction> - static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection); - template<typename PointerToMemberFunction, typename Functor> - static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection); + static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection); + template<typename Functor> + static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection); #else template <typename Func> static inline Connection diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp index 384253265be..7368af2df6e 100644 --- a/src/corelib/kernel/qproperty.cpp +++ b/src/corelib/kernel/qproperty.cpp @@ -1385,6 +1385,7 @@ QString QPropertyBindingError::description() const /*! \fn template <typename T> template <typename Functor> QPropertyBinding<T> QProperty<T>::setBinding(Functor f) \overload + \since 6.0 Associates the value of this property with the provided functor \a f and returns the previously associated binding. The property's value is set to the @@ -1442,6 +1443,7 @@ QString QPropertyBindingError::description() const /*! \fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QProperty<T>::subscribe(Functor f) + \since 6.0 Subscribes the given functor \a f as a callback that is called immediately and whenever the value of the property changes in the future. On each value @@ -1459,6 +1461,7 @@ QString QPropertyBindingError::description() const /*! \fn template <typename T> template <typename Functor> QPropertyNotifier QProperty<T>::addNotifier(Functor f) + \since 6.2 Subscribes the given functor \a f as a callback that is called whenever the value of the property changes. @@ -1948,6 +1951,7 @@ QString QPropertyBindingError::description() const \brief The QPropertyNotifier class controls the lifecycle of change callback installed on a QProperty. \ingroup tools + \since 6.2 QPropertyNotifier is created when registering a callback on a QProperty to listen to changes to the property's value, using QProperty::addNotifier. As 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/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 47483dc6470..c8348aba16a 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -39,6 +39,8 @@ #include <vector> #include <memory> +#include <QtCore/qmutex.h> + QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcTranslator, "qt.core.qtranslator") @@ -259,6 +261,8 @@ class QTranslatorPrivate : public QObjectPrivate public: enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96, Language = 0xa7 }; + mutable QMutex lock; + QTranslatorPrivate() : #if defined(QT_USE_MMAP) used_mmap(0), @@ -463,12 +467,7 @@ bool QTranslator::load(const QString & filename, const QString & directory, const QString & suffix) { Q_D(QTranslator); - - std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this); - if (locker.owns_lock()) - QCoreApplication::postEvent(QCoreApplication::instance(), - new QEvent(QEvent::LanguageChange)); - + QMutexLocker locker(&d->lock); d->clear(); QString prefix; @@ -744,12 +743,7 @@ bool QTranslator::load(const QLocale & locale, const QString & suffix) { Q_D(QTranslator); - - std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this); - if (locker.owns_lock()) - QCoreApplication::postEvent(QCoreApplication::instance(), - new QEvent(QEvent::LanguageChange)); - + QMutexLocker locker(&d->lock); d->clear(); return d->load_translation(locale, filename, prefix, directory, suffix); } @@ -769,12 +763,7 @@ bool QTranslator::load(const QLocale & locale, bool QTranslator::load(const uchar *data, int len, const QString &directory) { Q_D(QTranslator); - - std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this); - if (locker.owns_lock()) - QCoreApplication::postEvent(QCoreApplication::instance(), - new QEvent(QEvent::LanguageChange)); - + QMutexLocker locker(&d->lock); d->clear(); if (!data || len < MagicLength || memcmp(data, magic, MagicLength)) @@ -1048,6 +1037,7 @@ searchDependencies: void QTranslatorPrivate::clear() { + Q_Q(QTranslator); if (unmapPointer && unmapLength) { #if defined(QT_USE_MMAP) if (used_mmap) { @@ -1075,9 +1065,15 @@ void QTranslatorPrivate::clear() language.clear(); filePath.clear(); + + if (QCoreApplicationPrivate::isTranslatorInstalled(q)) + QCoreApplication::postEvent(QCoreApplication::instance(), + new QEvent(QEvent::LanguageChange)); } /*! + \threadsafe + Returns the translation for the key (\a context, \a sourceText, \a disambiguation). If none is found, also tries (\a context, \a sourceText, ""). If that still fails, returns a null string. @@ -1099,7 +1095,14 @@ QString QTranslator::translate(const char *context, const char *sourceText, cons int n) const { Q_D(const QTranslator); - return d->do_translate(context, sourceText, disambiguation, n); + + // Return early to avoid a deadlock in case translate() is called + // from a code path triggered by QTranslator::load() + if (!d->lock.tryLock()) + return QString(); + QString result = d->do_translate(context, sourceText, disambiguation, n); + d->lock.unlock(); + return result; } /*! 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/platform/windows/qt_winrtbase_p.h b/src/corelib/platform/windows/qt_winrtbase_p.h index fb7366f93de..79c2bdf6b1c 100644 --- a/src/corelib/platform/windows/qt_winrtbase_p.h +++ b/src/corelib/platform/windows/qt_winrtbase_p.h @@ -18,6 +18,7 @@ #include <QtCore/qglobal.h> #if QT_CONFIG(cpp_winrt) +# include <guiddef.h> // required by clang-cl: https://github.com/microsoft/cppwinrt/issues/1179 # include <winrt/base.h> # include <QtCore/private/qfactorycacheregistration_p.h> // Workaround for Windows SDK bug. diff --git a/src/corelib/serialization/qcborarray.cpp b/src/corelib/serialization/qcborarray.cpp index e00b7a4571f..9a566b999b4 100644 --- a/src/corelib/serialization/qcborarray.cpp +++ b/src/corelib/serialization/qcborarray.cpp @@ -98,6 +98,17 @@ QCborArray::QCborArray(const QCborArray &other) noexcept } /*! + \fn QCborArray::QCborArray(QCborArray &&other) + \since 6.10 + + Move-constructor. + + The moved-from object \a other is placed in the default-constructed state. + + \sa QCborArray::QCborArray() +*/ + +/*! \fn QCborArray::QCborArray(std::initializer_list<QCborValue> args) Initializes this QCborArray from the C++ brace-enclosed list found in \a @@ -126,6 +137,15 @@ QCborArray &QCborArray::operator=(const QCborArray &other) noexcept } /*! + \fn QCborArray &QCborArray::operator=(QCborArray &&other) + \since 6.10 + + Move-assignment operator. + + The moved-from object \a other is placed in a valid, but unspecified state. +*/ + +/*! \fn void QCborArray::swap(QCborArray &other) \memberswap{array} */ diff --git a/src/corelib/serialization/qcborarray.h b/src/corelib/serialization/qcborarray.h index dd24e5604c0..208d5bcc9a1 100644 --- a/src/corelib/serialization/qcborarray.h +++ b/src/corelib/serialization/qcborarray.h @@ -204,7 +204,9 @@ public: QCborArray() noexcept; QCborArray(const QCborArray &other) noexcept; + QCborArray(QCborArray &&other) noexcept = default; QCborArray &operator=(const QCborArray &other) noexcept; + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCborArray) QCborArray(std::initializer_list<QCborValue> args) : QCborArray() { diff --git a/src/corelib/serialization/qcborcommon.h b/src/corelib/serialization/qcborcommon.h index b9f7a66ae2f..5183a90937f 100644 --- a/src/corelib/serialization/qcborcommon.h +++ b/src/corelib/serialization/qcborcommon.h @@ -7,6 +7,7 @@ #include <QtCore/qobjectdefs.h> #include <QtCore/qmetatype.h> +#include <QtCore/qshareddata.h> #if 0 #pragma qt_class(QtCborCommon) @@ -22,6 +23,9 @@ QT_BEGIN_NAMESPACE class QDebug; +class QCborContainerPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QCborContainerPrivate) // defined in qcborvalue.cpp + enum class QCborSimpleType : quint8 { False = 20, True = 21, diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp index 6166775c8ce..e6075dcfc36 100644 --- a/src/corelib/serialization/qcbormap.cpp +++ b/src/corelib/serialization/qcbormap.cpp @@ -276,6 +276,17 @@ QCborMap::QCborMap(const QCborMap &other) noexcept } /*! + \fn QCborMap::QCborMap(QCborMap &&other) + \since 6.10 + + Move-constructor. + + The moved-from object \a other is placed in the default-constructed state. + + \sa QCborMap::QCborMap() +*/ + +/*! \fn QCborMap::QCborMap(std::initializer_list<value_type> args) Constructs a QCborMap with items from a brace-initialization list found in @@ -309,6 +320,15 @@ QCborMap &QCborMap::operator=(const QCborMap &other) noexcept } /*! + \fn QCborMap &QCborMap::operator=(QCborMap &&other) + \since 6.10 + + Move-assignment operator. + + The moved-from object \a other is placed in a valid, but unspecified state. +*/ + +/*! \fn void QCborMap::swap(QCborMap &other) \memberswap{map} */ diff --git a/src/corelib/serialization/qcbormap.h b/src/corelib/serialization/qcbormap.h index 039c436c76b..e2945621451 100644 --- a/src/corelib/serialization/qcbormap.h +++ b/src/corelib/serialization/qcbormap.h @@ -239,7 +239,9 @@ public: QCborMap() noexcept; QCborMap(const QCborMap &other) noexcept; + QCborMap(QCborMap &&other) noexcept = default; QCborMap &operator=(const QCborMap &other) noexcept; + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCborMap) QCborMap(std::initializer_list<value_type> args) : QCborMap() { diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index fabed2f06e1..5b7ec705079 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -28,6 +28,8 @@ QT_BEGIN_NAMESPACE +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QCborContainerPrivate) + // Worst case memory allocation for a corrupt stream: 256 MB for 32-bit, 1 GB for 64-bit static constexpr quint64 MaxAcceptableMemoryUse = (sizeof(void*) == 4 ? 256 : 1024) * 1024 * 1024; 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/qanystringview.cpp b/src/corelib/text/qanystringview.cpp index c8e5daaf089..7bf8a3fa1fd 100644 --- a/src/corelib/text/qanystringview.cpp +++ b/src/corelib/text/qanystringview.cpp @@ -47,6 +47,43 @@ QT_BEGIN_NAMESPACE outlives the QAnyStringView on all code paths, lest the string view ends up referencing deleted data. + For example, + + \code + QAnyStringView str = funcReturningQString(); // return value is a temp + \endcode + + would leave \c{str} referencing the deleted temporary (which constitutes + undefined behavior). This is particularly true for the single-character + constructors: + + \code + QAnyStringView ch = u' '; // u' ' is a temporary + // oops, ch references deleted temporary + \endcode + + In both cases, the solution is to "pin" the temporary to an lvalue and only + then create a QAnyStringView from it: + + \code + const auto r = funcReturningQString(); + QAnyStringView str = r; // ok, `r` outlives `str` + const auto sp = u' '; + QAnyStringView ch = sp; // ok, `sp` outlives `ch` + \endcode + + However, using QAnyStringView as the interface type that it is intended to + be is \e{always} safe, provided the called function's documentation is not + asking for a longer lifetime: + + \code + void func(QAnyStringView s); + func(u' '); + func(functionReturningQString()); + \endcode + + This is why QAnyStringView supports these conversions in the first place. + When used as an interface type, QAnyStringView allows a single function to accept a wide variety of string data sources. One function accepting QAnyStringView thus replaces five function @@ -95,6 +132,19 @@ QT_BEGIN_NAMESPACE presented as a QLatin1StringView) while the 16-bit character types are interpreted as UTF-16 data in host byte order (the same as QString). + The following character types are only supported by the single-character + constructor: + + \list + \li \c QLatin1Char + \li \c QChar::SpecialCharacter + \li \c wchar_t (where it's a 32-bit type, i.e. Unix) (since 6.10) + \li \c char32_t + \endlist + + These character types are internally decomposed into a UTF-16 + sequence (using QChar::fromUcs4() for the last). + \section2 Sizes and Sub-Strings All sizes and positions in QAnyStringView functions are in the @@ -186,6 +236,69 @@ QT_BEGIN_NAMESPACE */ /*! + \fn template <typename Char, QAnyStringView::if_compatible_char<Char>> QAnyStringView::QAnyStringView(const Char &ch) + + Constructs a string view on the single character \a ch. The length is usually + \c{1} (but see below). + + In general, you must assume that a QAnyStringView thus created will start + to reference stale data at the end of the + \l{https://en.cppreference.com/w/cpp/language/expressions#Full-expressions}{full-expression}, + when temporaries are deleted. That means that using it to pass a single + character to a QAnyStringView-taking function is ok and safe (as long as + the function documentation doesn't ask for a lifetime longer than the + initial call): + + \code + int to_int(QAnyStringView); + int res = to_int(u'9'); // OK, data stays around for the duration of the call + \endcode + + But keeping the object around longer is undefined behavior: + + \code + QAnyStringView ch = u'9'; + int res = to_int(ch); // (silent) ERROR: ch references deleted data + \endcode + + If you need this, prefer + + \code + const auto nine = u'9'; + QAnyStringView ch(nine); // ok, references `nine`, which outlives `ch` + int res = to_int(ch); // 9 + \endcode + + The above is true for all directly supported \l{Compatible Character Types}. + + If \a ch is not one of these types, but merely converts to QChar, e.g. + QChar::SpecialCharacter or QLatin1Char, the QAnyStringView will bind to a + temporary object that will have been deleted at the end of the full + expression, just like in the second example. + + If \a ch cannot be represented in a single UTF-16 code unit (e.g. because + it's a \c{char32_t} value), this constructor decomposes \a ch into two + UFT-16 code units. The resulting QAnyStringView will have a size() of \c{2} + in that case, and the temporary buffer in which the decomposition is stored + is deleted at the end of the full-expression, similar to + + \code + [](char32_t ch, auto &&tmp = QChar::fromUcs4(ch)) { + return QAnyStringView(tmp); + } + \endcode + + The equivalent safe version in this case would be + + \code + const auto decomposed = QChar::fromUcs4(ch); + QAnyStringView ch(decomposed); + \endcode + + \sa QChar::fromUcs4(), {Compatible Character Types} +*/ + +/*! \fn template <typename Char, size_t N> QAnyStringView::QAnyStringView(const Char (&string)[N]) Constructs a string view on the character string literal \a string. diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h index 4b89fa6edbf..079cf751af1 100644 --- a/src/corelib/text/qanystringview.h +++ b/src/corelib/text/qanystringview.h @@ -25,6 +25,11 @@ struct wrapped { using type = Result; }; template <typename Tag, typename Result> using wrapped_t = typename wrapped<Tag, Result>::type; +template <typename Char> +struct is_compatible_utf32_char : std::false_type {}; +template <> struct is_compatible_utf32_char<char32_t> : std::true_type {}; +template <> struct is_compatible_utf32_char<wchar_t> : std::bool_constant<sizeof(wchar_t) == 4> {}; + } // namespace QtPrivate class QAnyStringView @@ -60,6 +65,11 @@ private: }; template <typename Char> + using if_compatible_utf32_char = std::enable_if_t< + QtPrivate::is_compatible_utf32_char<Char>::value + , bool>; + + template <typename Char> using is_compatible_char = std::disjunction< QtPrivate::IsCompatibleCharType<Char>, QtPrivate::IsCompatibleChar8Type<Char> @@ -220,7 +230,7 @@ public: constexpr QAnyStringView(Char ch, QCharContainer &&capacity = QCharContainer()) noexcept : QAnyStringView{&(capacity.ch = ch), 1} {} template <typename Char, typename Container = decltype(QChar::fromUcs4(U'x')), - std::enable_if_t<std::is_same_v<Char, char32_t>, bool> = true> + if_compatible_utf32_char<Char> = true> constexpr QAnyStringView(Char c, Container &&capacity = {}) noexcept : QAnyStringView(capacity = QChar::fromUcs4(c)) {} diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index d518a2f28f2..91550056101 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -1889,6 +1889,15 @@ QByteArray::QByteArray(qsizetype size, Qt::Initialization) } /*! + \fn QByteArray::QByteArray(QByteArrayView v) + \since 6.8 + + Constructs a byte array initialized with the byte array view's data. + + The QByteArray will be null if and only if \a v is null. +*/ + +/*! Sets the size of the byte array to \a size bytes. If \a size is greater than the current size, the byte array is @@ -4924,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/qstring.h b/src/corelib/text/qstring.h index 09cfbdfe94d..e4f06835bd1 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -66,9 +66,6 @@ template <> struct treat_as_integral_arg<unsigned short> : std::true_type {}; template <> struct treat_as_integral_arg< signed short> : std::true_type {}; template <> struct treat_as_integral_arg<unsigned char> : std::true_type {}; template <> struct treat_as_integral_arg< signed char> : std::true_type {}; -// QTBUG-126054, keep until we can fix it for all platforms, not just Windows -// (where wchar_t does convert to QAnyStringView): -template <> struct treat_as_integral_arg<wchar_t> : std::true_type {}; } // Qt 4.x compatibility 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/qstringlist.cpp b/src/corelib/text/qstringlist.cpp index bb9cf2f0c9f..e6f85849f27 100644 --- a/src/corelib/text/qstringlist.cpp +++ b/src/corelib/text/qstringlist.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE \reentrant - QStringList inherits from QList<QString>. Like QList, QStringList is + QStringList is actually just a QList<QString>. Like QList, QStringList is \l{implicitly shared}. It provides fast index-based access as well as fast insertions and removals. Passing string lists as value parameters is both fast and safe. 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/thread/qatomicwait.cpp b/src/corelib/thread/qatomicwait.cpp index 3d70333ca7b..25ca771643b 100644 --- a/src/corelib/thread/qatomicwait.cpp +++ b/src/corelib/thread/qatomicwait.cpp @@ -4,6 +4,7 @@ #include "qatomicwait_p.h" #include <qendian.h> +#include "qfutex_p.h" #include "qwaitcondition_p.h" #include <array> @@ -96,8 +97,21 @@ struct QAtomicWaitLocks }; } // unnamed namespace +static inline void checkFutexUse() +{ +#if !defined(QATOMICWAIT_USE_FALLBACK) + if (QtFutex::futexAvailable()) { + // This will disable the code and data on systems where futexes are + // always available (currently: FreeBSD, Linux, Windows). + qFatal("Implementation should have used futex!"); + } +#endif +} + static QAtomicWaitLocks &atomicLocks() noexcept { + checkFutexUse(); + static QAtomicWaitLocks global {}; return global; } diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp index bd3b269c0b7..832d87332b0 100644 --- a/src/corelib/thread/qmutex.cpp +++ b/src/corelib/thread/qmutex.cpp @@ -120,8 +120,8 @@ void QBasicMutex::destroyInternal(void *ptr) Locks the mutex. If another thread has locked the mutex then this call will block until that thread has unlocked it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. + If the mutex was already locked by the current thread, this call will + never return, causing a \e dead-lock. \sa unlock() */ @@ -140,9 +140,6 @@ void QBasicMutex::destroyInternal(void *ptr) If the lock was obtained, the mutex must be unlocked with unlock() before another thread can successfully lock it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. - \sa lock(), unlock() */ @@ -157,9 +154,6 @@ void QBasicMutex::destroyInternal(void *ptr) If the lock was obtained, the mutex must be unlocked with unlock() before another thread can successfully lock it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. - \sa lock(), unlock() */ @@ -172,9 +166,6 @@ void QBasicMutex::destroyInternal(void *ptr) If the lock was obtained, the mutex must be unlocked with unlock() before another thread can successfully lock it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. - \sa lock(), unlock() */ @@ -202,9 +193,6 @@ void QBasicMutex::destroyInternal(void *ptr) If the lock was obtained, the mutex must be unlocked with unlock() before another thread can successfully lock it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. - \sa lock(), unlock() */ @@ -222,9 +210,6 @@ void QBasicMutex::destroyInternal(void *ptr) If the lock was obtained, the mutex must be unlocked with unlock() before another thread can successfully lock it. - Calling this function multiple times on the same mutex from the - same thread will cause a \e dead-lock. - \sa lock(), unlock() */ diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 42011993243..43b16cd0f4f 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -405,13 +405,16 @@ static int fromOffsetString(QStringView offsetString, bool *valid) noexcept \section2 Range of Valid Dates - Dates are stored internally as a Julian Day number, an integer count of - every day in a contiguous range, with 24 November 4714 BCE in the Gregorian - calendar being Julian Day 0 (1 January 4713 BCE in the Julian calendar). - As well as being an efficient and accurate way of storing an absolute date, - it is suitable for converting a date into other calendar systems such as - Hebrew, Islamic or Chinese. The Julian Day number can be obtained using - QDate::toJulianDay() and can be set using QDate::fromJulianDay(). + Dates are stored internally as a modified Julian Day number, an integer + count of every day in a contiguous range, with 24 November 4714 BCE in the + Gregorian calendar being Julian Day 0 (1 January 4713 BCE in the Julian + calendar). As well as being an efficient and accurate way of storing an + absolute date, it is suitable for converting a date into other calendar + systems such as Hebrew, Islamic or Chinese. For the purposes of QDate, + Julian Days are delimited at midnight and, for those of QDateTime, in the + zone used by the datetime. (This departs from the formal definition, which + delimits Julian Days at UTC noon.) The Julian Day number can be obtained + using QDate::toJulianDay() and can be set using QDate::fromJulianDay(). The range of Julian Day numbers that QDate can represent is, for technical reasons, limited to between -784350574879 and 784354017364, which means from 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/qatomicscopedvaluerollback.h b/src/corelib/tools/qatomicscopedvaluerollback.h index 8f653acba5e..929a2e2d466 100644 --- a/src/corelib/tools/qatomicscopedvaluerollback.h +++ b/src/corelib/tools/qatomicscopedvaluerollback.h @@ -11,6 +11,7 @@ #include <QtCore/qtconfigmacros.h> #include <atomic> +#include <type_traits> QT_BEGIN_NAMESPACE @@ -122,6 +123,33 @@ template <typename T> QAtomicScopedValueRollback(QBasicAtomicPointer<T> &, std::memory_order) -> QAtomicScopedValueRollback<T*>; +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T>, bool> = true> +QAtomicScopedValueRollback(std::atomic<T>&, V) + -> QAtomicScopedValueRollback<T>; +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T>, bool> = true> +QAtomicScopedValueRollback(std::atomic<T>&, V, std::memory_order) + -> QAtomicScopedValueRollback<T>; + +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T>, bool> = true> +QAtomicScopedValueRollback(QBasicAtomicInteger<T>&, V) + -> QAtomicScopedValueRollback<T>; +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T>, bool> = true> +QAtomicScopedValueRollback(QBasicAtomicInteger<T>&, V, std::memory_order) + -> QAtomicScopedValueRollback<T>; + +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T*>, bool> = true> +QAtomicScopedValueRollback(QBasicAtomicPointer<T>&, V) + -> QAtomicScopedValueRollback<T*>; +template <typename T, typename V, + std::enable_if_t<std::is_convertible_v<V, T*>, bool> = true> +QAtomicScopedValueRollback(QBasicAtomicPointer<T>&, V, std::memory_order) + -> QAtomicScopedValueRollback<T*>; + QT_END_NAMESPACE #endif // QATOMICASCOPEDVALUEROLLBACK_H diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h index 5c12332aa4a..ecefd1f55df 100644 --- a/src/corelib/tools/qfreelist_p.h +++ b/src/corelib/tools/qfreelist_p.h @@ -199,27 +199,27 @@ inline typename QFreeList<T, ConstantsType>::ReferenceType QFreeList<T, Constant template <typename T, typename ConstantsType> inline int QFreeList<T, ConstantsType>::next() { - int id, newid, at; - ElementType *v; + int newid; + int id = _next.loadAcquire(); do { - id = _next.loadAcquire(); - - at = id & ConstantsType::IndexMask; + int at = id & ConstantsType::IndexMask; const int block = blockfor(at); - v = _v[block].loadAcquire(); + ElementType *v = _v[block].loadAcquire(); if (!v) { - v = allocate((id & ConstantsType::IndexMask) - at, ConstantsType::Sizes[block]); - if (!_v[block].testAndSetRelease(nullptr, v)) { + ElementType* const alloced = allocate((id & ConstantsType::IndexMask) - at, + ConstantsType::Sizes[block]); + if (_v[block].testAndSetRelease(nullptr, alloced, v)) { + v = alloced; + } else { // race with another thread lost - delete[] v; - v = _v[block].loadAcquire(); + delete[] alloced; Q_ASSERT(v != nullptr); } } newid = v[at].next.loadRelaxed() | (id & ~ConstantsType::IndexMask); - } while (!_next.testAndSetRelease(id, newid)); + } while (!_next.testAndSetOrdered(id, newid, id)); // qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)", // id & ConstantsType::IndexMask, // newid & ConstantsType::IndexMask, @@ -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/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h index cbe217db11e..3e44f5f3442 100644 --- a/src/corelib/tools/qhashfunctions.h +++ b/src/corelib/tools/qhashfunctions.h @@ -298,19 +298,32 @@ bool qHashEquals(const T1 &a, const T2 &b) } namespace QtPrivate { -template <typename Mixer> struct QHashCombiner : private Mixer +template <typename Mixer> struct QHashCombinerWithSeed : private Mixer { - using result_type = typename Mixer::result_type ; + using result_type = typename Mixer::result_type; + size_t seed; + constexpr QHashCombinerWithSeed(result_type s) noexcept : seed(s) {} + + template <typename T> + constexpr result_type operator()(result_type result, const T &t) const + noexcept(noexcept(qHash(t, seed))) + { + return Mixer::operator()(result, qHash(t, seed)); + } +}; #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) - // Qt 6.x didn't use to pass the seed; bootstrap has no seed +// Earlier Qt 6.x versions of qHashMulti() failed to pass the seed as the seed +// argument of qHash(), so this class exists for compatibility with user and +// inline code that relies on the old behavior. For Qt 7, we'll replace with +// the above version, except for the bootstrapped tools (which have no seed). +template <typename Mixer> struct QHashCombiner : private Mixer +{ + using result_type = typename Mixer::result_type; + static constexpr size_t seed = 0; constexpr QHashCombiner(result_type) noexcept {} Q_DECL_DEPRECATED_X("pass the seed argument") constexpr QHashCombiner() noexcept {} -#else - size_t seed; - constexpr QHashCombiner(result_type s) : seed(s) noexcept {} -#endif template <typename T> constexpr result_type operator()(result_type result, const T &t) const @@ -319,6 +332,9 @@ template <typename Mixer> struct QHashCombiner : private Mixer return Mixer::operator()(result, qHash(t, seed)); } }; +#else +template <typename Mixer> using QHashCombiner = QHashCombinerWithSeed<Mixer>; +#endif struct QHashCombineMixer { @@ -330,6 +346,7 @@ struct QHashCombineMixer } }; using QHashCombine = QHashCombiner<QHashCombineMixer>; +using QHashCombineWithSeed = QHashCombinerWithSeed<QHashCombineMixer>; struct QHashCombineCommutativeMixer : std::plus<size_t> { @@ -341,6 +358,7 @@ struct QHashCombineCommutativeMixer : std::plus<size_t> typedef size_t result_type; }; using QHashCombineCommutative = QHashCombiner<QHashCombineCommutativeMixer>; +using QHashCombineCommutativeWithSeed = QHashCombinerWithSeed<QHashCombineCommutativeMixer>; template <typename... T> using QHashMultiReturnType = decltype( diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index ed17dddbcf5..4c9736dea6d 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -6,6 +6,7 @@ #include <qcoreapplication.h> #include <qelapsedtimer.h> +#include <private/qlatch_p.h> #include <qloggingcategory.h> #include <qmetaobject.h> #include <qobject.h> @@ -1530,8 +1531,8 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) ObjectTreeNode result; int usedLength; QThread *objThread = nullptr; - QSemaphore sem; - bool semWait; + QLatch latch(1); + bool latchWait; { QDBusReadLocker locker(HandleObjectCallAction, this); @@ -1569,16 +1570,16 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) // synchronize with it postEventToThread(HandleObjectCallPostEventAction, result.obj, new QDBusActivateObjectEvent(QDBusConnection(this), this, result, - usedLength, msg, &sem)); - semWait = true; + usedLength, msg, &latch)); + latchWait = true; } else { // looped-back message, targeting current thread - semWait = false; + latchWait = false; } } // release the lock - if (semWait) - SEM_ACQUIRE(HandleObjectCallSemaphoreAction, sem); + if (latchWait) + latch.wait(); else activateObject(result, msg, usedLength); } diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h index 9c5fa1b061f..ac9adf02100 100644 --- a/src/dbus/qdbusintegrator_p.h +++ b/src/dbus/qdbusintegrator_p.h @@ -107,8 +107,8 @@ class QDBusActivateObjectEvent: public QAbstractMetaCallEvent public: QDBusActivateObjectEvent(const QDBusConnection &c, QObject *sender, const QDBusConnectionPrivate::ObjectTreeNode &n, - int p, const QDBusMessage &m, QSemaphore *s = nullptr) - : QAbstractMetaCallEvent(sender, -1, s), connection(c), node(n), + int p, const QDBusMessage &m, QLatch *l = nullptr) + : QAbstractMetaCallEvent(sender, -1, l), connection(c), node(n), pathStartPos(p), message(m), handled(false) { } ~QDBusActivateObjectEvent() override; diff --git a/src/dbus/qdbusthreaddebug_p.h b/src/dbus/qdbusthreaddebug_p.h index a1d3a420ec6..bcbd1efb494 100644 --- a/src/dbus/qdbusthreaddebug_p.h +++ b/src/dbus/qdbusthreaddebug_p.h @@ -129,25 +129,5 @@ struct QDBusWriteLocker: QDBusLockerBase } }; -#if QDBUS_THREAD_DEBUG -# define SEM_ACQUIRE(action, sem) \ - do { \ - QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::BeforeAcquire, this); \ - sem.acquire(); \ - QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::AfterAcquire, this); \ - } while (false) - -# define SEM_RELEASE(action, sem) \ - do { \ - QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::BeforeRelease, that); \ - sem.release(); \ - QDBusLockerBase::reportThreadAction(action, QDBusLockerBase::AfterRelease, that); \ - } while (false) - -#else -# define SEM_ACQUIRE(action, sem) sem.acquire() -# define SEM_RELEASE(action, sem) sem.release() -#endif - #endif // QT_NO_DBUS #endif 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/compat/removed_api.cpp b/src/gui/compat/removed_api.cpp index 6a39d8b8615..33549a06504 100644 --- a/src/gui/compat/removed_api.cpp +++ b/src/gui/compat/removed_api.cpp @@ -88,3 +88,16 @@ void QWindowSystemInterface::handleContextMenuEvent(QWindow *window, bool mouseT // order sections alphabetically #endif // QT_GUI_REMOVED_SINCE(6, 8) + +#if QT_GUI_REMOVED_SINCE(6, 11) + +#include "qpainter.h" // inlined API + +#include "qquaternion.h" // inlined API + + +// #include "qotherheader.h" +// // implement removed functions from qotherheader.h +// order sections alphabetically + +#endif // QT_GUI_REMOVED_SINCE(6, 11) diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 840bff26e53..1413e611270 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -38,7 +38,7 @@ #include <private/qfont_p.h> #if QT_CONFIG(qtgui_threadpool) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qthreadpool_p.h> #endif @@ -5342,17 +5342,17 @@ void QImage::applyColorTransform(const QColorTransform &transform) segments = std::min(segments, height()); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (height() - y) / (segments - i); threadPool->start([&, y, yn]() { transformSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); } else #endif transformSegment(0, height()); @@ -5832,17 +5832,17 @@ QImage QImage::colorTransformed(const QColorTransform &transform, QImage::Format segments = std::min(segments, height()); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (height() - y) / (segments - i); threadPool->start([&, y, yn]() { transformSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); } else #endif transformSegment(0, height()); diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index 43f3cca09e0..521d71796ea 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -14,7 +14,7 @@ #include <qendian.h> #include <qrgbafloat.h> #if QT_CONFIG(thread) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qthreadpool_p.h> #endif @@ -215,17 +215,17 @@ void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversio if (segments <= 1 || !threadPool || threadPool->contains(QThread::currentThread())) return convertSegment(0, src->height); - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (src->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); #else convertSegment(0, src->height); #endif @@ -270,17 +270,17 @@ void convert_generic_over_rgb64(QImageData *dest, const QImageData *src, Qt::Ima if (segments <= 1 || !threadPool || threadPool->contains(QThread::currentThread())) return convertSegment(0, src->height); - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (src->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); #else convertSegment(0, src->height); #endif @@ -324,17 +324,17 @@ void convert_generic_over_rgba32f(QImageData *dest, const QImageData *src, Qt::I if (segments <= 1 || !threadPool || threadPool->contains(QThread::currentThread())) return convertSegment(0, src->height); - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (src->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); #else convertSegment(0, src->height); #endif @@ -435,17 +435,17 @@ bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::Im segments = std::min(segments, data->height); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (data->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); if (data->bytes_per_line != params.bytesPerLine) { // Compress segments to a continuous block y = 0; @@ -529,17 +529,17 @@ bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_for segments = std::min(segments, data->height); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (data->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); if (data->bytes_per_line != params.bytesPerLine) { // Compress segments to a continuous block y = 0; @@ -624,17 +624,17 @@ bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_f segments = std::min(segments, data->height); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (data->height - y) / (segments - i); threadPool->start([&, y, yn]() { convertSegment(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); if (data->bytes_per_line != params.bytesPerLine) { // Compress segments to a continuous block y = 0; 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/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp index c6462dfed7b..6da0c4d387b 100644 --- a/src/gui/kernel/qguivariant.cpp +++ b/src/gui/kernel/qguivariant.cpp @@ -52,14 +52,13 @@ QT_BEGIN_NAMESPACE namespace { - -// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class struct QVariantGuiHelper : QMetaTypeModuleHelper { #define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \ QT_METATYPE_INTERFACE_INIT(RealName), - const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override { + static const QtPrivate::QMetaTypeInterface *interfaceForType(int type) + { switch (type) { QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE) default: return nullptr; @@ -67,7 +66,7 @@ struct QVariantGuiHelper : QMetaTypeModuleHelper } #undef QT_IMPL_METATYPEINTERFACE_GUI_TYPES - bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override + static bool convert(const void *from, int fromTypeId, void *to, int toTypeId) { Q_ASSERT(fromTypeId != toTypeId); @@ -133,14 +132,14 @@ struct QVariantGuiHelper : QMetaTypeModuleHelper return false; } }; - -static constexpr QVariantGuiHelper qVariantGuiHelper; - } // namespace used to hide QVariant handler void qRegisterGuiVariant() { - qMetaTypeGuiHelper = &qVariantGuiHelper; + qMetaTypeGuiHelper = QMetaTypeModuleHelper{ + &QVariantGuiHelper::interfaceForType, + &QVariantGuiHelper::convert, + }; } Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant) diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index afe6de35305..caf4cb7fe5b 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -34,6 +34,12 @@ QT_BEGIN_NAMESPACE \note Both physical and logical DPI are expressed in device-independent dots. Multiply by QScreen::devicePixelRatio() to get device-dependent density. + To obtain a QScreen object, use QGuiApplication::primaryScreen() for the + primary screen, or QGuiApplication::screens() to get a list of all screens. + + \sa QGuiApplication::primaryScreen() + \sa QGuiApplication::screens() + \inmodule QtGui */ 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..99061fb7163 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 @@ -547,7 +557,7 @@ QQuaternion QQuaternion::fromEulerAngles(float pitch, float yaw, float roll) \note If this quaternion is not normalized, the resulting rotation matrix will contain scaling information. - \sa fromRotationMatrix(), getAxes() + \sa fromRotationMatrix(), toAxes() */ QMatrix3x3 QQuaternion::toRotationMatrix() 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() @@ -630,23 +640,71 @@ QQuaternion QQuaternion::fromRotationMatrix(const QMatrix3x3 &rot3x3) #ifndef QT_NO_VECTOR3D /*! - \since 5.5 + \since 6.11 + \class QQuaternion::Axes + \ingroup painting-3D + \inmodule QtGui - Returns the 3 orthonormal axes (\a xAxis, \a yAxis, \a zAxis) defining the quaternion. + A struct containing the three orthonormal axes that define a + \l{QQuaternion}{quaternion}. - \sa fromAxes(), toRotationMatrix() + + \sa QQuaternion::toAxes(), QQuaternion::fromAxes(Axes) +*/ + +/*! + \variable QQuaternion::Axes::x + + The x orthonormal axis that, together with \l{y} and \l{z}, defines a + quaternion. +*/ + +/*! + \variable QQuaternion::Axes::y + + The y orthonormal axis that, together with \l{x} and \l{z}, defines a + quaternion. +*/ + +/*! + \variable QQuaternion::Axes::z + + The z orthonormal axis that, together with \l{x} and \l{y}, defines a + quaternion. */ -void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const -{ - Q_ASSERT(xAxis && yAxis && zAxis); +/*! + \since 6.11 + + Returns the three orthonormal axes that define this quaternion. + + \sa QQuaternion::Axes, fromAxes(QQuaternion::Axes), toRotationMatrix() +*/ +auto QQuaternion::toAxes() const -> Axes +{ const QMatrix3x3 rot3x3(toRotationMatrix()); - *xAxis = QVector3D(rot3x3(0, 0), rot3x3(1, 0), rot3x3(2, 0)); - *yAxis = QVector3D(rot3x3(0, 1), rot3x3(1, 1), rot3x3(2, 1)); - *zAxis = QVector3D(rot3x3(0, 2), rot3x3(1, 2), rot3x3(2, 2)); + return { {rot3x3(0, 0), rot3x3(1, 0), rot3x3(2, 0)}, + {rot3x3(0, 1), rot3x3(1, 1), rot3x3(2, 1)}, + {rot3x3(0, 2), rot3x3(1, 2), rot3x3(2, 2)} }; } + +/*! + \fn void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const + \since 5.5 + + \obsolete + Use toAxes() instead. + + 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() +*/ + /*! \since 5.5 @@ -654,7 +712,7 @@ void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) \note The axes are assumed to be orthonormal. - \sa getAxes(), fromRotationMatrix() + \sa toAxes(), fromRotationMatrix() */ QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis) { @@ -673,6 +731,17 @@ QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis } /*! + \since 6.11 + \overload + + \sa toAxes(), fromRotationMatrix() +*/ +QQuaternion QQuaternion::fromAxes(Axes axes) // clazy:exclude=function-args-by-ref +{ + return fromAxes(axes.x, axes.y, axes.z); +} + +/*! \since 5.5 Constructs the quaternion using specified forward direction \a direction diff --git a/src/gui/math3d/qquaternion.h b/src/gui/math3d/qquaternion.h index 7fb153063c5..ffc95a852ce 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); @@ -118,7 +118,14 @@ QT_WARNING_POP QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromRotationMatrix(const QMatrix3x3 &rot3x3); #ifndef QT_NO_VECTOR3D - QT7_ONLY(Q_GUI_EXPORT) void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const; + struct Axes + { + QVector3D x, y, z; + }; + QT7_ONLY(Q_GUI_EXPORT) Axes toAxes() const; + QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromAxes(Axes axes); // clazy:exclude=function-args-by-ref + QT_GUI_INLINE_SINCE(6, 11) + void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const; QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis); @@ -311,24 +318,37 @@ 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(angles.x(), angles.y(), angles.z()); +} + +#if QT_GUI_INLINE_IMPL_SINCE(6, 11) +void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const { - return QQuaternion::fromEulerAngles(eulerAngles.x(), eulerAngles.y(), eulerAngles.z()); + Q_PRE(xAxis); + Q_PRE(yAxis); + Q_PRE(zAxis); + const Axes axes = toAxes(); + *xAxis = axes.x; + *yAxis = axes.y; + *zAxis = axes.z; } +#endif // QT_GUI_INLINE_IMPL_SINCE(6, 11) #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/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 8aefba86ee7..b109e9a5a20 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -28,7 +28,7 @@ #include <qmath.h> #if QT_CONFIG(qtgui_threadpool) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qthreadpool_p.h> #endif @@ -3970,17 +3970,17 @@ static void spanfill_from_first(QRasterBuffer *rasterBuffer, QPixelLayout::BPP b QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); \ if (segments > 1 && qPixelLayouts[data->rasterBuffer->format].bpp >= QPixelLayout::BPP8 \ && threadPool && !threadPool->contains(QThread::currentThread())) { \ - QSemaphore semaphore; \ + QLatch latch(segments); \ int c = 0; \ for (int i = 0; i < segments; ++i) { \ int cn = (count - c) / (segments - i); \ threadPool->start([&, c, cn]() { \ function(c, c + cn); \ - semaphore.release(1); \ + latch.countDown(); \ }, 1); \ c += cn; \ } \ - semaphore.acquire(segments); \ + latch.wait(); \ } else \ function(0, count) #else diff --git a/src/gui/painting/qimagescale.cpp b/src/gui/painting/qimagescale.cpp index 1bbfcf07a0a..15ef5f57dc7 100644 --- a/src/gui/painting/qimagescale.cpp +++ b/src/gui/painting/qimagescale.cpp @@ -11,7 +11,7 @@ #include "qrgbafloat.h" #if QT_CONFIG(qtgui_threadpool) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qguiapplication_p.h> #include <private/qthreadpool_p.h> @@ -290,17 +290,17 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con segments = std::min(segments, dh); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (dh - y) / (segments - i); threadPool->start([&, y, yn]() { scaleSection(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); return; } #else diff --git a/src/gui/painting/qimagescale_neon.cpp b/src/gui/painting/qimagescale_neon.cpp index 1fc1070dc0d..81e04e8f082 100644 --- a/src/gui/painting/qimagescale_neon.cpp +++ b/src/gui/painting/qimagescale_neon.cpp @@ -7,7 +7,7 @@ #include <private/qsimd_p.h> #if QT_CONFIG(qtgui_threadpool) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qguiapplication_p.h> #include <private/qthreadpool_p.h> @@ -27,17 +27,17 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con segments = std::min(segments, dh); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch semaphore(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (dh - y) / (segments - i); threadPool->start([&, y, yn]() { scaleSection(y, y + yn); - semaphore.release(1); + semaphore.countDown(); }); y += yn; } - semaphore.acquire(segments); + semaphore.wait(); return; } #endif diff --git a/src/gui/painting/qimagescale_sse4.cpp b/src/gui/painting/qimagescale_sse4.cpp index 5d4c3a4e7c2..740f1570345 100644 --- a/src/gui/painting/qimagescale_sse4.cpp +++ b/src/gui/painting/qimagescale_sse4.cpp @@ -7,7 +7,7 @@ #include <private/qsimd_p.h> #if QT_CONFIG(qtgui_threadpool) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #include <qthreadpool.h> #include <private/qguiapplication_p.h> #include <private/qthreadpool_p.h> @@ -27,17 +27,17 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con segments = std::min(segments, dh); QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool(); if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) { - QSemaphore semaphore; + QLatch latch(segments); int y = 0; for (int i = 0; i < segments; ++i) { int yn = (dh - y) / (segments - i); threadPool->start([&, y, yn]() { scaleSection(y, y + yn); - semaphore.release(1); + latch.countDown(); }); y += yn; } - semaphore.acquire(segments); + latch.wait(); return; } #endif 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/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 5013e96f740..344bb8f1bef 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -41,6 +41,8 @@ #include <private/qrawfont_p.h> #include <private/qfont_p.h> +#include <QtCore/private/qtclasshelper_p.h> + QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; @@ -3652,6 +3654,8 @@ void QPainter::setPen(const QColor &color) } /*! + \fn void QPainter::setPen(const QPen &pen) + Sets the painter's pen to be the given \a pen. The \a pen defines how to draw lines and outlines, and it also @@ -3660,7 +3664,13 @@ void QPainter::setPen(const QColor &color) \sa pen(), {QPainter#Settings}{Settings} */ -void QPainter::setPen(const QPen &pen) +/*! + \fn void QPainter::setPen(QPen &&pen) + \since 6.11 + \overload +*/ + +void QPainter::doSetPen(const QPen &pen, QPen *rvalue) { #ifdef QT_DEBUG_DRAW @@ -3677,7 +3687,7 @@ void QPainter::setPen(const QPen &pen) if (d->state->pen == pen) return; - d->state->pen = pen; + q_choose_assign(d->state->pen, pen, rvalue); if (d->extended) { d->checkEmulation(); @@ -3733,6 +3743,8 @@ const QPen &QPainter::pen() const /*! + \fn void QPainter::setBrush(const QBrush &brush) + Sets the painter's brush to the given \a brush. The painter's brush defines how shapes are filled. @@ -3740,7 +3752,13 @@ const QPen &QPainter::pen() const \sa brush(), {QPainter#Settings}{Settings} */ -void QPainter::setBrush(const QBrush &brush) +/*! + \fn void QPainter::setBrush(QBrush &&brush) + \since 6.11 + \overload +*/ + +void QPainter::doSetBrush(const QBrush &brush, QBrush *rvalue) { #ifdef QT_DEBUG_DRAW if constexpr (qt_show_painter_debug_output) @@ -3756,13 +3774,13 @@ void QPainter::setBrush(const QBrush &brush) return; if (d->extended) { - d->state->brush = brush; + q_choose_assign(d->state->brush, brush, rvalue); d->checkEmulation(); d->extended->brushChanged(); return; } - d->state->brush = brush; + q_choose_assign(d->state->brush, brush, rvalue); d->state->dirtyFlags |= QPaintEngine::DirtyBrush; } diff --git a/src/gui/painting/qpainter.h b/src/gui/painting/qpainter.h index 3c09b632364..83bde3b8cad 100644 --- a/src/gui/painting/qpainter.h +++ b/src/gui/painting/qpainter.h @@ -150,11 +150,15 @@ public: QFontInfo fontInfo() const; void setPen(const QColor &color); + QT_GUI_INLINE_SINCE(6, 11) void setPen(const QPen &pen); + void setPen(QPen &&pen) { doSetPen(pen, &pen); } void setPen(Qt::PenStyle style); const QPen &pen() const; + QT_GUI_INLINE_SINCE(6, 11) void setBrush(const QBrush &brush); + void setBrush(QBrush &&brush) { doSetBrush(brush, &brush); } void setBrush(Qt::BrushStyle style); void setBrush(QColor color); void setBrush(Qt::GlobalColor color) { setBrush(QColor(color)); } @@ -419,6 +423,9 @@ public: private: Q_DISABLE_COPY(QPainter) + void doSetPen(const QPen &lvalue, QPen *rvalue); + void doSetBrush(const QBrush &lvalue, QBrush *rvalue); + std::unique_ptr<QPainterPrivate> d_ptr; friend class QWidget; @@ -700,6 +707,21 @@ inline void QPainter::fillRect(const QRectF &r, QGradient::Preset p) fillRect(r, QGradient(p)); } +#if QT_GUI_INLINE_IMPL_SINCE(6, 11) + +void QPainter::setPen(const QPen &p) +{ + doSetPen(p, nullptr); +} + +void QPainter::setBrush(const QBrush &b) +{ + doSetBrush(b, nullptr); +} + +#endif // QT_GUI_INLINE_IMPL_SINCE(6, 11) + + inline void QPainter::setBrushOrigin(int x, int y) { setBrushOrigin(QPoint(x, y)); diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp index 66f1cf2a985..148d40b8361 100644 --- a/src/gui/painting/qtransform.cpp +++ b/src/gui/painting/qtransform.cpp @@ -784,7 +784,7 @@ bool QTransform::operator==(const QTransform &o) const */ size_t qHash(const QTransform &key, size_t seed) noexcept { - QtPrivate::QHashCombine hash(seed); + QtPrivate::QHashCombineWithSeed hash(seed); seed = hash(seed, key.m11()); seed = hash(seed, key.m12()); seed = hash(seed, key.m21()); diff --git a/src/gui/platform/darwin/qapplefileiconengine.mm b/src/gui/platform/darwin/qapplefileiconengine.mm index f1ba6319d0a..594fdf23b60 100644 --- a/src/gui/platform/darwin/qapplefileiconengine.mm +++ b/src/gui/platform/darwin/qapplefileiconengine.mm @@ -10,6 +10,7 @@ # include <UIKit/UIKit.h> #endif +#include <QtCore/qurl.h> #include <QtGui/private/qcoregraphics_p.h> QT_BEGIN_NAMESPACE diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index b9312f6b304..7a3d4974e53 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -6543,7 +6543,7 @@ bool operator!=(const QRhiShaderResourceBinding &a, const QRhiShaderResourceBind size_t qHash(const QRhiShaderResourceBinding &b, size_t seed) noexcept { const QRhiShaderResourceBinding::Data *d = QRhiImplementation::shaderResourceBindingData(b); - QtPrivate::QHashCombine hash(seed); + QtPrivate::QHashCombineWithSeed hash(seed); seed = hash(seed, d->binding); seed = hash(seed, d->stage); seed = hash(seed, d->type); diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp index 5e967c62e40..1234d01b6ec 100644 --- a/src/gui/rhi/qshader.cpp +++ b/src/gui/rhi/qshader.cpp @@ -812,7 +812,7 @@ bool operator==(const QShader &lhs, const QShader &rhs) noexcept size_t qHash(const QShader &s, size_t seed) noexcept { if (s.d) { - QtPrivate::QHashCombine hash(seed); + QtPrivate::QHashCombineWithSeed hash(seed); seed = hash(seed, s.stage()); if (!s.d->shaders.isEmpty()) { seed = hash(seed, s.d->shaders.firstKey()); 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/qfontdatabase_p.h b/src/gui/text/qfontdatabase_p.h index 4cd6996aab8..27fb34aecdd 100644 --- a/src/gui/text/qfontdatabase_p.h +++ b/src/gui/text/qfontdatabase_p.h @@ -51,7 +51,7 @@ inline bool operator!=(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacks inline size_t qHash(const QtFontFallbacksCacheKey &key, size_t seed = 0) noexcept { - QtPrivate::QHashCombine hash(seed); + QtPrivate::QHashCombineWithSeed hash(seed); seed = hash(seed, key.family); seed = hash(seed, int(key.style)); seed = hash(seed, int(key.styleHint)); 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/network/kernel/qnetworkproxy_libproxy.cpp b/src/network/kernel/qnetworkproxy_libproxy.cpp index da1e8fdbd4a..b17d46ea96a 100644 --- a/src/network/kernel/qnetworkproxy_libproxy.cpp +++ b/src/network/kernel/qnetworkproxy_libproxy.cpp @@ -10,6 +10,7 @@ #include <QtCore/QMutex> #include <QtCore/QSemaphore> #include <QtCore/QUrl> +#include <QtCore/private/qlatch_p.h> #include <QtCore/private/qeventdispatcher_unix_p.h> #include <QtCore/private/qthread_p.h> #include <QtCore/qapplicationstatic.h> @@ -61,7 +62,7 @@ private: // we leave the conversion to/from QUrl to the calling thread const char *url; char **proxies; - QSemaphore replyReady; + QLatch replyReady{1}; }; void run() override; @@ -119,7 +120,7 @@ QList<QUrl> QLibProxyWrapper::getProxies(const QUrl &url) requestReady.release(); // wait for the reply - data.replyReady.acquire(); + data.replyReady.wait(); } else { // non-threaded mode data.proxies = px_proxy_factory_get_proxies(factory, data.url); @@ -147,7 +148,7 @@ void QLibProxyWrapper::run() if (isInterruptionRequested()) break; request->proxies = px_proxy_factory_get_proxies(factory, request->url); - request->replyReady.release(); + request->replyReady.countDown(); } px_proxy_factory_free(factory); diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index 6949eec9560..b78d2829704 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -822,6 +822,12 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const recvResult = getsockopt(socketDescriptor, SOL_SOCKET, SO_NREAD, &value, &valuelen); if (recvResult != -1) recvResult = value; +#elif defined(Q_OS_VXWORKS) + // VxWorks: use ioctl(FIONREAD) to query the number of bytes available + int available = 0; + int ioctlResult = ::ioctl(socketDescriptor, FIONREAD, &available); + if (ioctlResult != -1) + recvResult = available; #else // We need to grow the buffer to fit the entire datagram. // We start at 1500 bytes (the MTU for Ethernet V2), which should catch 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/CMakeLists.txt b/src/plugins/platforms/CMakeLists.txt index f30c27c24be..498a0772bc9 100644 --- a/src/plugins/platforms/CMakeLists.txt +++ b/src/plugins/platforms/CMakeLists.txt @@ -4,10 +4,10 @@ if(ANDROID) add_subdirectory(android) endif() -if(NOT ANDROID AND NOT WASM) +if(NOT WASM) add_subdirectory(minimal) endif() -if(QT_FEATURE_freetype AND NOT ANDROID AND NOT WASM) +if(QT_FEATURE_freetype AND NOT WASM) add_subdirectory(offscreen) endif() if(QT_FEATURE_xcb) 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..59265daa127 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp @@ -10,6 +10,7 @@ #include <private/qeglfskmsintegration_p.h> #include <QtCore/QLoggingCategory> +#include <QtCore/qtimer.h> #include <QtCore/private/qcore_unix_p.h> #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0]) @@ -113,13 +114,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 +142,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 +156,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/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 38b3bdadd35..3fe837a2c03 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -1219,6 +1219,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow(). if (platformWindow->window()->flags() & Qt::WindowDoesNotAcceptFocus) return false; + [[fallthrough]]; case QtWindows::FocusOutEvent: handleFocusEvent(et, platformWindow); return true; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 81a3f1d37b7..a4bb59cf42c 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1191,6 +1191,11 @@ QMargins QWindowsGeometryHint::frame(const QWindow *w, const QRect &geometry, bool QWindowsGeometryHint::handleCalculateSize(const QWindow *window, const QMargins &customMargins, const MSG &msg, LRESULT *result) { + // Prevent adding any border for frameless window + if (msg.wParam && window->flags() & Qt::FramelessWindowHint) { + *result = 0; + return true; + } // Return 0 to remove the window's border const bool clientAreaExpanded = window->flags() & Qt::ExpandedClientAreaHint; if (msg.wParam && clientAreaExpanded) { diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index 7179109505b..e2e4fce357e 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -1662,128 +1662,123 @@ 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)) { - QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); - QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget); - QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, 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); - // draw the background - proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget); + // draw the background + proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget); - const QRect &rect = vopt->rect; - const bool isRtl = option->direction == Qt::RightToLeft; - bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne || - vopt->viewItemPosition == QStyleOptionViewItem::Invalid; - bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning; - bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End; + const QRect &rect = vopt->rect; + const bool isRtl = option->direction == Qt::RightToLeft; + bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne || + vopt->viewItemPosition == QStyleOptionViewItem::Invalid; + bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning; + bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End; - // the tree decoration already painted the left side of the rounded rect - if (vopt->features.testFlag(QStyleOptionViewItem::IsDecoratedRootColumn) && - vopt->showDecorationSelected) { - isFirst = false; - if (onlyOne) { - onlyOne = false; - isLast = true; - } + // the tree decoration already painted the left side of the rounded rect + if (vopt->features.testFlag(QStyleOptionViewItem::IsDecoratedRootColumn) && + vopt->showDecorationSelected) { + isFirst = false; + if (onlyOne) { + onlyOne = false; + isLast = true; } + } - if (isRtl) { - if (isFirst) { - isFirst = false; - isLast = true; - } else if (isLast) { - isFirst = true; - isLast = false; - } + if (isRtl) { + if (isFirst) { + isFirst = false; + isLast = true; + } else if (isLast) { + isFirst = true; + isLast = false; } - const bool highlightCurrent = vopt->state.testAnyFlags(State_Selected | State_MouseOver); - if (highlightCurrent) { - const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget); - if (highContrastTheme) - painter->setBrush(vopt->palette.highlight()); - else - painter->setBrush(view->alternatingRowColors() ? vopt->palette.highlight() : WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); - QWidget *editorWidget = view ? view->indexWidget(view->currentIndex()) : nullptr; - if (editorWidget) { - QPalette pal = editorWidget->palette(); - QColor editorBgColor = vopt->backgroundBrush == Qt::NoBrush ? vopt->palette.color(widget->backgroundRole()) : vopt->backgroundBrush.color(); - editorBgColor.setAlpha(255); - pal.setColor(editorWidget->backgroundRole(), editorBgColor); - editorWidget->setPalette(pal); - } - } else { - painter->setBrush(vopt->backgroundBrush); + } + const bool highlightCurrent = vopt->state.testAnyFlags(State_Selected | State_MouseOver); + if (highlightCurrent) { + const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget); + if (highContrastTheme) + painter->setBrush(vopt->palette.highlight()); + else + painter->setBrush(view->alternatingRowColors() ? vopt->palette.highlight() : WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); + QWidget *editorWidget = view ? view->indexWidget(view->currentIndex()) : nullptr; + if (editorWidget) { + QPalette pal = editorWidget->palette(); + QColor editorBgColor = vopt->backgroundBrush == Qt::NoBrush ? vopt->palette.color(widget->backgroundRole()) : vopt->backgroundBrush.color(); + editorBgColor.setAlpha(255); + pal.setColor(editorWidget->backgroundRole(), editorBgColor); + editorWidget->setPalette(pal); } - painter->setPen(Qt::NoPen); + } else { + painter->setBrush(vopt->backgroundBrush); + } + painter->setPen(Qt::NoPen); - if (onlyOne) { - painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)), - secondLevelRoundingRadius, secondLevelRoundingRadius); - } else if (isFirst) { - painter->save(); - painter->setClipRect(rect); - painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)), - secondLevelRoundingRadius, secondLevelRoundingRadius); - painter->restore(); - } else if (isLast) { - painter->save(); - painter->setClipRect(rect); - painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)), - secondLevelRoundingRadius, secondLevelRoundingRadius); - painter->restore(); - } else { - painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2))); - } + if (onlyOne) { + painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)), + secondLevelRoundingRadius, secondLevelRoundingRadius); + } else if (isFirst) { + painter->save(); + painter->setClipRect(rect); + painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)), + secondLevelRoundingRadius, secondLevelRoundingRadius); + painter->restore(); + } else if (isLast) { + painter->save(); + painter->setClipRect(rect); + painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)), + secondLevelRoundingRadius, secondLevelRoundingRadius); + painter->restore(); + } else { + painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2))); + } - // draw the check mark - if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) { - QStyleOptionViewItem option(*vopt); - option.rect = checkRect; - option.state = option.state & ~QStyle::State_HasFocus; + // draw the check mark + if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) { + QStyleOptionViewItem option(*vopt); + option.rect = checkRect; + option.state = option.state & ~QStyle::State_HasFocus; - switch (vopt->checkState) { - case Qt::Unchecked: - option.state |= QStyle::State_Off; - break; - case Qt::PartiallyChecked: - option.state |= QStyle::State_NoChange; - break; - case Qt::Checked: - option.state |= QStyle::State_On; - break; - } - proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, painter, widget); + switch (vopt->checkState) { + case Qt::Unchecked: + option.state |= QStyle::State_Off; + break; + case Qt::PartiallyChecked: + option.state |= QStyle::State_NoChange; + break; + case Qt::Checked: + option.state |= QStyle::State_On; + break; } + proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, painter, widget); + } - // draw the icon - QIcon::Mode mode = QIcon::Normal; - if (!(vopt->state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (vopt->state & QStyle::State_Selected) - mode = QIcon::Selected; - 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); + // draw the icon + QIcon::Mode mode = QIcon::Normal; + if (!(vopt->state & QStyle::State_Enabled)) + mode = QIcon::Disabled; + else if (vopt->state & QStyle::State_Selected) + mode = QIcon::Selected; + QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off; + vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state); + + 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); + lv && lv->viewMode() != QListView::IconMode && !highContrastTheme) { + painter->setPen(vopt->palette.accent().color()); + const auto xPos = isRtl ? rect.right() - 1 : rect.left(); + const QLineF lines[2] = { + QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2), + QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2), + }; + painter->drawLines(lines, 2); } - // paint a vertical marker for QListView - if (vopt->state & State_Selected) { - if (const QListView *lv = qobject_cast<const QListView *>(widget); - lv && lv->viewMode() != QListView::IconMode && !highContrastTheme) { - painter->setPen(vopt->palette.accent().color()); - const auto xPos = isRtl ? rect.right() - 1 : rect.left(); - const QLineF lines[2] = { - QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2), - QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2), - }; - painter->drawLines(lines, 2); - } - } - } else { - QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget); - d->viewItemDrawText(painter, vopt, textRect); } } break; @@ -2217,8 +2212,9 @@ void QWindows11Style::polish(QWidget* widget) pal.setColor(scrollarea->viewport()->backgroundRole(), Qt::transparent); scrollarea->viewport()->setPalette(pal); scrollarea->viewport()->setProperty("_q_original_background_palette", originalPalette); - if (qobject_cast<QTableView *>(widget)) - widget->setAttribute(Qt::WA_Hover, true); + // QTreeView & QListView are already set in the base windowsvista style + if (auto table = qobject_cast<QTableView *>(widget)) + table->viewport()->setAttribute(Qt::WA_Hover, true); } } diff --git a/src/testlib/3rdparty/valgrind/qt_attribution.json b/src/testlib/3rdparty/valgrind/qt_attribution.json index 3146fd82c57..262bc8380b4 100644 --- a/src/testlib/3rdparty/valgrind/qt_attribution.json +++ b/src/testlib/3rdparty/valgrind/qt_attribution.json @@ -11,7 +11,7 @@ "Description": "An instrumentation framework for building dynamic analysis tools.", "Homepage": "http://valgrind.org/", - "Version": "3.24.0", + "Version": "3.25.1", "PURL": "pkg:generic/valgrind@$<VERSION>?download_url=https://valgrind.org/", "License": "BSD 4-clause \"Original\" or \"Old\" License", "LicenseId": "BSD-4-Clause", diff --git a/src/testlib/3rdparty/valgrind/valgrind_p.h b/src/testlib/3rdparty/valgrind/valgrind_p.h index 77ca3ad8692..ab49937ccd4 100644 --- a/src/testlib/3rdparty/valgrind/valgrind_p.h +++ b/src/testlib/3rdparty/valgrind/valgrind_p.h @@ -89,7 +89,7 @@ || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) */ #define __VALGRIND_MAJOR__ 3 -#define __VALGRIND_MINOR__ 24 +#define __VALGRIND_MINOR__ 25 #include <stdarg.h> @@ -126,6 +126,7 @@ #undef PLAT_mips32_linux #undef PLAT_mips64_linux #undef PLAT_nanomips_linux +#undef PLAT_riscv64_linux #undef PLAT_x86_solaris #undef PLAT_amd64_solaris @@ -172,6 +173,8 @@ # define PLAT_mips32_linux 1 #elif defined(__linux__) && defined(__nanomips__) # define PLAT_nanomips_linux 1 +#elif defined(__linux__) && defined(__riscv) && (__riscv_xlen == 64) +# define PLAT_riscv64_linux 1 #elif defined(__sun) && defined(__i386__) # define PLAT_x86_solaris 1 #elif defined(__sun) && defined(__x86_64__) @@ -1129,6 +1132,87 @@ typedef } while (0) #endif + +/* ----------------------- riscv64-linux ------------------------ */ + +#if defined(PLAT_riscv64_linux) + +typedef + struct { + unsigned long int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + ".option push\n\t" \ + ".option norvc\n\t" \ + "srli zero, zero, 3\n\t" \ + "srli zero, zero, 13\n\t" \ + "srli zero, zero, 51\n\t" \ + "srli zero, zero, 61\n\t" + +#define __SPECIAL_INSTRUCTION_POSTAMBLE \ + ".option pop\n\t" \ + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({volatile unsigned long int _zzq_args[6]; \ + volatile unsigned long int _zzq_result; \ + _zzq_args[0] = (unsigned long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long int)(_zzq_arg5); \ + __asm__ volatile("mv a3, %1\n\t" /*default*/ \ + "mv a4, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* a3 = client_request ( a4 ) */ \ + "or a0, a0, a0\n\t" \ + __SPECIAL_INSTRUCTION_POSTAMBLE \ + "mv %0, a3" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" ((unsigned long int)(_zzq_default)), \ + "r" (&_zzq_args[0]) \ + : "memory", "a3", "a4"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* a3 = guest_NRADDR */ \ + "or a1, a1, a1\n\t" \ + __SPECIAL_INSTRUCTION_POSTAMBLE \ + "mv %0, a3" \ + : "=r" (__addr) \ + : \ + : "memory", "a3" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir t0 */ \ + "or a2, a2, a2\n\t" \ + __SPECIAL_INSTRUCTION_POSTAMBLE + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or a3, a3, a3\n\t" \ + __SPECIAL_INSTRUCTION_POSTAMBLE \ + : : : "memory" \ + ); \ + } while (0) + +#endif /* PLAT_riscv64_linux */ + /* Insert assembly code for other platforms here... */ #endif /* NVALGRIND */ @@ -6606,6 +6690,456 @@ typedef #endif /* PLAT_mips64_linux */ +/* ----------------------- riscv64-linux ----------------------- */ + +#if defined(PLAT_riscv64_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "ra", \ + "t0", "t1", "t2", "t3", "t4", "t5", "t6", \ + "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", \ + "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", \ + "ft8", "ft9", "ft10", "ft11", \ + "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7" + +/* s11 is callee-saved, so we can use it to save and restore sp around + the hidden call. */ +#define VALGRIND_ALIGN_STACK \ + "mv s11, sp\n\t" \ + "andi sp, sp, 0xfffffffffffffff0\n\t" +#define VALGRIND_RESTORE_STACK \ + "mv sp, s11\n\t" + +/* These CALL_FN_ macros assume that on riscv64-linux, + sizeof(unsigned long) == 8. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld a7, 64(%1) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "addi sp, sp, -16 \n\t" \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld a7, 64(%1) \n\t" \ + "ld t0, 72(%1) \n\t" \ + "sd t0, 0(sp) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "addi sp, sp, -16 \n\t" \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld a7, 64(%1) \n\t" \ + "ld t0, 72(%1) \n\t" \ + "sd t0, 0(sp) \n\t" \ + "ld t0, 80(%1) \n\t" \ + "sd t0, 8(sp) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "addi sp, sp, -32 \n\t" \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld a7, 64(%1) \n\t" \ + "ld t0, 72(%1) \n\t" \ + "sd t0, 0(sp) \n\t" \ + "ld t0, 80(%1) \n\t" \ + "sd t0, 8(sp) \n\t" \ + "ld t0, 88(%1) \n\t" \ + "sd t0, 16(sp) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11, \ + arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "addi sp, sp, -32 \n\t" \ + "ld a0, 8(%1) \n\t" \ + "ld a1, 16(%1) \n\t" \ + "ld a2, 24(%1) \n\t" \ + "ld a3, 32(%1) \n\t" \ + "ld a4, 40(%1) \n\t" \ + "ld a5, 48(%1) \n\t" \ + "ld a6, 56(%1) \n\t" \ + "ld a7, 64(%1) \n\t" \ + "ld t0, 72(%1) \n\t" \ + "sd t0, 0(sp) \n\t" \ + "ld t0, 80(%1) \n\t" \ + "sd t0, 8(sp) \n\t" \ + "ld t0, 88(%1) \n\t" \ + "sd t0, 16(sp) \n\t" \ + "ld t0, 96(%1) \n\t" \ + "sd t0, 24(sp) \n\t" \ + "ld t0, 0(%1) \n\t" /* target->t0 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \ + VALGRIND_RESTORE_STACK \ + "mv %0, a0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_riscv64_linux */ + /* ------------------------------------------------------------------ */ /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ /* */ @@ -7162,6 +7696,7 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) #undef PLAT_mips32_linux #undef PLAT_mips64_linux #undef PLAT_nanomips_linux +#undef PLAT_riscv64_linux #undef PLAT_x86_solaris #undef PLAT_amd64_solaris 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 560ddd9a640..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 @@ -187,14 +187,14 @@ namespace QTest { inline bool matches(QtMsgType tp, const QString &message) const { - return tp == type - && (pattern.userType() == QMetaType::QString ? - stringsMatch(pattern.toString(), message) : + if (tp != type) + return false; #if QT_CONFIG(regularexpression) - pattern.toRegularExpression().match(message).hasMatch()); -#else - false); + if (const auto *regex = get_if<QRegularExpression>(&pattern)) + return regex->match(message).hasMatch(); #endif + Q_ASSERT(pattern.metaType() == QMetaType::fromType<QString>()); + return stringsMatch(pattern.toString(), message); } QtMsgType type; @@ -258,16 +258,18 @@ namespace QTest { // failOnWarning can be called multiple times per test function, so let // each call cause a failure if required. for (const auto &pattern : failOnWarningList) { - if (pattern.metaType() == QMetaType::fromType<QString>()) { - if (message != pattern.toString()) + if (const auto *text = get_if<QString>(&pattern)) { + if (message != *text) continue; - } #if QT_CONFIG(regularexpression) - else if (pattern.metaType() == QMetaType::fromType<QRegularExpression>()) { - if (!message.contains(pattern.toRegularExpression())) + } else if (const auto *regex = get_if<QRegularExpression>(&pattern)) { + if (!message.contains(*regex)) continue; - } #endif + } else { + // The no-arg clearFailOnWarnings()'s null pattern matches all messages. + Q_ASSERT(pattern.isNull()); + } const size_t maxMsgLen = 1024; char msg[maxMsgLen] = {'\0'}; @@ -398,13 +400,16 @@ void QTestLog::printUnhandledIgnoreMessages() QString message; QTest::IgnoreResultList *list = QTest::ignoreResultList; while (list) { - if (list->pattern.userType() == QMetaType::QString) { - message = "Did not receive message: \"%1\""_L1.arg(list->pattern.toString()); - } else { + if (const auto *text = get_if<QString>(&list->pattern)) { + message = "Did not receive message: \"%1\""_L1.arg(*text); #if QT_CONFIG(regularexpression) - message = "Did not receive any message matching: \"%1\""_L1.arg( - list->pattern.toRegularExpression().pattern()); + } else if (const auto *regex = get_if<QRegularExpression>(&list->pattern)) { + message = "Did not receive any message matching: \"%1\""_L1.arg(regex->pattern()); #endif + } else { + Q_UNREACHABLE(); + message = "Missing message of unrecognized pattern type: \"%1\""_L1.arg( + list->pattern.metaType().name()); } for (auto &logger : QTest::loggers->allLoggers()) logger->addMessage(QAbstractTestLogger::Info, message); diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index e93c3038fca..a27c52f5a99 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -1475,10 +1475,23 @@ bool readInputFile(Options *options) for (const QJsonValue &value : permissions) { if (value.isObject()) { QJsonObject permissionObj = value.toObject(); - QString name = permissionObj.value("name"_L1).toString(); + QString name; QString extras; - if (permissionObj.contains("extras"_L1)) - extras = permissionObj.value("extras"_L1).toString().trimmed(); + for (auto it = permissionObj.begin(); it != permissionObj.end(); ++it) { + if (it.key() == "name"_L1) { + name = it.value().toString(); + } else { + extras.append(" android:"_L1) + .append(it.key()) + .append("=\""_L1) + .append(it.value().toString()) + .append("\""_L1); + } + } + if (name.isEmpty()) { + fprintf(stderr, "Missing permission 'name' in permission specification"); + return false; + } options->applicationPermissions.insert(name, extras); } } @@ -1580,8 +1593,11 @@ bool copyAndroidTemplate(const Options &options) if (options.verbose) fprintf(stdout, "Copying Android package template.\n"); - if (!copyGradleTemplate(options)) - return false; + if (!options.auxMode) { + // Gradle is not configured and is not running in aux mode + if (!copyGradleTemplate(options)) + return false; + } if (!copyAndroidTemplate(options, "/src/android/templates"_L1)) return false; diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index eb4c84fbd75..564a332c091 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -40,6 +40,7 @@ struct Options QString buildPath; QString manifestPath; QString adbCommand{"adb"_L1}; + QString bundletoolPath; QString serial; QString makeCommand; QString package; @@ -48,7 +49,7 @@ struct Options QString stdoutFileName; QHash<QString, QString> outFiles; QStringList amStarttestArgs; - QString apkPath; + QString packagePath; QString ndkStackPath; QList<QStringList> preTestRunAdbCommands; bool showLogcatOutput = false; @@ -114,6 +115,24 @@ static bool execAdbCommand(const QStringList &args, QByteArray *output = nullptr return execCommand(g_options.adbCommand, argsWithSerial, output, verbose); } +static bool execBundletoolCommand(const QStringList &args, QByteArray *output = nullptr, + bool verbose = true) +{ + QString java("java"_L1); + QStringList argsFull = QStringList() << "-jar"_L1 << g_options.bundletoolPath << args; + return execCommand(java, argsFull, output, verbose); +} + +static void setPackagePath(const QString &path) +{ + if (!g_options.packagePath.isEmpty()) { + qCritical("Both --aab and --apk options provided. This is not supported."); + g_options.helpRequested = true; + return; + } + g_options.packagePath = path; +} + static bool execCommand(const QString &command, QByteArray *output = nullptr, bool verbose = true) { auto args = QProcess::splitCommand(command); @@ -133,6 +152,11 @@ static bool parseOptions() g_options.helpRequested = true; else g_options.adbCommand = arguments.at(++i); + } else if (argument.compare("--bundletool"_L1, Qt::CaseInsensitive) == 0) { + if (i + 1 == arguments.size()) + g_options.helpRequested = true; + else + g_options.bundletoolPath = arguments.at(++i); } else if (argument.compare("--path"_L1, Qt::CaseInsensitive) == 0) { if (i + 1 == arguments.size()) g_options.helpRequested = true; @@ -152,7 +176,12 @@ static bool parseOptions() if (i + 1 == arguments.size()) g_options.helpRequested = true; else - g_options.apkPath = arguments.at(++i); + setPackagePath(arguments.at(++i)); + } else if (argument.compare("--aab"_L1, Qt::CaseInsensitive) == 0) { + if (i + 1 == arguments.size()) + g_options.helpRequested = true; + else + setPackagePath(arguments.at(++i)); } else if (argument.compare("--activity"_L1, Qt::CaseInsensitive) == 0) { if (i + 1 == arguments.size()) g_options.helpRequested = true; @@ -200,7 +229,7 @@ static bool parseOptions() for (;i < arguments.size(); ++i) g_options.testArgsList << arguments.at(i); - if (g_options.helpRequested || g_options.buildPath.isEmpty() || g_options.apkPath.isEmpty()) + if (g_options.helpRequested || g_options.buildPath.isEmpty() || g_options.packagePath.isEmpty()) return false; g_options.serial = qEnvironmentVariable("ANDROID_SERIAL"); @@ -222,52 +251,57 @@ static bool parseOptions() static void printHelp() { - qWarning( "Syntax: %s <options> -- [TESTARGS] \n" - "\n" - " Runs a Qt for Android test on an emulator or a device. Specify a device\n" - " using the environment variables ANDROID_SERIAL or ANDROID_DEVICE_SERIAL.\n" - " Returns the number of failed tests, -1 on test runner deployment related\n" - " failures or zero on success." - "\n" - " Mandatory arguments:\n" - " --path <path>: The path where androiddeployqt builds the android package.\n" - "\n" - " --make <make cmd>: make command to create an APK, for example:\n" - " \"cmake --build <build-dir> --target <target>_make_apk\".\n" - "\n" - " --apk <apk path>: The test apk path. The apk has to exist already, if it\n" - " does not exist the make command must be provided for building the apk.\n" - "\n" - " Optional arguments:\n" - " --adb <adb cmd>: The Android ADB command. If missing the one from\n" - " $PATH will be used.\n" - "\n" - " --activity <acitvity>: The Activity to run. If missing the first\n" - " activity from AndroidManifest.qml file will be used.\n" - "\n" - " --timeout <seconds>: Timeout to run the test. Default is 10 minutes.\n" - "\n" - " --skip-install-root: Do not append INSTALL_ROOT=... to the make command.\n" - "\n" - " --show-logcat: Print Logcat output to stdout. If an ANR occurs during\n" - " the test run, logs from the system_server process are included.\n" - " This argument is implied if a test crashes.\n" - "\n" - " --ndk-stack: Path to ndk-stack tool that symbolizes crash stacktraces.\n" - " By default, ANDROID_NDK_ROOT env var is used to deduce the tool path.\n" - "\n" - " -- Arguments that will be passed to the test application.\n" - "\n" - " --verbose: Prints out information during processing.\n" - "\n" - " --pre-test-adb-command <command>: call the adb <command> after\n" - " installation and before the test run.\n" - "\n" - " --manifest <path>: Custom path to the AndroidManifest.xml.\n" - "\n" - " --help: Displays this information.\n", - qPrintable(QCoreApplication::arguments().at(0)) - ); + qWarning("Syntax: %s <options> -- [TESTARGS] \n" + "\n" + " Runs a Qt for Android test on an emulator or a device. Specify a device\n" + " using the environment variables ANDROID_SERIAL or ANDROID_DEVICE_SERIAL.\n" + " Returns the number of failed tests, -1 on test runner deployment related\n" + " failures or zero on success." + "\n" + " Mandatory arguments:\n" + " --path <path>: The path where androiddeployqt builds the android package.\n" + "\n" + " --make <make cmd>: make command to create an APK, for example:\n" + " \"cmake --build <build-dir> --target <target>_make_apk\".\n" + "\n" + " --apk <apk path>: The test apk path. The apk has to exist already, if it\n" + " does not exist the make command must be provided for building the apk.\n" + "\n" + " --aab <aab path>: The test aab path. The aab has to exist already, if it\n" + " does not exist the make command must be provided for building the aab.\n" + "\n" + " Optional arguments:\n" + " --adb <adb cmd>: The Android ADB command. If missing the one from\n" + " $PATH will be used.\n" + "\n" + " --activity <acitvity>: The Activity to run. If missing the first\n" + " activity from AndroidManifest.qml file will be used.\n" + "\n" + " --timeout <seconds>: Timeout to run the test. Default is 10 minutes.\n" + "\n" + " --skip-install-root: Do not append INSTALL_ROOT=... to the make command.\n" + "\n" + " --show-logcat: Print Logcat output to stdout. If an ANR occurs during\n" + " the test run, logs from the system_server process are included.\n" + " This argument is implied if a test crashes.\n" + "\n" + " --ndk-stack: Path to ndk-stack tool that symbolizes crash stacktraces.\n" + " By default, ANDROID_NDK_ROOT env var is used to deduce the tool path.\n" + "\n" + " -- Arguments that will be passed to the test application.\n" + "\n" + " --verbose: Prints out information during processing.\n" + "\n" + " --pre-test-adb-command <command>: call the adb <command> after\n" + " installation and before the test run.\n" + "\n" + " --manifest <path>: Custom path to the AndroidManifest.xml.\n" + "\n" + " --bundletool <bundletool path>: The path to Android bundletool.\n" + " See https://developer.android.com/tools/bundletool for details.\n" + "\n" + " --help: Displays this information.\n", + qPrintable(QCoreApplication::arguments().at(0))); } static QString packageNameFromAndroidManifest(const QString &androidManifestPath) @@ -850,10 +884,10 @@ int main(int argc, char *argv[]) return EXIT_ERROR; } - if (!QFile::exists(g_options.apkPath)) { + if (!QFile::exists(g_options.packagePath)) { qCritical("No apk \"%s\" found after running the make command. " "Check the provided path and the make command.", - qPrintable(g_options.apkPath)); + qPrintable(g_options.packagePath)); return EXIT_ERROR; } @@ -886,11 +920,22 @@ int main(int argc, char *argv[]) // do not install or run packages while another test is running testRunnerLock.acquire(); - const QStringList installArgs = { "install"_L1, "-r"_L1, "-g"_L1, g_options.apkPath }; - g_testInfo.isPackageInstalled.store(execAdbCommand(installArgs, nullptr)); - if (!g_testInfo.isPackageInstalled) - return EXIT_ERROR; + if (g_options.packagePath.endsWith(".apk"_L1)) { + const QStringList installArgs = { "install"_L1, "-r"_L1, "-g"_L1, g_options.packagePath }; + g_testInfo.isPackageInstalled.store(execAdbCommand(installArgs, nullptr)); + if (!g_testInfo.isPackageInstalled) + return EXIT_ERROR; + } else if (g_options.packagePath.endsWith(".aab"_L1)) { + QFileInfo aab(g_options.packagePath); + const auto apksFilePath = aab.absoluteDir().absoluteFilePath(aab.baseName() + ".apks"_L1); + if (!execBundletoolCommand({ "build-apks"_L1, "--bundle"_L1, g_options.packagePath, + "--output"_L1, apksFilePath, "--local-testing"_L1, + "--overwrite"_L1 })) + return EXIT_ERROR; + if (!execBundletoolCommand({ "install-apks"_L1, "--apks"_L1, apksFilePath })) + return EXIT_ERROR; + } // Call additional adb command if set after installation and before starting the test for (const auto &command : g_options.preTestRunAdbCommands) { QByteArray output; diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 14280712154..64fd334d467 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -259,6 +259,7 @@ bool Moc::parseEnum(EnumDef *def, ClassDef *containingClass) return false; // anonymous enum isTypdefEnum = true; } + def->lineNumber = symbol().lineNum; if (test(COLON)) { // C++11 strongly typed enum // enum Foo : unsigned long { ... }; def->type = normalizeType(parseType().name); @@ -464,6 +465,8 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro) } next(LPAREN, "Not a signal or slot declaration"); def->name = tempType.name; + def->lineNumber = symbol().lineNum; + scopedFunctionName = tempType.isScoped; if (!test(RPAREN)) { @@ -1366,6 +1369,7 @@ void Moc::createPropertyDef(PropertyDef &propDef, int propertyIndex, Moc::Proper { propDef.location = index; propDef.relativeIndex = propertyIndex; + propDef.lineNumber = symbol().lineNum; Type t = parseType(); QByteArray type = t.name; @@ -2156,6 +2160,7 @@ QJsonObject FunctionDef::toJson(int index) const if (revision > 0) fdef["revision"_L1] = revision; + fdef["lineNumber"_L1] = lineNumber; if (wasCloned) fdef["isCloned"_L1] = true; @@ -2220,6 +2225,7 @@ QJsonObject PropertyDef::toJson() const prop["final"_L1] = final; prop["required"_L1] = required; prop["index"_L1] = relativeIndex; + prop["lineNumber"_L1] = lineNumber; if (revision > 0) prop["revision"_L1] = revision; @@ -2231,6 +2237,7 @@ QJsonObject EnumDef::toJson(const ClassDef &cdef) const QJsonObject def; uint flags = this->flags | cdef.enumDeclarations.value(name); def["name"_L1] = QString::fromUtf8(name); + def["lineNumber"_L1] = lineNumber; if (!enumName.isEmpty()) def["alias"_L1] = QString::fromUtf8(enumName); if (!type.isEmpty()) diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index f08edb3f0d2..fcf000c655f 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -58,6 +58,7 @@ struct EnumDef QFlags<QtMocConstants::EnumFlags> flags = {}; QJsonObject toJson(const ClassDef &cdef) const; QByteArray qualifiedType(const ClassDef *cdef) const; + int lineNumber = 0; }; Q_DECLARE_TYPEINFO(EnumDef, Q_RELOCATABLE_TYPE); @@ -84,6 +85,7 @@ struct FunctionDef enum Access { Private, Protected, Public }; Access access = Private; int revision = 0; + int lineNumber = 0; bool isConst = false; bool isVirtual = false; @@ -130,6 +132,7 @@ struct PropertyDef bool final = false; bool required = false; int relativeIndex = -1; // property index in current metaobject + int lineNumber = 0; qsizetype location = -1; // token index, used for error reporting 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/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index b2fa08e406f..06912d41582 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -3671,10 +3671,8 @@ void QHeaderViewPrivate::resizeSections(QHeaderView::ResizeMode globalMode, bool executePostedLayout(); - if (noSectionMemoryUsage() && - (hasAutoResizeSections() || (useGlobalMode && globalResizeMode != QHeaderView::Fixed))) { + if (noSectionMemoryUsage() && (hasAutoResizeSections() || globalMode != QHeaderView::Fixed)) setHeaderMode(HeaderMode::FlexibleWithSectionMemoryUsage); - } if (sectionCount() == 0 ) return; diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp index 17a19aa780d..c843927d366 100644 --- a/src/widgets/kernel/qwidgetsvariant.cpp +++ b/src/widgets/kernel/qwidgetsvariant.cpp @@ -11,18 +11,16 @@ QT_BEGIN_NAMESPACE namespace { - -// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class -static constexpr struct : QMetaTypeModuleHelper +struct QVariantWidgetsHelper : QMetaTypeModuleHelper { - const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override { + static const QtPrivate::QMetaTypeInterface *interfaceForType(int type) + { switch (type) { QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE) default: return nullptr; } } -} qVariantWidgetsHelper; - +}; #undef QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES @@ -30,7 +28,9 @@ static constexpr struct : QMetaTypeModuleHelper void qRegisterWidgetsVariant() { - qMetaTypeWidgetsHelper = &qVariantWidgetsHelper; + qMetaTypeWidgetsHelper = QMetaTypeModuleHelper{ + &QVariantWidgetsHelper::interfaceForType, + }; } Q_CONSTRUCTOR_FUNCTION(qRegisterWidgetsVariant) diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index e9cc250c517..c341a025115 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -591,7 +591,7 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem, if (option->state & State_HasFocus && option->state & State_KeyboardFocusChange) painter->setPen(highlightedOutline); else - painter->setPen(colorScheme() == Qt::ColorScheme::Dark ? outline.lighter(150) + painter->setPen(colorScheme() == Qt::ColorScheme::Dark ? outline.lighter(240) : outline.lighter(110)); painter->drawRect(rect); diff --git a/src/widgets/styles/qfusionstyle_p_p.h b/src/widgets/styles/qfusionstyle_p_p.h index 67abdd74dc8..62641609d59 100644 --- a/src/widgets/styles/qfusionstyle_p_p.h +++ b/src/widgets/styles/qfusionstyle_p_p.h @@ -70,10 +70,7 @@ public: } if (pal.window().style() == Qt::TexturePattern) return QColor(0, 0, 0, 160); - if (colorScheme() == Qt::ColorScheme::Dark) - return pal.window().color().lighter(140); - else - return pal.window().color().darker(140); + return pal.window().color().darker(140); } QColor highlightedOutline(const QPalette &pal) const { diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index f5d92094f54..c1ce675d75a 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -3327,7 +3327,8 @@ int QDockAreaLayout::separatorMove(const QList<int> &separator, const QPoint &or { int delta = 0; const auto dockPosition = static_cast<QInternal::DockPosition>(separator.last()); - const bool isHorizontal = dockPosition == QInternal::LeftDock || dockPosition == QInternal::TopDock; + const bool isHorizontal = + dockPosition == QInternal::LeftDock || dockPosition == QInternal::RightDock; const bool isLeftOrTop = dockPosition == QInternal::LeftDock || dockPosition == QInternal::TopDock; const bool separatorIsWithinDock = separator.size() > 1; 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/cmake/test_qt_extract_metatypes/test_qt_extract_metatypes_project/testdata/qt6metatypetest_metatypesQ_OBJECTandQ_PROPERTY.json b/tests/auto/cmake/test_qt_extract_metatypes/test_qt_extract_metatypes_project/testdata/qt6metatypetest_metatypesQ_OBJECTandQ_PROPERTY.json index 2a6d80aa34c..fe80985f796 100644 --- a/tests/auto/cmake/test_qt_extract_metatypes/test_qt_extract_metatypes_project/testdata/qt6metatypetest_metatypesQ_OBJECTandQ_PROPERTY.json +++ b/tests/auto/cmake/test_qt_extract_metatypes/test_qt_extract_metatypes_project/testdata/qt6metatypetest_metatypesQ_OBJECTandQ_PROPERTY.json @@ -11,6 +11,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 11, "name": "test", "read": "test", "required": false, diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index 1e423f21bec..0ea2be1b147 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -430,7 +430,7 @@ void tst_QDir::mkdirRmdir() void tst_QDir::mkdirOnSymlink() { -#if !defined(Q_OS_UNIX) || defined(Q_NO_SYMLINKS) || defined(Q_OS_INTEGRITY) || defined(Q_OS_WASM) +#if !defined(Q_OS_UNIX) || defined(Q_NO_SYMLINKS) || defined(Q_OS_INTEGRITY) QSKIP("Test only valid on an OS that supports symlinks"); #else // Create the structure: @@ -477,9 +477,6 @@ void tst_QDir::mkdirOnSymlink() #if defined(Q_OS_QNX) QSKIP("Fails on QNX QTBUG-98561"); #endif -#if defined (Q_OS_WASM) - QEXPECT_FAIL("", "fails on wasm, see bug: QTBUG-127766", Continue); -#endif QVERIFY2(fi.exists() && fi.isDir(), msgDoesNotExist(path).constData()); #endif } diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index 781f64a31ab..66c3db2e2f0 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -228,6 +228,7 @@ private slots: void getCharFF(); void remove_and_exists(); void removeOpenFile(); + void removedFileDoesntExist(); void fullDisk(); void writeLargeDataBlock_data(); void writeLargeDataBlock(); @@ -2526,6 +2527,37 @@ void tst_QFile::removeOpenFile() } } +void tst_QFile::removedFileDoesntExist() +{ +#ifdef Q_OS_WIN + QSKIP("Not relevant for Windows - can't remove still-open files"); +#endif + QFile::remove("remove_unclosed.txt"); + QFile f("remove_unclosed.txt"); + QVERIFY(!f.exists()); + bool opened = f.open(QIODevice::ReadWrite | QIODevice::Unbuffered); + QVERIFY(opened); + f.write("blah blah blah"); + + QVERIFY(f.exists()); + + // delete by path, not using f.remove() (that's tested above) + QVERIFY(QFile::remove(f.fileName())); + QVERIFY(!QFile::exists(f.fileName())); + QVERIFY(!f.exists()); + +#ifdef Q_OS_LINUX + QString procPath = u"/proc/self/fd/"_s; + if (QFile::exists(procPath)) { + // reopen the deleted file + procPath += QString::number(f.handle()); + QFile f2(procPath); + QVERIFY(f2.open(QIODevice::ReadOnly)); + QVERIFY(!f2.exists()); + } +#endif +} + void tst_QFile::fullDisk() { QFile file("/dev/full"); diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp index 761f0552eec..e2190477441 100644 --- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp +++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp @@ -141,6 +141,7 @@ private slots: void exists_data(); void exists(); + void deletedFileLinuxProcExists(); void absolutePath_data(); void absolutePath(); @@ -615,6 +616,34 @@ void tst_QFileInfo::exists() QVERIFY(!exists); } +void tst_QFileInfo::deletedFileLinuxProcExists() +{ +#ifdef Q_OS_LINUX + static const char msg[] = "Hello, World\n"; + QFileInfo fi("/proc/self/fd/"); + if (!fi.isDir()) + QSKIP("/proc appears not to be mounted"); + + QFile f("removed_file.txt"); + QVERIFY(f.open(QIODevice::ReadWrite | QIODevice::Unbuffered)); + f.write(msg, strlen(msg)); + + fi.setFile(fi.filePath() + QString::number(f.handle())); + QVERIFY(fi.exists()); + QCOMPARE(fi.size(), strlen(msg)); + + QFile::remove("removed_file.txt"); + fi.refresh(); + QVERIFY(fi.exists()); + + fi.refresh(); + QCOMPARE(fi.size(), strlen(msg)); // this stats, so may change flags + QVERIFY(fi.exists()); +#else + QSKIP("Linux-only test"); +#endif +} + void tst_QFileInfo::absolutePath_data() { QTest::addColumn<QString>("file"); diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp index 282c7f2e360..71389abc976 100644 --- a/tests/auto/corelib/io/qurl/tst_qurl.cpp +++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp @@ -513,6 +513,7 @@ void tst_QUrl::comparison2() QCOMPARE(url1.toString(), url2.toString()); QCOMPARE(url1, url2); QCOMPARE(qHash(url1), qHash(url2)); + QCOMPARE(qHash(url1, 1), qHash(url2, 1)); } else if (ordering < 0) { QCOMPARE_LT(url1.toString(), url2.toString()); QCOMPARE_NE(url1, url2); @@ -1387,12 +1388,14 @@ void tst_QUrl::toString_constructed() QUrl parsed(asString); QCOMPARE(url, parsed); QCOMPARE(qHash(url), qHash(parsed)); + QCOMPARE(qHash(url, 1), qHash(parsed, 1)); } // clear it and ensure no memory of the previous state remains url.setUrl(QString()); QCOMPARE(url, QUrl()); QCOMPARE(qHash(url), qHash(QUrl())); + QCOMPARE(qHash(url, 1), qHash(QUrl(), 1)); } void tst_QUrl::toDisplayString_PreferLocalFile_data() @@ -4265,6 +4268,7 @@ void tst_QUrl::setComponents() QUrl recreated(toString); QCOMPARE(copy, recreated); QCOMPARE(qHash(copy), qHash(recreated)); + QCOMPARE(qHash(copy, 1), qHash(recreated, 1)); } else { QVERIFY(copy.toString().isEmpty()); } diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp index c99242c927b..79d94c9b45c 100644 --- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp @@ -67,6 +67,7 @@ private slots: void testSetHandleLayoutChanges(); void testSetHandleDataChanges(); + void matchCustomRole(); protected: void verifyIdentity(QAbstractItemModel *model, const QModelIndex &parent = QModelIndex()); @@ -576,5 +577,38 @@ void tst_QIdentityProxyModel::testSetHandleDataChanges() QVERIFY(!model.isConnected(signal)); } +class CustomRoleProxyModel : public QIdentityProxyModel +{ +public: + using QIdentityProxyModel::QIdentityProxyModel; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override + { + Q_ASSERT(index.isValid()); + if (role == Qt::UserRole) + return QStringLiteral("CustomUserData-%1").arg(index.row()); + return QIdentityProxyModel::data(index, role); + } +}; + +void tst_QIdentityProxyModel::matchCustomRole() +{ + QStandardItemModel sourceModel; + for (int i = 0; i < 5; ++i) + sourceModel.appendRow(new QStandardItem(QString("Item %1").arg(i))); + + CustomRoleProxyModel proxyModel; + proxyModel.setSourceModel(&sourceModel); + + const QString targetValue = QStringLiteral("CustomUserData-3"); + + const QModelIndexList matches = proxyModel.match(proxyModel.index(0, 0), Qt::UserRole, + targetValue, 1, Qt::MatchExactly); + + QCOMPARE(matches.size(), 1); + QCOMPARE(matches.first().row(), 3); + QCOMPARE(proxyModel.data(matches.first(), Qt::UserRole).toString(), targetValue); +} + QTEST_MAIN(tst_QIdentityProxyModel) #include "tst_qidentityproxymodel.moc" 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/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index b1e2e8164af..f2d281ae0a4 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -708,6 +708,8 @@ void tst_QMetaObjectBuilder::property() prop2.setEnumOrFlag(false); \ prop2.setConstant(false); \ prop2.setFinal(false); \ + prop2.setBindable(false); \ + prop2.setRequired(false); \ } while (0) #define COUNT_FLAGS() \ ((prop2.isReadable() ? 1 : 0) + \ @@ -720,7 +722,9 @@ void tst_QMetaObjectBuilder::property() (prop2.hasStdCppSet() ? 1 : 0) + \ (prop2.isEnumOrFlag() ? 1 : 0) + \ (prop2.isConstant() ? 1 : 0) + \ - (prop2.isFinal() ? 1 : 0)) + (prop2.isFinal() ? 1 : 0) + \ + (prop2.isBindable() ? 1 : 0) + \ + (prop2.isRequired() ? 1 : 0)) #define CHECK_FLAG(setFunc,isFunc) \ do { \ CLEAR_FLAGS(); \ 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/platform/CMakeLists.txt b/tests/auto/corelib/platform/CMakeLists.txt index 3a66ec2eae6..9810947e3c6 100644 --- a/tests/auto/corelib/platform/CMakeLists.txt +++ b/tests/auto/corelib/platform/CMakeLists.txt @@ -5,7 +5,9 @@ if(ANDROID) add_subdirectory(android) add_subdirectory(android_appless) add_subdirectory(androiditemmodel) - add_subdirectory(android_legacy_packaging) + if(NOT QT_USE_ANDROID_MODERN_BUNDLE) + add_subdirectory(android_legacy_packaging) + endif() endif() if(WIN32) add_subdirectory(windows) diff --git a/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle b/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle index cbdd833e2ae..1d796d9b6b9 100644 --- a/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle +++ b/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle @@ -70,8 +70,8 @@ android { abortOnError = false } - // Do not compress Qt binary resources file aaptOptions { + // Do not compress Qt binary resources file noCompress 'rcc' } diff --git a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp index 8c129a93c71..d976191406d 100644 --- a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp +++ b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp @@ -242,7 +242,7 @@ constexpr bool CanConvertFromWCharT = #endif ; -static_assert(CanConvert<wchar_t> == CanConvertFromWCharT); // ### FIXME: should work everywhere +static_assert(CanConvert<wchar_t>); static_assert(CanConvert< wchar_t[123]> == CanConvertFromWCharT); static_assert(CanConvert<const wchar_t[123]> == CanConvertFromWCharT); @@ -414,7 +414,10 @@ private Q_SLOTS: fromCharacter(U'\x1F0A0', 2, true); // U+1F0A0: PLAYING CARD BACK } void fromWCharT() const { - ONLY_WIN(fromCharacter(L'ä', 1)); // should work on Unix, too (char32_t does) + fromCharacter(L'ä', 1, sizeof(L'ä') == sizeof(char32_t)); +#ifndef Q_OS_WIN // sizedof(wchar_t) == 2 on Windows, so L'\x1F0A0' would be out-of-range + fromCharacter(L'\x1F0A0', 2, true); // U+1F0A0: PLAYING CARD BACK +#endif } void fromQChar() const { fromCharacter(QChar(u'ä'), 1); } void fromQLatin1Char() const { fromCharacter(QLatin1Char('\xE4'), 1, true); } diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp index 35eda3ad709..bfc6074689b 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); @@ -2466,7 +2470,8 @@ void tst_QLocale::formatTimeZone() // Time definitely in Standard Time const QStringList knownCETus = { u"GMT+1"_s, // ICU - u"CET"_s // Standard abbreviation + u"CET"_s, // Standard abbreviation + u"UTC+0100"_s, // used by Emscripten }; const QString cet = enUS.toString(QDate(2013, 1, 1).startOfDay(), u"t"); QVERIFY2(knownCETus.contains(cet), cet.isEmpty() ? "[empty]" : qPrintable(cet)); @@ -2474,7 +2479,8 @@ void tst_QLocale::formatTimeZone() // Time definitely in Daylight Time const QStringList knownCESTus = { u"GMT+2"_s, // ICU - u"CEST"_s // Standard abbreviation + u"CEST"_s, // Standard abbreviation + u"UTC+0200"_s, // used by Emscripten }; const QString cest = enUS.toString(QDate(2013, 6, 1).startOfDay(), u"t"); QVERIFY2(knownCESTus.contains(cest), cest.isEmpty() ? "[empty]" : qPrintable(cest)); diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index cfc0ec1cc07..2cd1398e7f9 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -6859,10 +6859,7 @@ void tst_QString::arg() // char-ish overloads QCOMPARE(s4.arg('\xE4'), QStringView(u"[ä]")); QCOMPARE(s4.arg(u'ø'), QStringView(u"[ø]")); -#ifdef Q_OS_WIN QCOMPARE(QLatin1String("[%1]").arg(L'ø'), QStringView(u"[ø]")); -#endif - QEXPECT_FAIL("", "QTBUG-126054", Continue); QCOMPARE(s4.arg(L'ø'), QStringView(u"[ø]")); #ifndef __cpp_char8_t #ifndef QT_NO_CAST_FROM_ASCII diff --git a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp index 0b2aaa8281e..7b5b468df0d 100644 --- a/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp +++ b/tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp @@ -603,6 +603,8 @@ private Q_SLOTS: void arg1_QString_char16_t() { arg1_impl<QString, char16_t>(); } + void arg1_QString_wchar_t_data() { arg1_data(false); } + void arg1_QString_wchar_t() { arg1_impl<QString, wchar_t>(); } void arg1_QStringView_QString_data() { arg1_data(); } void arg1_QStringView_QString() { arg1_impl<QStringView, QString>(); } @@ -638,6 +640,8 @@ private Q_SLOTS: void arg1_QStringView_QLatin1Char() { arg1_impl<QStringView, QLatin1Char>(); } void arg1_QStringView_char16_t_data() { arg1_data(false); } void arg1_QStringView_char16_t() { arg1_impl<QStringView, char16_t>(); } + void arg1_QStringView_wchar_t_data() { arg1_data(false); } + void arg1_QStringView_wchar_t() { arg1_impl<QStringView, wchar_t>(); } void arg1_QLatin1StringView_QString_data() { arg1_data(); } void arg1_QLatin1StringView_QString() { arg1_impl<QLatin1StringView, QString>(); } @@ -673,6 +677,8 @@ private Q_SLOTS: void arg1_QLatin1StringView_QLatin1Char() { arg1_impl<QLatin1StringView, QLatin1Char>(); } void arg1_QLatin1StringView_char16_t_data() { arg1_data(false); } void arg1_QLatin1StringView_char16_t() { arg1_impl<QLatin1StringView, char16_t>(); } + void arg1_QLatin1StringView_wchar_t_data() { arg1_data(false); } + void arg1_QLatin1StringView_wchar_t() { arg1_impl<QLatin1StringView, wchar_t>(); } void arg1_QUtf8StringView_QString_data() { arg1_data(); } void arg1_QUtf8StringView_QString() { arg1_impl<QUtf8StringView, QString>(); } @@ -708,6 +714,8 @@ private Q_SLOTS: void arg1_QUtf8StringView_QLatin1Char() { arg1_impl<QUtf8StringView, QLatin1Char>(); } void arg1_QUtf8StringView_char16_t_data() { arg1_data(false); } void arg1_QUtf8StringView_char16_t() { arg1_impl<QUtf8StringView, char16_t>(); } + void arg1_QUtf8StringView_wchar_t_data() { arg1_data(false); } + void arg1_QUtf8StringView_wchar_t() { arg1_impl<QUtf8StringView, wchar_t>(); } void arg1_QAnyStringViewUsingL1_QString_data() { arg1_data(); } void arg1_QAnyStringViewUsingL1_QString() { arg1_impl<QAnyStringViewUsingL1, QString>(); } @@ -743,6 +751,8 @@ private Q_SLOTS: void arg1_QAnyStringViewUsingL1_QLatin1Char() { arg1_impl<QAnyStringViewUsingL1, QLatin1Char>(); } void arg1_QAnyStringViewUsingL1_char16_t_data() { arg1_data(false); } void arg1_QAnyStringViewUsingL1_char16_t() { arg1_impl<QAnyStringViewUsingL1, char16_t>(); } + void arg1_QAnyStringViewUsingL1_wchar_t_data() { arg1_data(false); } + void arg1_QAnyStringViewUsingL1_wchar_t() { arg1_impl<QAnyStringViewUsingL1, wchar_t>(); } void arg1_QAnyStringViewUsingU8_QString_data() { arg1_data(); } void arg1_QAnyStringViewUsingU8_QString() { arg1_impl<QAnyStringViewUsingU8, QString>(); } @@ -778,6 +788,8 @@ private Q_SLOTS: void arg1_QAnyStringViewUsingU8_QLatin1Char() { arg1_impl<QAnyStringViewUsingU8, QLatin1Char>(); } void arg1_QAnyStringViewUsingU8_char16_t_data() { arg1_data(false); } void arg1_QAnyStringViewUsingU8_char16_t() { arg1_impl<QAnyStringViewUsingU8, char16_t>(); } + void arg1_QAnyStringViewUsingU8_wchar_t_data() { arg1_data(false); } + void arg1_QAnyStringViewUsingU8_wchar_t() { arg1_impl<QAnyStringViewUsingU8, wchar_t>(); } void arg1_QAnyStringViewUsingU16_QString_data() { arg1_data(); } void arg1_QAnyStringViewUsingU16_QString() { arg1_impl<QAnyStringViewUsingU16, QString>(); } @@ -813,6 +825,8 @@ private Q_SLOTS: void arg1_QAnyStringViewUsingU16_QLatin1Char() { arg1_impl<QAnyStringViewUsingU16, QLatin1Char>(); } void arg1_QAnyStringViewUsingU16_char16_t_data() { arg1_data(false); } void arg1_QAnyStringViewUsingU16_char16_t() { arg1_impl<QAnyStringViewUsingU16, char16_t>(); } + void arg1_QAnyStringViewUsingU16_wchar_t_data() { arg1_data(false); } + void arg1_QAnyStringViewUsingU16_wchar_t() { arg1_impl<QAnyStringViewUsingU16, wchar_t>(); } private: void split_data(bool rhsHasVariableLength = true); @@ -1627,6 +1641,7 @@ template <class Str> Str make(QStringView sf, QLatin1String l1, const QByteArra MAKE(QChar) { return sv.isEmpty() ? QChar() : sv.at(0); } MAKE(char) { return sv.isEmpty() ? char() : char(sv.at(0).unicode()); } MAKE(char16_t) { return sv.isEmpty() ? char16_t() : char16_t{sv.at(0).unicode()}; } +MAKE(wchar_t) { return make<char16_t>(sv, l1, u8); } MAKE(QLatin1Char) { return l1.isEmpty() ? QLatin1Char('\0') : l1.at(0); } MAKE(QString) { return sv.toString(); } MAKE(QStringView) { return sv; } 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/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp b/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp index 89bd1d7ff61..b53362b43e9 100644 --- a/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp +++ b/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp @@ -5,6 +5,10 @@ #include <QTest> +#include <chrono> + +using namespace std::chrono_literals; + class tst_QAtomicScopedValueRollback : public QObject { Q_OBJECT @@ -15,6 +19,7 @@ private Q_SLOTS: void rollbackToPreviousCommit(); void exceptions(); void earlyExitScope(); + void mixedTypes(); private: void earlyExitScope_helper(int exitpoint, std::atomic<int> &member); }; @@ -132,6 +137,90 @@ void tst_QAtomicScopedValueRollback::earlyExitScope() } } +template <typename T> +struct Wrap { +#if __cpp_deduction_guides < 201907L // no CTAD for aggregates + Q_IMPLICIT Wrap(T &t) : t{t} {} + Q_IMPLICIT Wrap(T &&t) : t{std::move(t)} {} +#endif + T t; + Q_IMPLICIT operator T() const { return t; } +}; + +void tst_QAtomicScopedValueRollback::mixedTypes() +{ + const auto relaxed = std::memory_order_relaxed; + { + std::atomic a{10'000ms}; + { + QAtomicScopedValueRollback rb(a, 5s); + QCOMPARE(a.load(relaxed), 5s); + } + QCOMPARE(a.load(relaxed), 10s); + { + QAtomicScopedValueRollback rb(a, 5s, relaxed); + QCOMPARE(a.load(relaxed), 5s); + } + QCOMPARE(a.load(relaxed), 10s); + } + { + QBasicAtomicInteger a{10'000}; + { + QAtomicScopedValueRollback rb(a, Wrap{5'000}); + QCOMPARE(a.loadRelaxed(), 5'000); + } + QCOMPARE(a.loadRelaxed(), 10'000); + { + QAtomicScopedValueRollback rb(a, Wrap{5'000}, relaxed); + QCOMPARE(a.loadRelaxed(), 5'000); + } + QCOMPARE(a.loadRelaxed(), 10'000); + } + { + QAtomicInteger a{10'000}; + { + QAtomicScopedValueRollback rb(a, Wrap{5'000}); + QCOMPARE(a.loadRelaxed(), 5'000); + } + QCOMPARE(a.loadRelaxed(), 10'000); + { + QAtomicScopedValueRollback rb(a, Wrap{5'000}, relaxed); + QCOMPARE(a.loadRelaxed(), 5'000); + } + QCOMPARE(a.loadRelaxed(), 10'000); + } + { + int i = 10'000; + int j = 5'000; + QBasicAtomicPointer a{&i}; + { + QAtomicScopedValueRollback rb(a, Wrap{&j}); + QCOMPARE(a.loadRelaxed(), &j); + } + QCOMPARE(a.loadRelaxed(), &i); + { + QAtomicScopedValueRollback rb(a, Wrap{&j}, relaxed); + QCOMPARE(a.loadRelaxed(), &j); + } + QCOMPARE(a.loadRelaxed(), &i); + } + { + int i = 10'000; + int j = 5'000; + QAtomicPointer a{&i}; + { + QAtomicScopedValueRollback rb(a, Wrap{&j}); + QCOMPARE(a.loadRelaxed(), &j); + } + QCOMPARE(a.loadRelaxed(), &i); + { + QAtomicScopedValueRollback rb(a, Wrap{&j}, relaxed); + QCOMPARE(a.loadRelaxed(), &j); + } + QCOMPARE(a.loadRelaxed(), &i); + } +} + static void operator*=(std::atomic<int> &lhs, int rhs) { int expected = lhs.load(); diff --git a/tests/auto/gui/kernel/qwindow/BLACKLIST b/tests/auto/gui/kernel/qwindow/BLACKLIST index a92d89c6123..4f994fb3059 100644 --- a/tests/auto/gui/kernel/qwindow/BLACKLIST +++ b/tests/auto/gui/kernel/qwindow/BLACKLIST @@ -25,6 +25,5 @@ android windows-10 windows-11 android -rhel [windowExposedAfterReparent] xcb ubuntu-24.04 # QTBUG-129023 diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index 39051276371..1c8dd14eba4 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -3264,12 +3264,14 @@ void tst_QWindow::windowExposedAfterReparent() QVERIFY(QTest::qWaitForWindowExposed(&parent)); QVERIFY(QTest::qWaitForWindowExposed(&child)); + // Close the child before reparenting it to ensure it is correctly converted + // to a toplevel window by the window manager. + child.close(); child.setParent(nullptr); - QCoreApplication::processEvents(); + child.show(); QVERIFY(QTest::qWaitForWindowExposed(&child)); child.setParent(&parent); - QCoreApplication::processEvents(); QVERIFY(QTest::qWaitForWindowExposed(&child)); } diff --git a/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp b/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp index e761f8cb3cc..f8a0167efad 100644 --- a/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp +++ b/tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp @@ -3,7 +3,9 @@ #include <QTest> #include <QtCore/qmath.h> + #include <QtGui/qmatrix4x4.h> +#include <QtGui/qquaternion.h> class tst_QMatrixNxN : public QObject { diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp index 06b6ffc2700..d4dc6544a0e 100644 --- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp +++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp @@ -894,6 +894,13 @@ void tst_QQuaternion::fromAxes() QQuaternion result = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle); + { + const auto axes = result.toAxes(); + QVERIFY(myFuzzyCompare(axes.x, xAxis)); + QVERIFY(myFuzzyCompare(axes.y, yAxis)); + QVERIFY(myFuzzyCompare(axes.z, zAxis)); + } + QVector3D axes[3]; result.getAxes(&axes[0], &axes[1], &axes[2]); QVERIFY(myFuzzyCompare(axes[0], xAxis)); @@ -985,8 +992,7 @@ void tst_QQuaternion::fromDirection_data() // othonormal up and dir for (QQuaternion q : orientations) { - QVector3D xAxis, yAxis, zAxis; - q.getAxes(&xAxis, &yAxis, &zAxis); + const auto [xAxis, yAxis, zAxis] = q.toAxes(); QTest::addRow("ortho dirs: (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f)", xAxis.x(), xAxis.y(), xAxis.z(), @@ -1007,8 +1013,7 @@ void tst_QQuaternion::fromDirection_data() // invalid up for (QQuaternion q : orientations) { - QVector3D xAxis, yAxis, zAxis; - q.getAxes(&xAxis, &yAxis, &zAxis); + const auto [xAxis, yAxis, zAxis] = q.toAxes(); QTest::addRow("bad dirs: (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f)", xAxis.x(), xAxis.y(), xAxis.z(), @@ -1022,22 +1027,21 @@ void tst_QQuaternion::fromDirection() QFETCH(QVector3D, direction); QFETCH(QVector3D, up); - QVector3D expextedZ(direction != QVector3D() ? direction.normalized() : QVector3D(0, 0, 1)); - QVector3D expextedY(up.normalized()); + const QVector3D expectedZ = direction != QVector3D() ? direction.normalized() + /* else */ : QVector3D(0, 0, 1); + const QVector3D expectedY = up.normalized(); QQuaternion result = QQuaternion::fromDirection(direction, up); QVERIFY(myFuzzyCompare(result, result.normalized())); - QVector3D xAxis, yAxis, zAxis; - result.getAxes(&xAxis, &yAxis, &zAxis); - - QVERIFY(myFuzzyCompare(zAxis, expextedZ)); + const auto axes = result.toAxes(); - if (!qFuzzyIsNull(QVector3D::crossProduct(expextedZ, expextedY).lengthSquared())) { - QVector3D expextedX(QVector3D::crossProduct(expextedY, expextedZ)); + QVERIFY(myFuzzyCompare(axes.z, expectedZ)); - QVERIFY(myFuzzyCompare(yAxis, expextedY)); - QVERIFY(myFuzzyCompare(xAxis, expextedX)); + const QVector3D expectedX = QVector3D::crossProduct(expectedY, expectedZ); + if (!qFuzzyIsNull(expectedX.lengthSquared())) { + QVERIFY(myFuzzyCompare(axes.x, expectedX)); + QVERIFY(myFuzzyCompare(axes.y, expectedY)); } } diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp index 851fef2e05a..a293023f2c6 100644 --- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp +++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp @@ -10,7 +10,7 @@ #endif #include <QScopeGuard> #include <QVersionNumber> -#include <QSemaphore> +#include <private/qlatch_p.h> #include <qcoreapplication.h> #include <qfileinfo.h> @@ -1926,13 +1926,13 @@ void tst_QUdpSocket::readyReadConnectionThrottling() QUdpSocket receiver; QVERIFY(receiver.bind(QHostAddress(QHostAddress::LocalHost), 0)); - QSemaphore semaphore; + QLatch latch(1); // Repro-ing deterministically eludes me, so we are bruteforcing it: // The thread acts as a remote sender, flooding the receiver with datagrams, // and at some point the receiver would get into the broken state mentioned // earlier. - std::unique_ptr<QThread> thread(QThread::create([&semaphore, port = receiver.localPort()]() { + std::unique_ptr<QThread> thread(QThread::create([&latch, port = receiver.localPort()]() { QUdpSocket sender; sender.connectToHost(QHostAddress(QHostAddress::LocalHost), port); QCOMPARE(sender.state(), QUdpSocket::ConnectedState); @@ -1940,7 +1940,7 @@ void tst_QUdpSocket::readyReadConnectionThrottling() constexpr qsizetype PayloadSize = 242; const QByteArray payload(PayloadSize, 'a'); - semaphore.acquire(); // Wait for main thread to be ready + latch.wait(); // Wait for main thread to be ready while (true) { // We send 100 datagrams at a time, then sleep. // This is mostly to let the main thread catch up between bursts so @@ -1975,7 +1975,7 @@ void tst_QUdpSocket::readyReadConnectionThrottling() }, Qt::QueuedConnection); - semaphore.release(); + latch.countDown(); constexpr qsizetype MaxCount = 500; QVERIFY2(QTest::qWaitFor([&] { return count >= MaxCount; }, 10s), QByteArray::number(count).constData()); diff --git a/tests/auto/other/android/CMakeLists.txt b/tests/auto/other/android/CMakeLists.txt index bcbf5b657d7..0eb2d00b46a 100644 --- a/tests/auto/other/android/CMakeLists.txt +++ b/tests/auto/other/android/CMakeLists.txt @@ -2,3 +2,11 @@ # SPDX-License-Identifier: BSD-3-Clause add_subdirectory(deployment_settings) +add_subdirectory(permissions) + +if(QT_USE_TARGET_ANDROID_BUILD_DIR) + add_subdirectory(package_source_dir) + if(QT_USE_ANDROID_MODERN_BUNDLE) + add_subdirectory(dynamic_feature) + endif() +endif() diff --git a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp index 1687ed9de92..571570e370f 100644 --- a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp +++ b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp @@ -83,10 +83,11 @@ void tst_android_deployment_settings::DeploymentSettings_data() << "org.qtproject.android_deployment_settings_test"; QTest::newRow("android-app-name") << "android-app-name" << "Android Deployment Settings Test"; - QTest::newRow("permissions") << "permissions" - << "[{\"name\":\"PERMISSION_WITH_ATTRIBUTES\"," - "\"extras\":\"android:minSdkVersion='32' android:maxSdkVersion='34' \"}," - "{\"name\":\"PERMISSION_WITHOUT_ATTRIBUTES\"}]"; + QTest::newRow("permissions") + << "permissions" + << "[{\"maxSdkVersion\":\"34\",\"minSdkVersion\":\"32\",\"name\":\"PERMISSION_WITH_" + "ATTRIBUTES\"},{\"name\":\"PERMISSION_WITHOUT_ATTRIBUTES\"},{\"name\":\"android." + "permission.INTERNET\"},{\"name\":\"android.permission.WRITE_EXTERNAL_STORAGE\"}]"; } void tst_android_deployment_settings::DeploymentSettings() diff --git a/tests/auto/other/android/dynamic_feature/CMakeLists.txt b/tests/auto/other/android/dynamic_feature/CMakeLists.txt new file mode 100644 index 00000000000..b12c2af4dc7 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_android_dynamic_feature LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +add_subdirectory(feature) + +qt_internal_add_test(tst_android_dynamic_feature + SOURCES + tst_android_dynamic_feature.cpp + storeloader/storeloader.h + storeloader/storeloader.cpp + INCLUDE_DIRECTORIES + storeloader + LIBRARIES + Qt6::Test + Qt6::Gui + Qt6::CorePrivate +) + +set_property(TARGET tst_android_dynamic_feature PROPERTY + QT_ANDROID_PACKAGE_NAME "org.qtproject.example.android_dynamic_feature") +set_property(TARGET tst_android_dynamic_feature APPEND PROPERTY + _qt_android_gradle_java_source_dirs "${CMAKE_CURRENT_SOURCE_DIR}/storeloader/java") + +qt6_add_android_dynamic_features(tst_android_dynamic_feature FEATURE_TARGETS + tst_android_dynamic_feature_resources) diff --git a/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt b/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt new file mode 100644 index 00000000000..bfe29cc0f5e --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.16) + +qt6_add_library(tst_android_dynamic_feature_resources SHARED) +qt6_add_resources(tst_android_dynamic_feature_resources "dynamic_resources" + PREFIX "/dynamic_resources" + FILES "qtlogo.png") + +target_link_libraries(tst_android_dynamic_feature_resources PRIVATE Qt6::Core) diff --git a/tests/auto/other/android/dynamic_feature/feature/qtlogo.png b/tests/auto/other/android/dynamic_feature/feature/qtlogo.png Binary files differnew file mode 100644 index 00000000000..b63f1384b11 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/feature/qtlogo.png diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java new file mode 100644 index 00000000000..5a72351c802 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java @@ -0,0 +1,175 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +package org.qtproject.example.android_dynamic_feature; + +import com.google.android.play.core.splitcompat.SplitCompat; +import com.google.android.play.core.splitinstall.SplitInstallManager; +import com.google.android.play.core.splitinstall.SplitInstallManagerFactory; +import com.google.android.play.core.splitinstall.SplitInstallRequest; +import com.google.android.play.core.splitinstall.SplitInstallHelper; +import com.google.android.play.core.splitinstall.testing.FakeSplitInstallManagerFactory; +import android.content.pm.PackageManager.NameNotFoundException; + +import java.util.Arrays; +import java.util.HashMap; +import java.io.File; +import android.util.Log; +import android.content.Context; +import android.os.Build; + +/** + * Android implementation of store loader. + */ +public class StoreLoader implements StoreLoaderListenerCallback +{ + private static final String TAG = "StoreLoader"; + private final SplitInstallManager m_splitInstallManager; + private HashMap<String, StoreLoaderListener> m_listeners = + new HashMap(); + private Context m_context; + private String m_moduleName; + + public static native void stateChangedNative(String callId, int state); + public static native void errorOccurredNative(String callId, int errorCode, + String errorMessage); + public static native void userConfirmationRequestedNative(String callId, int errorCode, + String errorMessage); + public static native void downloadProgressChangedNative(String callId, long bytes, long total); + public static native void finishedNative(String callId); + + public StoreLoader(Context context) { + m_context = context; + + SplitCompat.install(context); + + m_splitInstallManager = SplitInstallManagerFactory.create(context); + if (m_splitInstallManager == null) + Log.e(TAG,"Constructor: Did not get splitInstallManager"); + } + + /** + * Loads Feature Delivery module from a play store. + */ + public void installModuleFromStore(String moduleName, String callId) { + Log.d(TAG, "installModuleFromStore: " + moduleName + " " + callId); + m_moduleName = moduleName; + + registerListener(callId); + + SplitInstallRequest request = + SplitInstallRequest.newBuilder().addModule(m_moduleName).build(); + if (request == null) + Log.e(TAG, "Null request"); + + if (m_splitInstallManager == null) + Log.e(TAG, "Null m_splitInstallManager"); + + m_splitInstallManager.startInstall(request) + .addOnSuccessListener(sessionId -> { + Log.d(TAG, "Install start call succesfull"); + StoreLoaderListener listener = m_listeners.get(callId); + if (listener != null) { + if (!listener.isCancelled()) + listener.setSessionId(sessionId); + else + m_splitInstallManager.cancelInstall(sessionId); + } else { + Log.d(TAG, "Listener for callId '" + callId + "' is not found"); + } + }); + } + + public void onStateChanged(String callId, int state) { + stateChangedNative(callId, state); + if (state == StoreLoaderListenerCallback.LOADED || + state == StoreLoaderListenerCallback.CANCELED) { + finished(callId); + } + } + + public void onErrorOccurred(String callId, int errorCode, String errorMessage) { + onStateChanged(callId, ERROR); + + Log.e(TAG, "Error occurred " + errorCode + " " + errorMessage); + errorOccurredNative(callId, errorCode, errorMessage); + finished(callId); + } + + public void onUserConfirmationRequested(String callId, int errorCode, String errorMessage) { + Log.d(TAG, "Requires user confirmation " + errorCode); + userConfirmationRequestedNative(callId, errorCode, errorMessage); + } + + public void onDownloadProgressChanged(String callId, long bytes, long total) { + Log.d(TAG, "Downloading " + bytes + "/" + total); + downloadProgressChangedNative(callId, bytes, total); + } + + public void onLoadLibrary(String callId) { + Log.d(TAG, "Load library for the module " + m_moduleName); + + stateChangedNative(callId, StoreLoaderListenerCallback.LOADING); + // update context. + try { + m_context = m_context.createPackageContext(m_context.getPackageName(), 0); + } catch (NameNotFoundException ignored) { + Log.e(TAG, "Could not get package name"); + } + // install splitcompat for new context. + SplitCompat.install(m_context); + // try to load new library + boolean isLoaded = false; + for (String abi : Build.SUPPORTED_ABIS) { + String fullLibraryName = m_moduleName + "_" + abi; + try { + System.loadLibrary(fullLibraryName); + isLoaded = true; + break; + } catch (Exception e) { + Log.d(TAG, "Exception occurred when loading the library " + fullLibraryName + ":" + + e.getClass().getCanonicalName()); + } + } + + if (isLoaded) + onStateChanged(callId, StoreLoaderListenerCallback.LOADED); + else + onErrorOccurred(callId, -1, "Error loading library. Check logcat for details."); + + } + + public void cancelInstall(String callId) { + StoreLoaderListener listener = m_listeners.get(callId); + if (listener == null) { + Log.e(TAG, "The listener for callId " + callId + " is not found"); + return; + } + + if (listener.getSessionId() < 0) + listener.postponeCancel(); + else + m_splitInstallManager.cancelInstall(listener.getSessionId()); + } + + private void finished(String callId) { + unregisterListener(callId); + finishedNative(callId); + } + + private void registerListener(String callId) { + Log.d(TAG, "registerListener"); + StoreLoaderListener listener = new StoreLoaderListener(this, callId); + if (listener != null) { + m_listeners.put(callId, listener); + m_splitInstallManager.registerListener(listener); + } + } + + private void unregisterListener(String callId) { + Log.d(TAG, "unregisterListener"); + StoreLoaderListener listener = m_listeners.remove(callId); + if (listener != null) + m_splitInstallManager.unregisterListener(listener); + } +} diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java new file mode 100644 index 00000000000..3e83a0fa7f9 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java @@ -0,0 +1,92 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +package org.qtproject.example.android_dynamic_feature; + +import com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener; +import com.google.android.play.core.splitinstall.SplitInstallSessionState; +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus; + +import android.util.Log; + +public class StoreLoaderListener implements SplitInstallStateUpdatedListener { + + private final StoreLoaderListenerCallback m_callback; + private final String m_callId; + private int m_installSessionId = -1; + private static final String TAG = "StoreLoaderListener"; + private int m_currentStatus = SplitInstallSessionStatus.UNKNOWN; + private boolean m_postponeCancel = false; + + public StoreLoaderListener(StoreLoaderListenerCallback callback, String callId) { + m_callback = callback; + m_callId = callId; + } + + public void setSessionId(int sessionId) { m_installSessionId = sessionId; } + public int getSessionId() { return m_installSessionId; } + + public void postponeCancel() { m_postponeCancel = true; } + public boolean isCancelled() { return m_postponeCancel; } + + @Override + public void onStateUpdate(SplitInstallSessionState state) { + Log.d(TAG, + "onStateUpdate, status: " + state.status() + " session id: " + state.sessionId()); + if (state.sessionId() != m_installSessionId) { + // Not mine + return; + } + + switch (state.status()) { + case SplitInstallSessionStatus.DOWNLOADING: + Log.d(TAG, + "SplitInstallSessionState: DOWNLOADING " + state.bytesDownloaded() + "/" + + state.totalBytesToDownload()); + if (m_currentStatus != SplitInstallSessionStatus.DOWNLOADING) + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.DOWNLOADING); + + m_callback.onDownloadProgressChanged(m_callId, state.bytesDownloaded(), + state.totalBytesToDownload()); + break; + case SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION: + Log.d(TAG, "SplitInstallSessionState: REQUIRES_USER_CONFIRMATION"); + m_callback.onStateChanged(m_callId, + StoreLoaderListenerCallback.REQUIRES_USER_CONFIRMATION); + + m_callback.onUserConfirmationRequested(m_callId, state.errorCode(), "" /*noop for now*/); + break; + case SplitInstallSessionStatus.INSTALLED: + Log.d(TAG, "SplitInstallSessionState: INSTALLED"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.INSTALLED); + m_callback.onLoadLibrary(m_callId); + break; + case SplitInstallSessionStatus.INSTALLING: + Log.d(TAG, "SplitInstallSessionState: INSTALLING"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.INSTALLING); + break; + case SplitInstallSessionStatus.FAILED: + Log.d(TAG, + "SplitInstallSessionState: FAILED with error code: " + state.errorCode()); + m_callback.onErrorOccurred(m_callId, state.errorCode(), "" /*noop for now*/); + break; + case SplitInstallSessionStatus.PENDING: + Log.d(TAG, "SplitInstallSessionState: PENDING"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.PENDING); + break; + case SplitInstallSessionStatus.DOWNLOADED: + Log.d(TAG, "SplitInstallSessionState: DOWNLOADED"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.DOWNLOADED); + break; + case SplitInstallSessionStatus.CANCELED: + Log.d(TAG, "SplitInstallSessionState: CANCELED"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.CANCELED); + break; + case SplitInstallSessionStatus.CANCELING: + Log.d(TAG, "SplitInstallSessionState: CANCELING"); + m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.CANCELING); + break; + } + m_currentStatus = state.status(); + } +} diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java new file mode 100644 index 00000000000..99c7327e328 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java @@ -0,0 +1,26 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +package org.qtproject.example.android_dynamic_feature; + +public interface StoreLoaderListenerCallback { + public static final int UNKNOWN = 0; // Unused but native part has and uses one. + public static final int INITIALIZED = 1; + public static final int PENDING = 2; + public static final int DOWNLOADING = 3; + public static final int DOWNLOADED = 4; + public static final int REQUIRES_USER_CONFIRMATION = 5; + public static final int CANCELING = 6; + public static final int CANCELED = 7; + public static final int INSTALLING = 8; + public static final int INSTALLED = 9; + public static final int LOADING = 10; + public static final int LOADED = 11; + public static final int ERROR = 12; + + public void onStateChanged(String callId, int state); + public void onErrorOccurred(String callId, int errorCode, String errorMessage); + public void onUserConfirmationRequested(String callId, int errorCode, String errorMessage); + public void onDownloadProgressChanged(String callId, long bytes, long total); + public void onLoadLibrary(String callId); +} diff --git a/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp new file mode 100644 index 00000000000..7abce59b79e --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp @@ -0,0 +1,227 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include "storeloader.h" + +#include <QtCore/private/qobject_p.h> +#include <QtCore/qcoreapplication.h> +#include <QtCore/qhash.h> +#include <QtCore/qjniobject.h> +#include <QtCore/qlogging.h> +#include <QtCore/qmutex.h> +#include <QtCore/quuid.h> + +#include <jni.h> + +Q_DECLARE_JNI_CLASS(StoreLoader, + "org/qtproject/example/android_dynamic_feature/StoreLoader"); + +class StoreLoaderHandlerPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(StoreLoaderHandler) +public: + void setState(StoreLoader::State state) + { + if (m_state == state) + return; + Q_Q(StoreLoaderHandler); + m_state = state; + q->stateChanged(m_state); + } + + const QString &callId() const & noexcept { return m_callId; } + +private: + StoreLoader::State m_state = StoreLoader::State::Unknown; + QString m_callId = QUuid::createUuid().toString(); +}; + +namespace QtPrivate { +QString asString(const jstring &s) +{ + return QJniObject(s).toString(); +} +} // namespace QtPrivate + +namespace { + +class StoreLoaderImpl +{ +public: + StoreLoaderImpl(); + bool registerNatives() const; + + void addHandler(StoreLoaderHandler *handler); + StoreLoaderHandler *findHandler(const jstring &callId); + void removeHandler(const jstring &callId); + + QtJniTypes::StoreLoader loader = nullptr; + +private: + QHash<QString, QPointer<StoreLoaderHandler>> m_handlers; + QMutex m_lock; +}; + +Q_GLOBAL_STATIC(StoreLoaderImpl, loaderInstance) + +void stateChangedNative(JNIEnv *, jobject, jstring callId, int state) +{ + qDebug("State changed %s.", qPrintable(callId)); + + if (auto *handler = loaderInstance->findHandler(callId)) + emit handler->stateChanged(static_cast<StoreLoader::State>(state)); +} + +void errorOccurredNative(JNIEnv *, jobject, jstring callId, int errorCode, jstring errorMessage) +{ + qDebug("Error occurred %s %d %s.", qPrintable(callId), errorCode, qPrintable(errorMessage)); + auto *handler = loaderInstance->findHandler(callId); + if (!handler) + return; + + emit handler->errorOccured(errorCode, QJniObject(errorMessage).toString()); +} + +void userConfirmationRequestedNative(JNIEnv *, jobject, jstring callId, int errorCode, + jstring errorMessage) +{ + qDebug("User confirmation requested %s %d %s.", qPrintable(callId), errorCode, + qPrintable(errorMessage)); + auto *handler = loaderInstance->findHandler(callId); + if (!handler) + return; + + emit handler->confirmationRequest(errorCode, QJniObject(errorMessage).toString()); +} + +void downloadProgressChangedNative(JNIEnv *, jobject, jstring callId, long bytes, long total) +{ + qDebug("Download progress changed %ld/%ld.", bytes, total); + auto *handler = loaderInstance->findHandler(callId); + if (!handler) + return; + + emit handler->downloadProgress(bytes, total); +} + +void finishedNative(JNIEnv *, jobject, jstring callId) +{ + auto *handler = loaderInstance->findHandler(callId); + if (!handler) + return; + + emit handler->finished(); +} + +} // namespace + +Q_DECLARE_JNI_NATIVE_METHOD(stateChangedNative) +Q_DECLARE_JNI_NATIVE_METHOD(errorOccurredNative) +Q_DECLARE_JNI_NATIVE_METHOD(userConfirmationRequestedNative) +Q_DECLARE_JNI_NATIVE_METHOD(downloadProgressChangedNative) +Q_DECLARE_JNI_NATIVE_METHOD(finishedNative) + +StoreLoaderImpl::StoreLoaderImpl() +{ + loader = QJniObject::construct<QtJniTypes::StoreLoader, QtJniTypes::Context>( + QNativeInterface::QAndroidApplication::context()); +} + +bool StoreLoaderImpl::registerNatives() const +{ + static bool result = [] { + return QtJniTypes::StoreLoader::registerNativeMethods({ + Q_JNI_NATIVE_METHOD(stateChangedNative), + Q_JNI_NATIVE_METHOD(errorOccurredNative), + Q_JNI_NATIVE_METHOD(userConfirmationRequestedNative), + Q_JNI_NATIVE_METHOD(downloadProgressChangedNative), + Q_JNI_NATIVE_METHOD(finishedNative), + }); + }(); + + if (!result) + qCritical("Unable to register native methods."); + + return result; +} + +void StoreLoaderImpl::addHandler(StoreLoaderHandler *handler) +{ + Q_ASSERT(handler); + + QMutexLocker lock(&m_lock); + const auto &callId = handler->callId(); + Q_ASSERT_X(m_handlers.constFind(callId) != m_handlers.constEnd(), "StoreLoaderImpl::addHandler", + qPrintable(QString("Handler with callId %1 already exists.").arg(callId))); + + m_handlers[callId] = QPointer(handler); +} + + +StoreLoaderHandler *StoreLoaderImpl::findHandler(const jstring &callId) +{ + QMutexLocker lock(&m_lock); + const auto it = m_handlers.constFind(QJniObject(callId).toString()); + if (it == m_handlers.constEnd()) { + qCritical("The handler for the call %s was not found.", qPrintable(callId)); + return nullptr; + } + + if (it.value().isNull()) { + qCritical("The handler for the call %s expired.", qPrintable(callId)); + m_handlers.erase(it); + } + + return it.value().get(); +} + +void StoreLoaderImpl::removeHandler(const jstring &callId) +{ + QMutexLocker lock(&m_lock); + m_handlers.remove(QJniObject(callId).toString()); +} + +std::unique_ptr<StoreLoaderHandler> +StoreLoader::loadModule(const QString &moduleName) +{ + if (moduleName.isEmpty()) + return {}; + + if (!loaderInstance->registerNatives()) + return {}; + + if (!loaderInstance->loader.isValid()) { + qCritical("StoreLoader not constructed"); + return {}; + } + + auto handlerPtr = std::make_unique<StoreLoaderHandler>( + nullptr, StoreLoaderHandler::PrivateConstructor{}); + loaderInstance->addHandler(handlerPtr.get()); + + const auto &callId = handlerPtr->callId(); + qDebug("Loading module %s, callId: %s.", qPrintable(moduleName), qPrintable(callId)); + + loaderInstance->loader.callMethod<void>("installModuleFromStore", moduleName, callId); + return handlerPtr; +} + +StoreLoaderHandler::StoreLoaderHandler(QObject *parent, PrivateConstructor) + : QObject(*new StoreLoaderHandlerPrivate(), parent) +{ +} + +StoreLoaderHandler::~StoreLoaderHandler() = default; + +const QString &StoreLoaderHandler::callId() const & noexcept +{ + Q_D(const StoreLoaderHandler); + return d->callId(); +} + +void StoreLoaderHandler::cancel() +{ + Q_D(StoreLoaderHandler); + loaderInstance->loader.callMethod<void>("cancelInstall", d->callId()); +} + +#include "moc_storeloader.cpp" diff --git a/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h new file mode 100644 index 00000000000..be4e103207e --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h @@ -0,0 +1,65 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef STORELOADER_H +#define STORELOADER_H + +#include <QtCore/qtconfigmacros.h> +#include <QtCore/qobject.h> + +#include <memory> + +class StoreLoaderHandler; + +namespace StoreLoader { + Q_NAMESPACE +enum class State { + Unknown, + Initialized, + Pending, + Downloading, + Downloaded, + RequiresUserConfirmation, + Canceling, + Canceled, + Installing, + Installed, + Loading, + Loaded, + Error, +}; +Q_ENUM_NS(State) + +std::unique_ptr<StoreLoaderHandler> loadModule(const QString &moduleName); +}; // namespace StoreLoader + +class StoreLoaderHandlerPrivate; + +class StoreLoaderHandler : public QObject +{ + Q_OBJECT + QT_DEFINE_TAG_STRUCT(PrivateConstructor); + +public: + explicit StoreLoaderHandler(QObject *parent, PrivateConstructor); + ~StoreLoaderHandler() override; + + const QString &callId() const & noexcept; + + void cancel(); +signals: + void stateChanged(StoreLoader::State state); + void downloadProgress(qsizetype bytes, qsizetype total); + void errorOccured(int errorCode, const QString &errorString); + void confirmationRequest(int errorCode, const QString &errorString); + void finished(); + +private: + Q_DISABLE_COPY_MOVE(StoreLoaderHandler) + Q_DECLARE_PRIVATE(StoreLoaderHandler) + + friend std::unique_ptr<StoreLoaderHandler> + StoreLoader::loadModule(const QString &); +}; + +#endif // STORELOADER_H diff --git a/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp b/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp new file mode 100644 index 00000000000..739a645c5d5 --- /dev/null +++ b/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp @@ -0,0 +1,37 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <storeloader.h> + +#include <QtTest/QTest> +#include <QtTest/QSignalSpy> + +#include <QtCore/QVariant> + +using namespace Qt::Literals::StringLiterals; + +class QtDynamicFeatureTest : public QObject +{ + Q_OBJECT +public: + QtDynamicFeatureTest(){} + +private Q_SLOTS: + void loadResourcesFeature(); +}; + +void QtDynamicFeatureTest::loadResourcesFeature() +{ + QVERIFY(!QFile::exists(":/dynamic_resources/qtlogo.png")); + + auto handler = StoreLoader::loadModule("tst_android_dynamic_feature_resources"_L1); + + QSignalSpy spy(handler.get(), &StoreLoaderHandler::finished); + + QVERIFY(spy.wait(20000)); + QVERIFY(QFile::exists(":/dynamic_resources/qtlogo.png")); +} + +QTEST_MAIN(QtDynamicFeatureTest) + +#include "tst_android_dynamic_feature.moc" diff --git a/tests/auto/other/android/package_source_dir/CMakeLists.txt b/tests/auto/other/android/package_source_dir/CMakeLists.txt new file mode 100644 index 00000000000..360aa50d87d --- /dev/null +++ b/tests/auto/other/android/package_source_dir/CMakeLists.txt @@ -0,0 +1,54 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_android_package_source_dir LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +# Package name is generated and written to AndroidManifest.xml +qt_internal_add_test(tst_package_source_dir_not_defined + SOURCES + tst_android_package_source_dir.cpp + DEFINES + EXPECTED_APP_NAME="tst_package_source_dir_not_defined" +) + +# Package name from user-provided AndroidManifest.xml +qt_internal_add_test(tst_package_source_dir_custom_android_manifest + SOURCES + tst_android_package_source_dir.cpp + DEFINES + EXPECTED_APP_NAME="tst_package_source_dir_custom_android_manifest_my" +) + +if(QT_USE_ANDROID_MODERN_BUNDLE) + set_target_properties(tst_package_source_dir_custom_android_manifest + PROPERTIES + QT_ANDROID_PACKAGE_SOURCE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/custom_android_manifest_bundle" + ) +else() + set_target_properties(tst_package_source_dir_custom_android_manifest + PROPERTIES + QT_ANDROID_PACKAGE_SOURCE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/custom_android_manifest" + ) +endif() + +if(QT_USE_ANDROID_MODERN_BUNDLE) + # Partial gradle template is only supported by QT_USE_ANDROID_MODERN_BUNDLE + # + # Package name from user-provided gradle.build.in + qt_internal_add_test(tst_package_source_dir_partial_template + SOURCES + tst_android_package_source_dir.cpp + DEFINES + EXPECTED_APP_NAME="tst_package_source_dir_partial_template_my" + ) + set_target_properties(tst_package_source_dir_partial_template + PROPERTIES + QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/partial_template" + ) +endif() diff --git a/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml new file mode 100644 index 00000000000..4f53295e979 --- /dev/null +++ b/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.qtproject.example.tst_package_source_dir_custom_android_manifest" + android:installLocation="auto" + android:versionCode="1" + android:versionName="1.0"> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <supports-screens + android:anyDensity="true" + android:largeScreens="true" + android:normalScreens="true" + android:smallScreens="true" /> + <application + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:hardwareAccelerated="true" + android:label="tst_package_source_dir_custom_android_manifest_my" + android:requestLegacyExternalStorage="true" + android:allowBackup="true" + android:fullBackupOnly="false"> + <activity + android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:launchMode="singleTop" + android:screenOrientation="unspecified" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + <meta-data + android:name="android.app.lib_name" + android:value="tst_package_source_dir_custom_android_manifest" /> + + <meta-data + android:name="android.app.arguments" + android:value="" /> + </activity> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.qtprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/qtprovider_paths"/> + </provider> + </application> +</manifest> diff --git a/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml new file mode 100644 index 00000000000..4f53295e979 --- /dev/null +++ b/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.qtproject.example.tst_package_source_dir_custom_android_manifest" + android:installLocation="auto" + android:versionCode="1" + android:versionName="1.0"> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <supports-screens + android:anyDensity="true" + android:largeScreens="true" + android:normalScreens="true" + android:smallScreens="true" /> + <application + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:hardwareAccelerated="true" + android:label="tst_package_source_dir_custom_android_manifest_my" + android:requestLegacyExternalStorage="true" + android:allowBackup="true" + android:fullBackupOnly="false"> + <activity + android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:launchMode="singleTop" + android:screenOrientation="unspecified" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + <meta-data + android:name="android.app.lib_name" + android:value="tst_package_source_dir_custom_android_manifest" /> + + <meta-data + android:name="android.app.arguments" + android:value="" /> + </activity> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.qtprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/qtprovider_paths"/> + </provider> + </application> +</manifest> diff --git a/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml new file mode 100644 index 00000000000..838d239e5f4 --- /dev/null +++ b/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.qtproject.example.tst_package_source_dir_partial_template" + android:installLocation="auto" + android:versionCode="1" + android:versionName="1.0"> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <supports-screens + android:anyDensity="true" + android:largeScreens="true" + android:normalScreens="true" + android:smallScreens="true" /> + <application + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:hardwareAccelerated="true" + android:label="${appName}" + android:requestLegacyExternalStorage="true" + android:allowBackup="true" + android:fullBackupOnly="false"> + <activity + android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:launchMode="singleTop" + android:screenOrientation="unspecified" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + <meta-data + android:name="android.app.lib_name" + android:value="tst_package_source_dir_partial_template" /> + + <meta-data + android:name="android.app.arguments" + android:value="" /> + </activity> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.qtprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/qtprovider_paths"/> + </provider> + </application> +</manifest> diff --git a/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in b/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in new file mode 100644 index 00000000000..538f1ca6217 --- /dev/null +++ b/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in @@ -0,0 +1,54 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.6.0' + } +} + +apply plugin: '@GRADLE_PLUGIN_TYPE@' + +dependencies { + @GRADLE_DEPENDENCIES@ +} + +android { + namespace '@PACKAGE_NAME@' + compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@' + buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@' + ndkVersion '@ANDROID_NDK_REVISION@' + + defaultConfig { + @DEFAULT_CONFIG_VALUES@ + manifestPlaceholders = [ appName:"tst_package_source_dir_partial_template_my" ] + } + + sourceSets { + main { +@SOURCE_SETS@ + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + aaptOptions { + // Do not compress Qt binary resources file + noCompress 'rcc' + } + + @ANDROID_DEPLOYMENT_EXTRAS@ +} diff --git a/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp b/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp new file mode 100644 index 00000000000..d74d388371f --- /dev/null +++ b/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp @@ -0,0 +1,47 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QCoreApplication> +#include <QJniObject> +#include <QTest> +#include <QDebug> + +using namespace QNativeInterface; + +Q_DECLARE_JNI_CLASS(ApplicationInfo, "android/content/pm/ApplicationInfo") +Q_DECLARE_JNI_CLASS(PackageManager, "android/content/pm/PackageManager") +Q_DECLARE_JNI_CLASS(CharSequence, "java/lang/CharSequence") + +class tst_android_package_source_dir : public QObject +{ + Q_OBJECT + +private slots: + void applicationName(); + +private: +}; + +void tst_android_package_source_dir::applicationName() +{ + QJniObject appCtx = QAndroidApplication::context(); + QVERIFY(appCtx.isValid()); + + const auto appInfo = appCtx.callMethod<QtJniTypes::ApplicationInfo>("getApplicationInfo"); + QVERIFY(appInfo.isValid()); + + const auto packageManager = appCtx.callMethod<QtJniTypes::PackageManager>("getPackageManager"); + QVERIFY(packageManager.isValid()); + + const auto appNameLabel = + appInfo.callMethod<QtJniTypes::CharSequence>("loadLabel", packageManager); + QVERIFY(appNameLabel.isValid()); + + const auto appName = appNameLabel.callMethod<jstring>("toString").toString(); + + QCOMPARE_EQ(appName, QString::fromLatin1(EXPECTED_APP_NAME)); +} + +QTEST_MAIN(tst_android_package_source_dir); + +#include "tst_android_package_source_dir.moc" diff --git a/tests/auto/other/android/permissions/CMakeLists.txt b/tests/auto/other/android/permissions/CMakeLists.txt new file mode 100644 index 00000000000..0424c674e1b --- /dev/null +++ b/tests/auto/other/android/permissions/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_android_permissions LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_android_permissions + SOURCES + tst_android_permissions.cpp +) + +qt_add_android_permission(tst_android_permissions + NAME android.permission.ACCESS_COARSE_LOCATION +) + +qt_add_android_permission(tst_android_permissions + NAME android.permission.ACCESS_FINE_LOCATION + ATTRIBUTES + maxSdkVersion 31 +) diff --git a/tests/auto/other/android/permissions/tst_android_permissions.cpp b/tests/auto/other/android/permissions/tst_android_permissions.cpp new file mode 100644 index 00000000000..5d7a255d3ac --- /dev/null +++ b/tests/auto/other/android/permissions/tst_android_permissions.cpp @@ -0,0 +1,80 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QCoreApplication> +#include <QJniObject> +#include <QSet> +#include <QString> +#include <QTest> + +constexpr int GET_PERMISSIONS(0x00001000); + +using namespace QNativeInterface; +using namespace Qt::StringLiterals; + +Q_DECLARE_JNI_CLASS(PackageManager, "android/content/pm/PackageManager") +Q_DECLARE_JNI_CLASS(PackageInfo, "android/content/pm/PackageInfo") + +class tst_android_permissions : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void checkExpectedDefaults(); + void checkNonExisting(); + void checkNonDefaultPermissions(); + +private: + QJniArray<QString> m_requestedPermissions; +}; + +void tst_android_permissions::initTestCase() +{ + QJniObject appCtx = QAndroidApplication::context(); + QVERIFY(appCtx.isValid()); + + const auto packageName = appCtx.callMethod<QString>("getPackageName"); + const auto packageManager = appCtx.callMethod<QtJniTypes::PackageManager>("getPackageManager"); + QVERIFY(packageManager.isValid()); + + const auto packageInfo = QJniObject(packageManager.callMethod<QtJniTypes::PackageInfo>( + "getPackageInfo", packageName, jint(GET_PERMISSIONS))); + QVERIFY(packageInfo.isValid()); + + m_requestedPermissions = packageInfo.getField<QJniArray<QString>>("requestedPermissions"); + QVERIFY(m_requestedPermissions.isValid()); +} + +void tst_android_permissions::checkExpectedDefaults() +{ + QSet<QString> expectedDefaults{ { "android.permission.INTERNET"_L1 }, + { "android.permission.WRITE_EXTERNAL_STORAGE"_L1 }, + { "android.permission.READ_EXTERNAL_STORAGE"_L1 } }; + + for (const auto &permission : m_requestedPermissions) + expectedDefaults.remove(permission); + + QVERIFY(expectedDefaults.empty()); +} + +void tst_android_permissions::checkNonExisting() +{ + for (const auto &permission : m_requestedPermissions) + QCOMPARE_NE(permission, "android.permission.BLUETOOTH_SCAN"); +} + +void tst_android_permissions::checkNonDefaultPermissions() +{ + bool hasNonDefaultPermissions = false; + for (const auto &permission : m_requestedPermissions) { + if (permission == "android.permission.ACCESS_COARSE_LOCATION") + hasNonDefaultPermissions = true; + } + + QVERIFY(hasNonDefaultPermissions); +} + +QTEST_MAIN(tst_android_permissions); + +#include "tst_android_permissions.moc" 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/tests/auto/testlib/selftests/expected_threewaycompare.junitxml b/tests/auto/testlib/selftests/expected_threewaycompare.junitxml index e10872ef1ba..37551ecd23d 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.junitxml +++ b/tests/auto/testlib/selftests/expected_threewaycompare.junitxml @@ -25,8 +25,8 @@ </testcase> <testcase name="compareFloats(Qt::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 1 - Right (rhs): 1 + <![CDATA[ Left (lhs): 1 (0x1p+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::less]]> </failure> @@ -34,24 +34,24 @@ <testcase name="compareFloats(Qt::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"/> <testcase name="compareFloats(Qt::partial_ordering::greater)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 1.1 - Right (rhs): 1 + <![CDATA[ Left (lhs): 1.1 (0x1.19999ap+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): Qt::partial_ordering::less]]> </failure> </testcase> <testcase name="compareDoubles(Qt::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 0 - Right (rhs): 0 + <![CDATA[ Left (lhs): 0 (0x0p+0) + Right (rhs): 0 (0x0p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::greater]]> </failure> </testcase> <testcase name="compareDoubles(Qt::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 0 - Right (rhs): 0.1 + <![CDATA[ Left (lhs): 0 (0x0p+0) + Right (rhs): 0.1 (0x1.999999999999ap-4) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): Qt::partial_ordering::greater]]> </failure> @@ -161,16 +161,16 @@ </testcase> <testcase name="stdCompareFloats(std::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 2 - Right (rhs): 2 + <![CDATA[ Left (lhs): 2 (0x1p+1) + Right (rhs): 2 (0x1p+1) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::less]]> </failure> </testcase> <testcase name="stdCompareFloats(std::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 2 - Right (rhs): 1.1 + <![CDATA[ Left (lhs): 2 (0x1p+1) + Right (rhs): 1.1 (0x1.19999ap+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): std::partial_ordering::less]]> </failure> @@ -178,16 +178,16 @@ <testcase name="stdCompareFloats(std::partial_ordering::greater)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"/> <testcase name="stdCompareDoubles(std::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 0.15 - Right (rhs): 0.15 + <![CDATA[ Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.15 (0x1.3333333333333p-3) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::greater]]> </failure> </testcase> <testcase name="stdCompareDoubles(std::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (lhs): 0.15 - Right (rhs): 0.25 + <![CDATA[ Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.25 (0x1p-2) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): std::partial_ordering::greater]]> </failure> @@ -288,8 +288,8 @@ </testcase> <testcase name="checkWeakComparison" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"> <failure type="fail" message="The result of operator<=>() is not what was expected"> - <![CDATA[ Left (june) : 2012/06/20 14:33:02.500[CEST] - Right (juneLater): 2012/06/20 14:33:02.501[CEST] + <![CDATA[ Left (june) : 2012/06/20 14:33:02.500[UTC] + Right (juneLater): 2012/06/20 14:33:02.501[UTC] Actual (june <=> juneLater) : std::weak_ordering::less Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]> </failure> diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.lightxml b/tests/auto/testlib/selftests/expected_threewaycompare.lightxml index 75679c5e374..082255a2c41 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.lightxml +++ b/tests/auto/testlib/selftests/expected_threewaycompare.lightxml @@ -33,8 +33,8 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 1 - Right (rhs): 1 + Left (lhs): 1 (0x1p+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::less]]></Description> </Incident> @@ -44,8 +44,8 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::greater]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 1.1 - Right (rhs): 1 + Left (lhs): 1.1 (0x1.19999ap+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): Qt::partial_ordering::less]]></Description> </Incident> @@ -55,16 +55,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0 (0x0p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::greater]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0.1 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0.1 (0x1.999999999999ap-4) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): Qt::partial_ordering::greater]]></Description> </Incident> @@ -209,16 +209,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 2 + Left (lhs): 2 (0x1p+1) + Right (rhs): 2 (0x1p+1) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::less]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 1.1 + Left (lhs): 2 (0x1p+1) + Right (rhs): 1.1 (0x1.19999ap+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): std::partial_ordering::less]]></Description> </Incident> @@ -231,16 +231,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.15 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.15 (0x1.3333333333333p-3) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::greater]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.25 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.25 (0x1p-2) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): std::partial_ordering::greater]]></Description> </Incident> @@ -372,8 +372,8 @@ <TestFunction name="checkWeakComparison"> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (june) : 2012/06/20 14:33:02.500[CEST] - Right (juneLater): 2012/06/20 14:33:02.501[CEST] + Left (june) : 2012/06/20 14:33:02.500[UTC] + Right (juneLater): 2012/06/20 14:33:02.501[UTC] Actual (june <=> juneLater) : std::weak_ordering::less Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]></Description> </Incident> diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.tap b/tests/auto/testlib/selftests/expected_threewaycompare.tap index daeae42c06f..5d464e0e648 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.tap +++ b/tests/auto/testlib/selftests/expected_threewaycompare.tap @@ -27,8 +27,8 @@ not ok 4 - compareInts(Qt::strong_ordering::greater) not ok 5 - compareFloats(Qt::partial_ordering::equivalent) --- # The result of operator<=>() is not what was expected - Left (lhs): 1 - Right (rhs): 1 + Left (lhs): 1 (0x1p+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::less at: tst_ThreeWayCompare::compareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -39,8 +39,8 @@ ok 6 - compareFloats(Qt::partial_ordering::less) not ok 7 - compareFloats(Qt::partial_ordering::greater) --- # The result of operator<=>() is not what was expected - Left (lhs): 1.1 - Right (rhs): 1 + Left (lhs): 1.1 (0x1.19999ap+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): Qt::partial_ordering::less at: tst_ThreeWayCompare::compareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -50,8 +50,8 @@ not ok 7 - compareFloats(Qt::partial_ordering::greater) not ok 8 - compareDoubles(Qt::partial_ordering::equivalent) --- # The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0 (0x0p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::greater at: tst_ThreeWayCompare::compareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -61,8 +61,8 @@ not ok 8 - compareDoubles(Qt::partial_ordering::equivalent) not ok 9 - compareDoubles(Qt::partial_ordering::less) --- # The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0.1 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0.1 (0x1.999999999999ap-4) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): Qt::partial_ordering::greater at: tst_ThreeWayCompare::compareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -211,8 +211,8 @@ not ok 28 - stdCompareInts(std::strong_ordering::greater) not ok 29 - stdCompareFloats(std::partial_ordering::equivalent) --- # The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 2 + Left (lhs): 2 (0x1p+1) + Right (rhs): 2 (0x1p+1) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::less at: tst_ThreeWayCompare::stdCompareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -222,8 +222,8 @@ not ok 29 - stdCompareFloats(std::partial_ordering::equivalent) not ok 30 - stdCompareFloats(std::partial_ordering::less) --- # The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 1.1 + Left (lhs): 2 (0x1p+1) + Right (rhs): 1.1 (0x1.19999ap+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): std::partial_ordering::less at: tst_ThreeWayCompare::stdCompareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -234,8 +234,8 @@ ok 31 - stdCompareFloats(std::partial_ordering::greater) not ok 32 - stdCompareDoubles(std::partial_ordering::equivalent) --- # The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.15 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.15 (0x1.3333333333333p-3) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::greater at: tst_ThreeWayCompare::stdCompareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -245,8 +245,8 @@ not ok 32 - stdCompareDoubles(std::partial_ordering::equivalent) not ok 33 - stdCompareDoubles(std::partial_ordering::less) --- # The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.25 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.25 (0x1p-2) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): std::partial_ordering::greater at: tst_ThreeWayCompare::stdCompareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) @@ -383,8 +383,8 @@ not ok 50 - checkComparisonForTemporaryObjects() not ok 51 - checkWeakComparison() --- # The result of operator<=>() is not what was expected - Left (june) : 2012/06/20 14:33:02.500[CEST] - Right (juneLater): 2012/06/20 14:33:02.501[CEST] + Left (june) : 2012/06/20 14:33:02.500[UTC] + Right (juneLater): 2012/06/20 14:33:02.501[UTC] Actual (june <=> juneLater) : std::weak_ordering::less Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater at: tst_ThreeWayCompare::checkWeakComparison() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0) diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.teamcity b/tests/auto/testlib/selftests/expected_threewaycompare.teamcity index 2eed5bdb422..6b92880418e 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.teamcity +++ b/tests/auto/testlib/selftests/expected_threewaycompare.teamcity @@ -10,18 +10,18 @@ ##teamcity[testFailed name='compareInts(Qt::strong_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::strong_ordering::greater|n Expected (expectedOrder): Qt::strong_ordering::equal' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareInts(Qt::strong_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareFloats(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='compareFloats(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='compareFloats(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1 (0x1p+0)|n Right (rhs): 1 (0x1p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareFloats(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareFloats(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareFloats(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareFloats(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='compareFloats(Qt::partial_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1.1|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='compareFloats(Qt::partial_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1.1 (0x1.19999ap+0)|n Right (rhs): 1 (0x1p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareFloats(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0|n Right (rhs): 0|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0 (0x0p+0)|n Right (rhs): 0 (0x0p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0|n Right (rhs): 0.1|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0 (0x0p+0)|n Right (rhs): 0.1 (0x1.999999999999ap-4)|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] @@ -74,18 +74,18 @@ ##teamcity[testFailed name='stdCompareInts(std::strong_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): -2|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::strong_ordering::less|n Expected (expectedOrder): std::strong_ordering::equal' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareInts(std::strong_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 2|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2 (0x1p+1)|n Right (rhs): 2 (0x1p+1)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::less)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 1.1|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2 (0x1p+1)|n Right (rhs): 1.1 (0x1.19999ap+0)|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::less)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15|n Right (rhs): 0.15|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15 (0x1.3333333333333p-3)|n Right (rhs): 0.15 (0x1.3333333333333p-3)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::less)' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15|n Right (rhs): 0.25|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15 (0x1.3333333333333p-3)|n Right (rhs): 0.25 (0x1p-2)|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::less)' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare'] @@ -133,7 +133,7 @@ ##teamcity[testFailed name='checkComparisonForTemporaryObjects()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (getClassForValue(0).getValuePointer()): MyClass(2) on memory address with index 0|n Right (getClassForValue(1).getValuePointer()): MyClass(1) on memory address with index 1|n Actual (getClassForValue(0).getValuePointer() <=> getClassForValue(1).getValuePointer()): std::strong_ordering::less|n Expected (std::strong_ordering::equal) : std::strong_ordering::equal' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='checkComparisonForTemporaryObjects()' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='checkWeakComparison()' flowId='tst_ThreeWayCompare'] -##teamcity[testFailed name='checkWeakComparison()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (june) : 2012/06/20 14:33:02.500|[CEST|]|n Right (juneLater): 2012/06/20 14:33:02.501|[CEST|]|n Actual (june <=> juneLater) : std::weak_ordering::less|n Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater' flowId='tst_ThreeWayCompare'] +##teamcity[testFailed name='checkWeakComparison()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (june) : 2012/06/20 14:33:02.500|[UTC|]|n Right (juneLater): 2012/06/20 14:33:02.501|[UTC|]|n Actual (june <=> juneLater) : std::weak_ordering::less|n Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='checkWeakComparison()' flowId='tst_ThreeWayCompare'] ##teamcity[testStarted name='cleanupTestCase()' flowId='tst_ThreeWayCompare'] ##teamcity[testFinished name='cleanupTestCase()' flowId='tst_ThreeWayCompare'] diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.txt b/tests/auto/testlib/selftests/expected_threewaycompare.txt index 896cec72819..45496e4420c 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.txt +++ b/tests/auto/testlib/selftests/expected_threewaycompare.txt @@ -15,27 +15,27 @@ FAIL! : tst_ThreeWayCompare::compareInts(Qt::strong_ordering::greater) The resu Expected (expectedOrder): Qt::strong_ordering::equal Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::equivalent) The result of operator<=>() is not what was expected - Left (lhs): 1 - Right (rhs): 1 + Left (lhs): 1 (0x1p+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::less Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] PASS : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::less) FAIL! : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::greater) The result of operator<=>() is not what was expected - Left (lhs): 1.1 - Right (rhs): 1 + Left (lhs): 1.1 (0x1.19999ap+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): Qt::partial_ordering::less Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::compareDoubles(Qt::partial_ordering::equivalent) The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0 (0x0p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::greater Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::compareDoubles(Qt::partial_ordering::less) The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0.1 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0.1 (0x1.999999999999ap-4) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): Qt::partial_ordering::greater Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] @@ -119,27 +119,27 @@ FAIL! : tst_ThreeWayCompare::stdCompareInts(std::strong_ordering::greater) The Expected (expectedOrder): std::strong_ordering::equal Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::equivalent) The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 2 + Left (lhs): 2 (0x1p+1) + Right (rhs): 2 (0x1p+1) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::less Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::less) The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 1.1 + Left (lhs): 2 (0x1p+1) + Right (rhs): 1.1 (0x1.19999ap+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): std::partial_ordering::less Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] PASS : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::greater) FAIL! : tst_ThreeWayCompare::stdCompareDoubles(std::partial_ordering::equivalent) The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.15 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.15 (0x1.3333333333333p-3) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::greater Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::stdCompareDoubles(std::partial_ordering::less) The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.25 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.25 (0x1p-2) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): std::partial_ordering::greater Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] @@ -216,8 +216,8 @@ FAIL! : tst_ThreeWayCompare::checkComparisonForTemporaryObjects() The result of Expected (std::strong_ordering::equal) : std::strong_ordering::equal Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] FAIL! : tst_ThreeWayCompare::checkWeakComparison() The result of operator<=>() is not what was expected - Left (june) : 2012/06/20 14:33:02.500[CEST] - Right (juneLater): 2012/06/20 14:33:02.501[CEST] + Left (june) : 2012/06/20 14:33:02.500[UTC] + Right (juneLater): 2012/06/20 14:33:02.501[UTC] Actual (june <=> juneLater) : std::weak_ordering::less Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)] diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.xml b/tests/auto/testlib/selftests/expected_threewaycompare.xml index 5e8f1f93bac..a3f4d38ee5a 100644 --- a/tests/auto/testlib/selftests/expected_threewaycompare.xml +++ b/tests/auto/testlib/selftests/expected_threewaycompare.xml @@ -35,8 +35,8 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 1 - Right (rhs): 1 + Left (lhs): 1 (0x1p+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::less]]></Description> </Incident> @@ -46,8 +46,8 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::greater]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 1.1 - Right (rhs): 1 + Left (lhs): 1.1 (0x1.19999ap+0) + Right (rhs): 1 (0x1p+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): Qt::partial_ordering::less]]></Description> </Incident> @@ -57,16 +57,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0 (0x0p+0) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): Qt::partial_ordering::greater]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[Qt::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0 - Right (rhs): 0.1 + Left (lhs): 0 (0x0p+0) + Right (rhs): 0.1 (0x1.999999999999ap-4) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): Qt::partial_ordering::greater]]></Description> </Incident> @@ -211,16 +211,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 2 + Left (lhs): 2 (0x1p+1) + Right (rhs): 2 (0x1p+1) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::less]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 2 - Right (rhs): 1.1 + Left (lhs): 2 (0x1p+1) + Right (rhs): 1.1 (0x1.19999ap+0) Actual (lhs <=> rhs) : std::partial_ordering::greater Expected (expectedOrder): std::partial_ordering::less]]></Description> </Incident> @@ -233,16 +233,16 @@ <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.15 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.15 (0x1.3333333333333p-3) Actual (lhs <=> rhs) : std::partial_ordering::equivalent Expected (expectedOrder): std::partial_ordering::greater]]></Description> </Incident> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <DataTag><![CDATA[std::partial_ordering::less]]></DataTag> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (lhs): 0.15 - Right (rhs): 0.25 + Left (lhs): 0.15 (0x1.3333333333333p-3) + Right (rhs): 0.25 (0x1p-2) Actual (lhs <=> rhs) : std::partial_ordering::less Expected (expectedOrder): std::partial_ordering::greater]]></Description> </Incident> @@ -374,8 +374,8 @@ <TestFunction name="checkWeakComparison"> <Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0"> <Description><![CDATA[The result of operator<=>() is not what was expected - Left (june) : 2012/06/20 14:33:02.500[CEST] - Right (juneLater): 2012/06/20 14:33:02.501[CEST] + Left (june) : 2012/06/20 14:33:02.500[UTC] + Right (juneLater): 2012/06/20 14:33:02.501[UTC] Actual (june <=> juneLater) : std::weak_ordering::less Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]></Description> </Incident> diff --git a/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp b/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp index bcc544d33a1..4a290f9f2fb 100644 --- a/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp +++ b/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp @@ -231,7 +231,7 @@ void tst_ThreeWayCompare::checkWeakComparison() QCOMPARE_3WAY(example_left, example_right, std::weak_ordering::less); - QDateTime june(QDate(2012, 6, 20), QTime(14, 33, 2, 500)); + QDateTime june(QDate(2012, 6, 20), QTime(14, 33, 2, 500), QTimeZone::UTC); QDateTime juneLater = june.addMSecs(1); QCOMPARE_3WAY(june, juneLater, Qt::weak_ordering::greater); #endif diff --git a/tests/auto/tools/moc/CMakeLists.txt b/tests/auto/tools/moc/CMakeLists.txt index 13f22ced0fc..037488095b1 100644 --- a/tests/auto/tools/moc/CMakeLists.txt +++ b/tests/auto/tools/moc/CMakeLists.txt @@ -66,6 +66,8 @@ qt_wrap_cpp(comparison_relevant_moc_list ${JSON_HEADERS} "-DDEFINE_CMDLINE_EMPTY=" "-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)" "--output-json" + DEPENDS + ${QT_CMAKE_EXPORT_NAMESPACE}::moc ) list(TRANSFORM comparison_relevant_moc_list APPEND ".json" OUTPUT_VARIABLE moc_json_files) diff --git a/tests/auto/tools/moc/allmocs_baseline_in.json b/tests/auto/tools/moc/allmocs_baseline_in.json index c3425c6d15f..3dcecc1002d 100644 --- a/tests/auto/tools/moc/allmocs_baseline_in.json +++ b/tests/auto/tools/moc/allmocs_baseline_in.json @@ -10,6 +10,7 @@ { "access": "public", "index": 0, + "lineNumber": 21, "name": "works", "returnType": "void" } @@ -51,6 +52,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 12, "name": "Baz", "values": [ "Foo", @@ -60,6 +62,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 13, "name": "Baz2", "values": [ "Foo2", @@ -83,6 +86,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 12, "name": "EnumClass", "values": [ "A0", @@ -94,6 +98,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 13, "name": "TypedEnum", "type": "char", "values": [ @@ -106,6 +111,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 14, "name": "TypedEnumClass", "type": "char", "values": [ @@ -118,6 +124,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 15, "name": "NormalEnum", "values": [ "D2", @@ -130,6 +137,7 @@ "alias": "ClassFlag", "isClass": true, "isFlag": true, + "lineNumber": 16, "name": "ClassFlags", "values": [ "F0", @@ -141,6 +149,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 18, "name": "EnumStruct", "values": [ "G0", @@ -152,6 +161,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 19, "name": "TypedEnumStruct", "type": "char", "values": [ @@ -165,6 +175,7 @@ "alias": "StructFlag", "isClass": true, "isFlag": true, + "lineNumber": 20, "name": "StructFlags", "values": [ "I0", @@ -184,6 +195,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 40, "name": "EnumClass", "values": [ "A0", @@ -195,6 +207,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 41, "name": "TypedEnum", "type": "char", "values": [ @@ -207,6 +220,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 42, "name": "TypedEnumClass", "type": "char", "values": [ @@ -219,6 +233,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 43, "name": "NormalEnum", "values": [ "D2", @@ -231,6 +246,7 @@ "alias": "ClassFlag", "isClass": true, "isFlag": true, + "lineNumber": 44, "name": "ClassFlags", "values": [ "F0", @@ -250,6 +266,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 54, "name": "EnumClass", "values": [ "A0", @@ -261,6 +278,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 55, "name": "TypedEnum", "type": "char", "values": [ @@ -273,6 +291,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 56, "name": "TypedEnumClass", "type": "char", "values": [ @@ -285,6 +304,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 57, "name": "NormalEnum", "values": [ "D2", @@ -319,12 +339,14 @@ { "access": "private", "index": 0, + "lineNumber": 25, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 26, "name": "pureSlot1", "returnType": "void" }, @@ -332,6 +354,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 27, "name": "pureSlot2", "returnType": "void" }, @@ -339,6 +362,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 28, "name": "pureSlot3", "returnType": "void" } @@ -359,12 +383,14 @@ { "access": "private", "index": 0, + "lineNumber": 47, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 48, "name": "pureSlot1", "returnType": "void" }, @@ -372,6 +398,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 49, "name": "pureSlot2", "returnType": "void" }, @@ -379,6 +406,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 50, "name": "pureSlot3", "returnType": "void" } @@ -399,12 +427,14 @@ { "access": "private", "index": 0, + "lineNumber": 69, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 70, "name": "pureSlot1", "returnType": "void" }, @@ -412,6 +442,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 71, "name": "pureSlot2", "returnType": "void" }, @@ -419,6 +450,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 72, "name": "pureSlot3", "returnType": "void" } @@ -439,12 +471,14 @@ { "access": "private", "index": 0, + "lineNumber": 91, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 92, "name": "pureSlot1", "returnType": "void" }, @@ -452,6 +486,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 93, "name": "pureSlot2", "returnType": "void" }, @@ -459,6 +494,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 94, "name": "pureSlot3", "returnType": "void" } @@ -479,12 +515,14 @@ { "access": "private", "index": 0, + "lineNumber": 113, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 114, "name": "pureSlot1", "returnType": "void" }, @@ -492,6 +530,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 115, "name": "pureSlot2", "returnType": "void" }, @@ -499,6 +538,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 116, "name": "pureSlot3", "returnType": "void" } @@ -519,12 +559,14 @@ { "access": "private", "index": 0, + "lineNumber": 135, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 136, "name": "pureSlot1", "returnType": "void" }, @@ -532,6 +574,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 137, "name": "pureSlot2", "returnType": "void" }, @@ -539,6 +582,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 138, "name": "pureSlot3", "returnType": "void" } @@ -559,12 +603,14 @@ { "access": "private", "index": 0, + "lineNumber": 157, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 158, "name": "pureSlot1", "returnType": "void" }, @@ -572,6 +618,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 159, "name": "pureSlot2", "returnType": "void" }, @@ -579,6 +626,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 160, "name": "pureSlot3", "returnType": "void" } @@ -599,12 +647,14 @@ { "access": "private", "index": 0, + "lineNumber": 179, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 180, "name": "pureSlot1", "returnType": "void" }, @@ -612,6 +662,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 181, "name": "pureSlot2", "returnType": "void" }, @@ -619,6 +670,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 182, "name": "pureSlot3", "returnType": "void" } @@ -639,12 +691,14 @@ { "access": "private", "index": 0, + "lineNumber": 201, "name": "pureSlot0", "returnType": "void" }, { "access": "private", "index": 1, + "lineNumber": 202, "name": "pureSlot1", "returnType": "void" }, @@ -652,6 +706,7 @@ "access": "private", "index": 2, "isConst": true, + "lineNumber": 203, "name": "pureSlot2", "returnType": "void" }, @@ -659,6 +714,7 @@ "access": "private", "index": 3, "isConst": true, + "lineNumber": 204, "name": "pureSlot3", "returnType": "void" } @@ -805,6 +861,7 @@ } ], "index": 0, + "lineNumber": 30, "name": "trailingSignalReturn", "returnType": "void" } @@ -813,6 +870,7 @@ { "access": "public", "index": 1, + "lineNumber": 12, "name": "fun", "returnType": "void" }, @@ -829,6 +887,7 @@ } ], "index": 2, + "lineNumber": 13, "name": "arguments", "returnType": "int" }, @@ -841,12 +900,14 @@ } ], "index": 3, + "lineNumber": 14, "name": "inlineFunc", "returnType": "int" }, { "access": "public", "index": 4, + "lineNumber": 19, "name": "constRefReturn", "returnType": "void" }, @@ -854,6 +915,7 @@ "access": "public", "index": 5, "isConst": true, + "lineNumber": 24, "name": "constConstRefReturn", "returnType": "void" } @@ -877,6 +939,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 23, "name": "GadEn", "values": [ "Value" @@ -893,6 +956,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 27, "name": "NamEn", "values": [ "Value" @@ -1003,6 +1067,7 @@ } ], "index": 0, + "lineNumber": 35, "name": "signalNaked", "returnType": "void" }, @@ -1014,6 +1079,7 @@ } ], "index": 1, + "lineNumber": 36, "name": "signalFDC", "returnType": "void" }, @@ -1025,6 +1091,7 @@ } ], "index": 2, + "lineNumber": 37, "name": "signalFDC", "returnType": "void" }, @@ -1036,6 +1103,7 @@ } ], "index": 3, + "lineNumber": 38, "name": "signalFDC", "returnType": "void" }, @@ -1047,6 +1115,7 @@ } ], "index": 4, + "lineNumber": 39, "name": "signalFDC", "returnType": "void" }, @@ -1058,6 +1127,7 @@ } ], "index": 5, + "lineNumber": 40, "name": "signalQSet", "returnType": "void" }, @@ -1069,6 +1139,7 @@ } ], "index": 6, + "lineNumber": 41, "name": "signalQSet", "returnType": "void" }, @@ -1080,6 +1151,7 @@ } ], "index": 7, + "lineNumber": 42, "name": "signalQSet", "returnType": "void" }, @@ -1091,6 +1163,7 @@ } ], "index": 8, + "lineNumber": 43, "name": "signalQSet", "returnType": "void" } @@ -1104,6 +1177,7 @@ } ], "index": 9, + "lineNumber": 24, "name": "slotNaked", "returnType": "void" }, @@ -1115,6 +1189,7 @@ } ], "index": 10, + "lineNumber": 25, "name": "slotFDC", "returnType": "void" }, @@ -1126,6 +1201,7 @@ } ], "index": 11, + "lineNumber": 26, "name": "slotFDC", "returnType": "void" }, @@ -1137,6 +1213,7 @@ } ], "index": 12, + "lineNumber": 27, "name": "slotFDC", "returnType": "void" }, @@ -1148,6 +1225,7 @@ } ], "index": 13, + "lineNumber": 28, "name": "slotFDC", "returnType": "void" }, @@ -1159,6 +1237,7 @@ } ], "index": 14, + "lineNumber": 29, "name": "slotQSet", "returnType": "void" }, @@ -1170,6 +1249,7 @@ } ], "index": 15, + "lineNumber": 30, "name": "slotQSet", "returnType": "void" }, @@ -1181,6 +1261,7 @@ } ], "index": 16, + "lineNumber": 31, "name": "slotQSet", "returnType": "void" }, @@ -1192,6 +1273,7 @@ } ], "index": 17, + "lineNumber": 32, "name": "slotQSet", "returnType": "void" } @@ -1218,12 +1300,14 @@ { "access": "public", "index": 0, + "lineNumber": 26, "name": "test1", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 27, "name": "test2", "returnType": "void" } @@ -1253,6 +1337,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 22, "name": "FooEnum", "values": [ "FooValue" @@ -1321,6 +1406,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 23, "name": "prop1", "read": "getProp1", "required": false, @@ -1335,6 +1421,7 @@ "designable": true, "final": false, "index": 1, + "lineNumber": 24, "name": "prop2", "read": "getProp2", "required": false, @@ -1349,6 +1436,7 @@ "designable": true, "final": false, "index": 2, + "lineNumber": 25, "name": "prop3", "read": "getProp3", "required": false, @@ -1385,6 +1473,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 14, "name": "Enum1", "values": [ "Key1", @@ -1402,6 +1491,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 22, "name": "Enum2", "values": [ "Key3", @@ -1411,6 +1501,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 35, "name": "Enum3", "values": [ "Key5", @@ -1428,6 +1519,7 @@ { "isClass": true, "isFlag": false, + "lineNumber": 43, "name": "Enum4", "values": [ "Key7", @@ -1483,6 +1575,7 @@ "alias": "Flag", "isClass": false, "isFlag": true, + "lineNumber": 15, "name": "Flags", "values": [ "Read", @@ -1498,6 +1591,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 11, "name": "flags", "read": "flags", "required": false, @@ -1526,6 +1620,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 30, "name": "flags", "read": "flags", "required": false, @@ -1540,6 +1635,7 @@ "designable": true, "final": false, "index": 1, + "lineNumber": 31, "name": "flagsList", "read": "flagsList", "required": false, @@ -1573,6 +1669,7 @@ { "access": "public", "index": 0, + "lineNumber": 41, "name": "mySignal", "returnType": "void" } @@ -1581,6 +1678,7 @@ { "access": "public", "index": 1, + "lineNumber": 44, "name": "mySlot", "returnType": "void" } @@ -1625,6 +1723,7 @@ { "access": "public", "index": 0, + "lineNumber": 17, "name": "foo", "returnType": "void" }, @@ -1648,6 +1747,7 @@ } ], "index": 1, + "lineNumber": 18, "name": "bar", "returnType": "int" }, @@ -1662,6 +1762,7 @@ } ], "index": 2, + "lineNumber": 19, "name": "slot", "returnType": "void" } @@ -1708,12 +1809,14 @@ } ], "index": 0, + "lineNumber": 105, "name": "cmdlineSignal", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 109, "name": "signalQTBUG55853", "returnType": "void" } @@ -1722,30 +1825,35 @@ { "access": "public", "index": 2, + "lineNumber": 64, "name": "voidFunction", "returnType": "void" }, { "access": "public", "index": 3, + "lineNumber": 66, "name": "stringMethod", "returnType": "QString" }, { "access": "public", "index": 4, + "lineNumber": 68, "name": "combined1", "returnType": "void" }, { "access": "public", "index": 5, + "lineNumber": 69, "name": "combined2", "returnType": "void" }, { "access": "public", "index": 6, + "lineNumber": 70, "name": "combined3", "returnType": "void" }, @@ -1760,24 +1868,28 @@ } ], "index": 7, + "lineNumber": 71, "name": "combined4", "returnType": "void" }, { "access": "public", "index": 8, + "lineNumber": 73, "name": "combined5", "returnType": "void" }, { "access": "public", "index": 9, + "lineNumber": 75, "name": "combined6", "returnType": "void" }, { "access": "public", "index": 10, + "lineNumber": 77, "name": "vararg1", "returnType": "void" }, @@ -1789,6 +1901,7 @@ } ], "index": 11, + "lineNumber": 78, "name": "vararg2", "returnType": "void" }, @@ -1803,12 +1916,14 @@ } ], "index": 12, + "lineNumber": 79, "name": "vararg3", "returnType": "void" }, { "access": "public", "index": 13, + "lineNumber": 81, "name": "vararg4", "returnType": "void" }, @@ -1820,6 +1935,7 @@ } ], "index": 14, + "lineNumber": 82, "name": "vararg5", "returnType": "void" }, @@ -1834,6 +1950,7 @@ } ], "index": 15, + "lineNumber": 83, "name": "vararg6", "returnType": "void" }, @@ -1845,6 +1962,7 @@ } ], "index": 16, + "lineNumber": 89, "name": "INNERFUNCTION", "returnType": "void" }, @@ -1856,6 +1974,7 @@ } ], "index": 17, + "lineNumber": 90, "name": "inner_expanded", "returnType": "void" }, @@ -1867,12 +1986,14 @@ } ], "index": 18, + "lineNumber": 91, "name": "expanded_method", "returnType": "void" }, { "access": "public", "index": 19, + "lineNumber": 99, "name": "conditionSlot", "returnType": "void" }, @@ -1884,6 +2005,7 @@ } ], "index": 20, + "lineNumber": 102, "name": "PD_DEFINE_ITSELF_SUFFIX", "returnType": "void" } @@ -1933,6 +2055,7 @@ } ], "index": 0, + "lineNumber": 18, "name": "setProp1", "returnType": "void" }, @@ -1944,6 +2067,7 @@ } ], "index": 1, + "lineNumber": 19, "name": "setProp2", "returnType": "void" }, @@ -1955,6 +2079,7 @@ } ], "index": 2, + "lineNumber": 20, "name": "setProp3", "returnType": "void" }, @@ -1966,6 +2091,7 @@ } ], "index": 3, + "lineNumber": 21, "name": "setProp4", "returnType": "void" }, @@ -1977,6 +2103,7 @@ } ], "index": 4, + "lineNumber": 22, "name": "setProp5", "returnType": "void" }, @@ -1988,6 +2115,7 @@ } ], "index": 5, + "lineNumber": 23, "name": "setProp6", "returnType": "void" }, @@ -1999,6 +2127,7 @@ } ], "index": 6, + "lineNumber": 24, "name": "setProp7", "returnType": "void" } @@ -2025,12 +2154,14 @@ { "access": "public", "index": 0, + "lineNumber": 13, "name": "mySignal", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 14, "name": "myOtherSignal", "returnType": "void" }, @@ -2043,6 +2174,7 @@ } ], "index": 2, + "lineNumber": 15, "name": "mySignal2", "returnType": "void" } @@ -2063,6 +2195,7 @@ { "access": "public", "index": 0, + "lineNumber": 23, "name": "mySignal", "returnType": "void" }, @@ -2075,6 +2208,7 @@ } ], "index": 1, + "lineNumber": 24, "name": "mySignal2", "returnType": "void" } @@ -2098,6 +2232,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 12, "name": "LargeEnum", "type": "qint64", "values": [ @@ -2124,6 +2259,7 @@ "alias": "LargeFlag", "isClass": false, "isFlag": true, + "lineNumber": 24, "name": "LargeFlags", "type": "qint64", "values": [ @@ -2136,6 +2272,7 @@ "alias": "ScopedLargeFlag", "isClass": true, "isFlag": true, + "lineNumber": 32, "name": "ScopedLargeFlags", "type": "quint64", "values": [ @@ -2169,6 +2306,7 @@ "access": "public", "index": 0, "isConst": true, + "lineNumber": 0, "name": "foo", "returnType": "const char*" } @@ -2189,12 +2327,14 @@ { "access": "public", "index": 0, + "lineNumber": 0, "name": "foo", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 0, "name": "bar", "returnType": "void" } @@ -2235,6 +2375,7 @@ } ], "index": 0, + "lineNumber": 17, "name": "f", "returnType": "void" } @@ -2259,6 +2400,7 @@ { "access": "private", "index": 1, + "lineNumber": 0, "name": "method1", "returnType": "void" } @@ -2269,6 +2411,7 @@ { "access": "private", "index": 0, + "lineNumber": 21, "name": "_q_privateslot", "returnType": "void" } @@ -2292,6 +2435,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 14, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2318,6 +2462,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 14, "name": "blah", "read": "blah", "required": false, @@ -2347,6 +2492,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 14, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2373,6 +2519,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 20, "name": "blah", "read": "blah", "required": false, @@ -2402,6 +2549,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 48, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2418,6 +2566,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 48, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2440,6 +2589,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 53, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2456,6 +2606,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 53, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2478,6 +2629,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 57, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2494,6 +2646,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 57, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2516,6 +2669,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 60, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2532,6 +2686,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 60, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2558,6 +2713,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 61, "name": "gadgetPoperty", "read": "gadgetPoperty", "required": false, @@ -2571,6 +2727,7 @@ "designable": true, "final": false, "index": 1, + "lineNumber": 61, "name": "objectPoperty", "read": "objectPoperty", "required": false, @@ -2598,6 +2755,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 61, "name": "nestedGadgetPoperty", "read": "nestedGadgetPoperty", "required": false, @@ -2625,6 +2783,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 61, "name": "nestedObjectPoperty", "read": "nestedObjectPoperty", "required": false, @@ -2648,6 +2807,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 67, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2664,6 +2824,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 67, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2686,6 +2847,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 71, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2702,6 +2864,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 71, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2724,6 +2887,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 74, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2740,6 +2904,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 74, "name": "SomeEnum", "values": [ "SomeEnumValue" @@ -2766,6 +2931,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 75, "name": "gadgetPoperty", "read": "gadgetPoperty", "required": false, @@ -2779,6 +2945,7 @@ "designable": true, "final": false, "index": 1, + "lineNumber": 75, "name": "objectPoperty", "read": "objectPoperty", "required": false, @@ -2806,6 +2973,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 75, "name": "nestedGadgetPoperty", "read": "nestedGadgetPoperty", "required": false, @@ -2833,6 +3001,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 75, "name": "nestedObjectPoperty", "read": "nestedObjectPoperty", "required": false, @@ -2871,6 +3040,7 @@ } ], "index": 0, + "lineNumber": 13, "name": "signalWithDefaultArg", "returnType": "void" }, @@ -2878,6 +3048,7 @@ "access": "public", "index": 1, "isCloned": true, + "lineNumber": 13, "name": "signalWithDefaultArg", "returnType": "void" } @@ -2901,6 +3072,7 @@ { "isClass": false, "isFlag": false, + "lineNumber": 16, "name": "Salaries", "values": [ "Steve" @@ -2937,18 +3109,21 @@ } ], "index": 0, + "lineNumber": 23, "name": "mySignal", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 24, "name": "myVoidSignal", "returnType": "void" }, { "access": "public", "index": 2, + "lineNumber": 25, "name": "myVoidSignal2", "returnType": "void" } @@ -2957,12 +3132,14 @@ { "access": "public", "index": 3, + "lineNumber": 18, "name": "dummySlot", "returnType": "void" }, { "access": "public", "index": 4, + "lineNumber": 19, "name": "dummySlot2", "returnType": "void" }, @@ -2974,12 +3151,14 @@ } ], "index": 5, + "lineNumber": 20, "name": "anotherSlot", "returnType": "void" }, { "access": "public", "index": 6, + "lineNumber": 21, "name": "mySlot", "returnType": "TestTemplate<void>" } @@ -3059,6 +3238,7 @@ } ], "index": 0, + "lineNumber": 19, "name": "a", "returnType": "void" }, @@ -3071,6 +3251,7 @@ } ], "index": 1, + "lineNumber": 20, "name": "b", "returnType": "void" }, @@ -3082,6 +3263,7 @@ } ], "index": 2, + "lineNumber": 21, "name": "c", "returnType": "void" }, @@ -3094,6 +3276,7 @@ } ], "index": 3, + "lineNumber": 22, "name": "d", "returnType": "void" }, @@ -3105,6 +3288,7 @@ } ], "index": 4, + "lineNumber": 23, "name": "e", "returnType": "void" }, @@ -3117,6 +3301,7 @@ } ], "index": 5, + "lineNumber": 24, "name": "f", "returnType": "void" }, @@ -3128,6 +3313,7 @@ } ], "index": 6, + "lineNumber": 25, "name": "g", "returnType": "void" }, @@ -3140,6 +3326,7 @@ } ], "index": 7, + "lineNumber": 26, "name": "h", "returnType": "void" }, @@ -3154,6 +3341,7 @@ } ], "index": 8, + "lineNumber": 27, "name": "i", "returnType": "void" }, @@ -3168,6 +3356,7 @@ } ], "index": 9, + "lineNumber": 28, "name": "j", "returnType": "void" }, @@ -3179,6 +3368,7 @@ } ], "index": 10, + "lineNumber": 29, "name": "k", "returnType": "void" }, @@ -3191,6 +3381,7 @@ } ], "index": 11, + "lineNumber": 30, "name": "l", "returnType": "void" } @@ -3233,6 +3424,7 @@ { "access": "public", "index": 4, + "lineNumber": 0, "name": "myTPInvokable1", "returnType": "void", "tag": "QT_TECH_PREVIEW_API" @@ -3240,6 +3432,7 @@ { "access": "public", "index": 5, + "lineNumber": 0, "name": "myTPInvokable2", "returnType": "void", "tag": "QT_TECH_PREVIEW_API" @@ -3252,6 +3445,7 @@ "designable": true, "final": false, "index": 0, + "lineNumber": 19, "member": "m_status", "name": "status", "required": false, @@ -3266,12 +3460,14 @@ { "access": "public", "index": 0, + "lineNumber": 38, "name": "mySignal", "returnType": "void" }, { "access": "public", "index": 1, + "lineNumber": 39, "name": "myTPSignal", "returnType": "void", "tag": "QT_TECH_PREVIEW_API" @@ -3281,12 +3477,14 @@ { "access": "public", "index": 2, + "lineNumber": 42, "name": "mySlot", "returnType": "void" }, { "access": "public", "index": 3, + "lineNumber": 43, "name": "myTPSlot", "returnType": "void", "tag": "QT_TECH_PREVIEW_API" @@ -3319,6 +3517,7 @@ } ], "index": 0, + "lineNumber": 19, "name": "foo", "returnType": "void" }, @@ -3330,6 +3529,7 @@ } ], "index": 1, + "lineNumber": 20, "name": "foo2", "returnType": "void" }, @@ -3341,6 +3541,7 @@ } ], "index": 2, + "lineNumber": 23, "name": "bar", "returnType": "void" }, @@ -3352,6 +3553,7 @@ } ], "index": 3, + "lineNumber": 24, "name": "bar2", "returnType": "void" }, @@ -3363,6 +3565,7 @@ } ], "index": 4, + "lineNumber": 25, "name": "bar3", "returnType": "void" } diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist b/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist new file mode 100644 index 00000000000..5468597e2b4 --- /dev/null +++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist @@ -0,0 +1 @@ +<invalid> diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro b/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro new file mode 100644 index 00000000000..0230f9c6736 --- /dev/null +++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro @@ -0,0 +1,2 @@ +SOURCES += main.cpp +QMAKE_INFO_PLIST = Info.plist diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp b/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp new file mode 100644 index 00000000000..905869dfa38 --- /dev/null +++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/tests/auto/tools/qmake/tst_qmake.cpp b/tests/auto/tools/qmake/tst_qmake.cpp index 278cf4ad232..080f0abbdaa 100644 --- a/tests/auto/tools/qmake/tst_qmake.cpp +++ b/tests/auto/tools/qmake/tst_qmake.cpp @@ -47,6 +47,7 @@ private slots: void rawString(); #if defined(Q_OS_DARWIN) void bundle_spaces(); + void invalid_info_plist(); #elif defined(Q_OS_WIN) void windowsResources(); #endif @@ -534,6 +535,23 @@ void tst_qmake::bundle_spaces() QVERIFY( test_compiler.removeMakefile(workDir) ); } +void tst_qmake::invalid_info_plist() +{ + QString workDir = base_path + "/testdata/invalid-info-plist"; + + // We set up alternate arguments here, to make sure we're testing Mac + // Bundles. We need to actually run make to check whether the failing + // plutil invocation breaks the build. + + test_compiler.setArguments(QStringList(), + QStringList() << "-spec" << "macx-clang"); + + QVERIFY( test_compiler.qmake(workDir, "invalid-info-plist") ); + + // Make fails: plutil fails to parse the Info.plist file + QVERIFY( test_compiler.make(workDir, QString(), true) ); +} + #elif defined(Q_OS_WIN) // defined(Q_OS_DARWIN) void tst_qmake::windowsResources() diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST index aca3147b2d6..fde971443d4 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST +++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST @@ -1,3 +1,2 @@ [layoutDirection] ubuntu-22.04 -ubuntu-24.04 diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp index 03be7aa0fe9..b651668cabd 100644 --- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp @@ -213,6 +213,7 @@ private slots: void storeRestoreLowMemoryMode(); void setSectionResizeModeWithSectionWillTakeMemory(); void setModelWithAutoSizeWillSwitchToMemoryMode(); + void tableViewResizeSectionsWillSwitchToMemoryMode(); void setDefaultSectionSizeRespectsColumnWidth(); @@ -3559,12 +3560,17 @@ struct TableViewWithBasicModel : public QTableView emptyState = verticalHeader()->saveState(); setModel(&m); header = verticalHeader(); + horizontal_header = horizontalHeader(); } bool hasLowMemoryUsage() const { return emptyState.size() == header->saveState().size(); } + bool horizontalLowMememorUsage() const { + return emptyState.size() == horizontal_header->saveState().size(); + } + bool hasHigherMemoryUsage() const { const int delta = 1000; return header->saveState().size() > delta + emptyState.size(); @@ -3572,6 +3578,7 @@ struct TableViewWithBasicModel : public QTableView BasicModel m; QHeaderView *header; + QHeaderView *horizontal_header; QByteArray emptyState; }; @@ -3770,6 +3777,15 @@ void tst_QHeaderView::setModelWithAutoSizeWillSwitchToMemoryMode() QCOMPARE_GT(nonEmptyState.size(), emptyState.size() + delta); } +void tst_QHeaderView::tableViewResizeSectionsWillSwitchToMemoryMode() +{ + TableViewWithBasicModel tv; + QVERIFY(tv.horizontalLowMememorUsage()); + tv.horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); + tv.resizeColumnsToContents(); + QVERIFY(!tv.horizontalLowMememorUsage()); +} + void tst_QHeaderView::setDefaultSectionSizeRespectsColumnWidth() { QTreeWidget tree; diff --git a/tests/auto/widgets/kernel/qapplication/BLACKLIST b/tests/auto/widgets/kernel/qapplication/BLACKLIST deleted file mode 100644 index c68c7d6b149..00000000000 --- a/tests/auto/widgets/kernel/qapplication/BLACKLIST +++ /dev/null @@ -1,3 +0,0 @@ -[touchEventPropagation] -# QTBUG-66745 -opensuse-leap diff --git a/tests/manual/rhi/rhiwidgetproto/examplewidget.cpp b/tests/manual/rhi/rhiwidgetproto/examplewidget.cpp index 6a6fd5b326e..34765c2e784 100644 --- a/tests/manual/rhi/rhiwidgetproto/examplewidget.cpp +++ b/tests/manual/rhi/rhiwidgetproto/examplewidget.cpp @@ -3,8 +3,11 @@ #include "examplewidget.h" #include "../shared/cube.h" + #include <QFile> + #include <QPainter> +#include <QtGui/qquaternion.h> static const QSize CUBE_TEX_SIZE(512, 512); diff --git a/tests/manual/stereographicsview/mygraphicsview.cpp b/tests/manual/stereographicsview/mygraphicsview.cpp index 933ee008354..5401baf862b 100644 --- a/tests/manual/stereographicsview/mygraphicsview.cpp +++ b/tests/manual/stereographicsview/mygraphicsview.cpp @@ -2,9 +2,12 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "mygraphicsview.h" + #include <QResizeEvent> #include <QFileDialog> +#include <QtGui/qquaternion.h> + Q_OPENGL_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); MyGraphicsView::MyGraphicsView(QWidget *parent) : 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() |