summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmake/FindBundletool.cmake48
-rw-r--r--cmake/QtAndroidHelpers.cmake30
-rw-r--r--cmake/QtBaseHelpers.cmake3
-rw-r--r--cmake/QtFeature.cmake3
-rw-r--r--cmake/QtFlagHandlingHelpers.cmake4
-rw-r--r--cmake/QtFrameworkHelpers.cmake6
-rw-r--r--cmake/QtInternalTargets.cmake19
-rw-r--r--cmake/QtModuleHelpers.cmake5
-rw-r--r--cmake/QtPlatformAndroid.cmake30
-rw-r--r--cmake/QtPostProcessHelpers.cmake2
-rw-r--r--cmake/QtPublicWasmToolchainHelpers.cmake2
-rw-r--r--cmake/QtTestHelpers.cmake7
-rw-r--r--coin/instructions/cmake_run_ctest.yaml2
-rw-r--r--coin/instructions/prepare_building_env.yaml20
-rw-r--r--configure.cmake28
-rw-r--r--doc/global/includes/cli-build-cmake.qdocinc2
-rw-r--r--examples/widgets/rhi/cuberhiwidget/examplewidget.cpp2
-rw-r--r--licenseRule.json2
-rw-r--r--mkspecs/common/clang.conf2
-rw-r--r--mkspecs/common/g++-base.conf2
-rw-r--r--mkspecs/common/msvc-version.conf1
-rw-r--r--mkspecs/features/default_post.prf9
-rw-r--r--mkspecs/features/wasm/emcc_ver.prf2
-rw-r--r--qmake/generators/unix/unixmake2.cpp4
-rw-r--r--qt_cmdline.cmake7
-rw-r--r--src/3rdparty/gradle/gradle.properties3
-rw-r--r--src/3rdparty/libpng/ANNOUNCE26
-rw-r--r--src/3rdparty/libpng/CHANGES6
-rw-r--r--src/3rdparty/libpng/INSTALL10
-rw-r--r--src/3rdparty/libpng/README4
-rw-r--r--src/3rdparty/libpng/libpng-manual.txt2
-rw-r--r--src/3rdparty/libpng/png.c4
-rw-r--r--src/3rdparty/libpng/png.h51
-rw-r--r--src/3rdparty/libpng/pngconf.h2
-rw-r--r--src/3rdparty/libpng/pnglibconf.h2
-rw-r--r--src/3rdparty/libpng/pngpriv.h50
-rw-r--r--src/3rdparty/libpng/pngread.c3
-rw-r--r--src/3rdparty/libpng/pngrtran.c6
-rw-r--r--src/3rdparty/libpng/pngstruct.h3
-rw-r--r--src/3rdparty/libpng/qt_attribution.json4
-rw-r--r--src/3rdparty/sqlite/qt_attribution.json4
-rw-r--r--src/3rdparty/sqlite/sqlite3.c199
-rw-r--r--src/3rdparty/sqlite/sqlite3.h92
-rwxr-xr-xsrc/3rdparty/sqlite/update_sqlite.sh2
-rw-r--r--src/android/CMakeLists.txt1
-rw-r--r--src/android/REUSE.toml2
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java9
-rw-r--r--src/android/templates/build.gradle2
-rw-r--r--src/android/templates_cmake/CMakeLists.txt46
-rw-r--r--src/android/templates_cmake/app/AndroidManifest.xml.in54
-rw-r--r--src/android/templates_cmake/app/build.gradle.in53
-rw-r--r--src/android/templates_cmake/app/gradle.properties.in1
-rw-r--r--src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in15
-rw-r--r--src/android/templates_cmake/dynamic_feature/build.gradle.in53
-rw-r--r--src/android/templates_cmake/gradle.properties.in12
-rw-r--r--src/android/templates_cmake/settings.gradle.in18
-rw-r--r--src/assets/CMakeLists.txt1
-rw-r--r--src/assets/icons/128x128/document-new.pngbin1258 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-open.pngbin1855 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-print.pngbin1576 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-save.pngbin1298 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-copy.pngbin1480 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-cut.pngbin2012 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-delete.pngbin2665 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-paste.pngbin1892 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-redo.pngbin1239 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-undo.pngbin1233 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-center.pngbin663 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-fill.pngbin506 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-left.pngbin603 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-right.pngbin634 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-bold.pngbin1459 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-italic.pngbin1158 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-underline.pngbin1263 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2541 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3865 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3721 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2682 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3467 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin5004 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin5870 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin4005 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2528 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2530 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1599 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1475 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1539 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1557 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3092 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2374 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2477 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-new.pngbin241 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-open.pngbin286 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-print.pngbin261 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-save.pngbin224 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-copy.pngbin216 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-cut.pngbin267 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-delete.pngbin250 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-paste.pngbin272 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-redo.pngbin253 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-undo.pngbin253 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-center.pngbin134 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-fill.pngbin122 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-left.pngbin128 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-right.pngbin134 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-bold.pngbin264 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-italic.pngbin255 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-underline.pngbin186 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin318 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin455 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin393 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin311 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin333 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin416 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin495 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin464 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin346 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin347 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin179 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin156 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin171 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin173 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin430 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin391 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin290 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-new.pngbin2541 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-open.pngbin3865 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-print.pngbin3721 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-save.pngbin2682 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-copy.pngbin3467 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-cut.pngbin5004 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-delete.pngbin5870 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-paste.pngbin4005 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-redo.pngbin2528 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-undo.pngbin2530 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-center.pngbin1599 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-fill.pngbin1475 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-left.pngbin1539 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-right.pngbin1557 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-bold.pngbin3092 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-italic.pngbin2374 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-underline.pngbin2477 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5683 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8174 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8055 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5666 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin7329 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin11388 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin12743 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8485 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5378 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5433 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3855 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3681 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3775 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3756 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin7046 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin6224 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5168 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-new.pngbin318 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-open.pngbin455 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-print.pngbin393 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-save.pngbin311 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-copy.pngbin333 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-cut.pngbin416 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-delete.pngbin495 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-paste.pngbin464 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-redo.pngbin346 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-undo.pngbin347 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-center.pngbin179 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-fill.pngbin156 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-left.pngbin171 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-right.pngbin173 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-bold.pngbin430 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-italic.pngbin391 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-underline.pngbin290 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin588 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin923 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin762 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin565 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin710 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin843 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin954 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin909 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin628 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin608 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin317 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin266 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin298 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin305 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin777 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin657 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin577 -> 0 bytes
-rw-r--r--src/assets/icons/CMakeLists.txt174
-rw-r--r--src/assets/icons/README29
-rw-r--r--src/assets/icons/index.theme46
-rw-r--r--src/assets/icons/scalable/document-new.svg1
-rw-r--r--src/assets/icons/scalable/document-open.svg1
-rw-r--r--src/assets/icons/scalable/document-print.svg1
-rw-r--r--src/assets/icons/scalable/document-save.svg1
-rw-r--r--src/assets/icons/scalable/edit-copy.svg1
-rw-r--r--src/assets/icons/scalable/edit-cut.svg1
-rw-r--r--src/assets/icons/scalable/edit-delete.svg1
-rw-r--r--src/assets/icons/scalable/edit-paste.svg1
-rw-r--r--src/assets/icons/scalable/edit-redo.svg1
-rw-r--r--src/assets/icons/scalable/edit-undo.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-center.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-fill.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-left.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-right.svg1
-rw-r--r--src/assets/icons/scalable/format-text-bold.svg1
-rw-r--r--src/assets/icons/scalable/format-text-italic.svg1
-rw-r--r--src/assets/icons/scalable/format-text-underline.svg1
-rw-r--r--src/corelib/CMakeLists.txt6
-rw-r--r--src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake152
-rw-r--r--src/corelib/Qt6AndroidGradleHelpers.cmake631
-rw-r--r--src/corelib/Qt6AndroidMacros.cmake216
-rw-r--r--src/corelib/Qt6AndroidPermissionHelpers.cmake126
-rw-r--r--src/corelib/Qt6CoreConfigExtras.cmake.in4
-rw-r--r--src/corelib/Qt6CoreMacros.cmake9
-rw-r--r--src/corelib/animation/qabstractanimation.cpp1
-rw-r--r--src/corelib/animation/qabstractanimation.h1
-rw-r--r--src/corelib/animation/qabstractanimation_p.h1
-rw-r--r--src/corelib/animation/qanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qanimationgroup.h1
-rw-r--r--src/corelib/animation/qanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qparallelanimationgroup.h1
-rw-r--r--src/corelib/animation/qparallelanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qpauseanimation.cpp1
-rw-r--r--src/corelib/animation/qpauseanimation.h1
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp1
-rw-r--r--src/corelib/animation/qpropertyanimation.h1
-rw-r--r--src/corelib/animation/qpropertyanimation_p.h1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.h1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qvariantanimation.cpp1
-rw-r--r--src/corelib/animation/qvariantanimation.h1
-rw-r--r--src/corelib/animation/qvariantanimation_p.h1
-rw-r--r--src/corelib/configure.cmake1
-rw-r--r--src/corelib/doc/snippets/CMakeLists.txt13
-rw-r--r--src/corelib/doc/snippets/jni/src_qjniobject.cpp10
-rw-r--r--src/corelib/doc/snippets/qprocess/CMakeLists.txt2
-rw-r--r--src/corelib/doc/src/cmake/qt_add_resources.qdoc4
-rw-r--r--src/corelib/global/qlibraryinfo.cpp1
-rw-r--r--src/corelib/global/qnumeric.cpp1
-rw-r--r--src/corelib/global/qnumeric.h1
-rw-r--r--src/corelib/global/qrandom.cpp1
-rw-r--r--src/corelib/global/qrandom.h1
-rw-r--r--src/corelib/io/qdirentryinfo_p.h2
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp11
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents.mm1
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_win.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_win_p.h1
-rw-r--r--src/corelib/io/qfsfileengine.cpp1
-rw-r--r--src/corelib/io/qfsfileengine_iterator.cpp1
-rw-r--r--src/corelib/io/qfsfileengine_iterator_p.h1
-rw-r--r--src/corelib/io/qfsfileengine_p.h1
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp1
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp1
-rw-r--r--src/corelib/io/qiodevice.cpp8
-rw-r--r--src/corelib/io/qiodevice.h1
-rw-r--r--src/corelib/io/qiodevice_p.h1
-rw-r--r--src/corelib/io/qstandardpaths.cpp1
-rw-r--r--src/corelib/io/qstandardpaths.h1
-rw-r--r--src/corelib/io/qstandardpaths_android.cpp1
-rw-r--r--src/corelib/io/qstandardpaths_haiku.cpp1
-rw-r--r--src/corelib/io/qstandardpaths_mac.mm1
-rw-r--r--src/corelib/io/qstandardpaths_unix.cpp1
-rw-r--r--src/corelib/io/qstandardpaths_win.cpp1
-rw-r--r--src/corelib/io/qstorageinfo.cpp34
-rw-r--r--src/corelib/io/qstorageinfo.h3
-rw-r--r--src/corelib/io/qstorageinfo_linux.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_linux_p.h1
-rw-r--r--src/corelib/io/qstorageinfo_mac.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_p.h1
-rw-r--r--src/corelib/io/qstorageinfo_stub.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_unix.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_win.cpp1
-rw-r--r--src/corelib/io/qtemporaryfile.cpp6
-rw-r--r--src/corelib/io/qurl.cpp32
-rw-r--r--src/corelib/ipc/qsharedmemory.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory.h1
-rw-r--r--src/corelib/ipc/qsharedmemory_p.h1
-rw-r--r--src/corelib/ipc/qsharedmemory_posix.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory_systemv.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory_win.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore.h1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_p.h1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_posix.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_systemv.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_win.cpp1
-rw-r--r--src/corelib/ipc/qtipccommon.cpp1
-rw-r--r--src/corelib/ipc/qtipccommon.h1
-rw-r--r--src/corelib/ipc/qtipccommon_p.h1
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp1
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h1
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel_p.h1
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.cpp1
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel_p.h1
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp1
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp15
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.h2
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel_p.h1
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.cpp1
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.h1
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel_p.h1
-rw-r--r--src/corelib/itemmodels/qrangemodel.cpp1
-rw-r--r--src/corelib/itemmodels/qrangemodel.h1
-rw-r--r--src/corelib/itemmodels/qrangemodel_impl.h38
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp1
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.cpp1
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.h1
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel.cpp1
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel.h1
-rw-r--r--src/corelib/itemmodels/qtransposeproxymodel_p.h1
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp24
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h12
-rw-r--r--src/corelib/kernel/qmetaobject.cpp16
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp20
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h2
-rw-r--r--src/corelib/kernel/qmetatype.cpp112
-rw-r--r--src/corelib/kernel/qmetatype.h3
-rw-r--r--src/corelib/kernel/qmetatype_p.h26
-rw-r--r--src/corelib/kernel/qobject.cpp36
-rw-r--r--src/corelib/kernel/qobject_p.h23
-rw-r--r--src/corelib/kernel/qobject_p_p.h2
-rw-r--r--src/corelib/kernel/qobjectdefs.h6
-rw-r--r--src/corelib/kernel/qproperty.cpp4
-rw-r--r--src/corelib/kernel/qproperty.h38
-rw-r--r--src/corelib/kernel/qtranslator.cpp41
-rw-r--r--src/corelib/kernel/qvariant.cpp5
-rw-r--r--src/corelib/platform/windows/qt_winrtbase_p.h1
-rw-r--r--src/corelib/serialization/qcborarray.cpp20
-rw-r--r--src/corelib/serialization/qcborarray.h2
-rw-r--r--src/corelib/serialization/qcborcommon.h4
-rw-r--r--src/corelib/serialization/qcbormap.cpp20
-rw-r--r--src/corelib/serialization/qcbormap.h2
-rw-r--r--src/corelib/serialization/qcborvalue.cpp2
-rw-r--r--src/corelib/serialization/qxmlstream.cpp12
-rw-r--r--src/corelib/serialization/qxmlstream_p.h2
-rw-r--r--src/corelib/text/qanystringview.cpp113
-rw-r--r--src/corelib/text/qanystringview.h12
-rw-r--r--src/corelib/text/qbytearray.cpp11
-rw-r--r--src/corelib/text/qstring.h3
-rw-r--r--src/corelib/text/qstringalgorithms_p.h7
-rw-r--r--src/corelib/text/qstringlist.cpp2
-rw-r--r--src/corelib/text/qutf8stringview.qdoc2
-rw-r--r--src/corelib/thread/qatomicwait.cpp14
-rw-r--r--src/corelib/thread/qmutex.cpp19
-rw-r--r--src/corelib/time/qdatetime.cpp17
-rw-r--r--src/corelib/time/qtimezonelocale_data_p.h2870
-rw-r--r--src/corelib/tools/qarraydata.cpp17
-rw-r--r--src/corelib/tools/qarraydata.h10
-rw-r--r--src/corelib/tools/qarraydataops.h4
-rw-r--r--src/corelib/tools/qatomicscopedvaluerollback.h28
-rw-r--r--src/corelib/tools/qfreelist_p.h24
-rw-r--r--src/corelib/tools/qhashfunctions.h32
-rw-r--r--src/dbus/qdbusintegrator.cpp15
-rw-r--r--src/dbus/qdbusintegrator_p.h4
-rw-r--r--src/dbus/qdbusthreaddebug_p.h20
-rw-r--r--src/gui/accessible/linux/atspiadaptor.cpp9
-rw-r--r--src/gui/compat/removed_api.cpp13
-rw-r--r--src/gui/image/qimage.cpp14
-rw-r--r--src/gui/image/qimage_conversions.cpp38
-rw-r--r--src/gui/itemmodels/qfileinfogatherer.cpp2
-rw-r--r--src/gui/kernel/qaction.cpp2
-rw-r--r--src/gui/kernel/qguivariant.cpp15
-rw-r--r--src/gui/kernel/qscreen.cpp6
-rw-r--r--src/gui/kernel/qshortcut.cpp2
-rw-r--r--src/gui/math3d/qquaternion.cpp105
-rw-r--r--src/gui/math3d/qquaternion.h32
-rw-r--r--src/gui/painting/qdatabuffer_p.h10
-rw-r--r--src/gui/painting/qdrawhelper.cpp8
-rw-r--r--src/gui/painting/qimagescale.cpp8
-rw-r--r--src/gui/painting/qimagescale_neon.cpp8
-rw-r--r--src/gui/painting/qimagescale_sse4.cpp8
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h4
-rw-r--r--src/gui/painting/qpainter.cpp28
-rw-r--r--src/gui/painting/qpainter.h22
-rw-r--r--src/gui/painting/qtransform.cpp2
-rw-r--r--src/gui/platform/darwin/qapplefileiconengine.mm1
-rw-r--r--src/gui/rhi/qrhi.cpp2
-rw-r--r--src/gui/rhi/qshader.cpp2
-rw-r--r--src/gui/text/qfontdatabase.cpp43
-rw-r--r--src/gui/text/qfontdatabase_p.h2
-rw-r--r--src/gui/text/qtextformat.cpp11
-rw-r--r--src/network/kernel/qnetworkproxy_libproxy.cpp7
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp6
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_p.h1
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp3
-rw-r--r--src/platformsupport/kmsconvenience/qkmsdevice.cpp501
-rw-r--r--src/platformsupport/kmsconvenience/qkmsdevice_p.h25
-rw-r--r--src/plugins/platforms/CMakeLists.txt4
-rw-r--r--src/plugins/platforms/android/CMakeLists.txt5
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.cpp130
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfscontext.cpp6
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfsintegration.cpp4
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfsintegration_p.h1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmcursor_p.h2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp46
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice_p.h1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp42
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration_p.h5
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp58
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen_p.h2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp8
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp35
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice_p.h7
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmseventreader.cpp5
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp21
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen_p.h6
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp5
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style.cpp218
-rw-r--r--src/testlib/3rdparty/valgrind/qt_attribution.json2
-rw-r--r--src/testlib/3rdparty/valgrind/valgrind_p.h537
-rw-r--r--src/testlib/qtestcase.cpp2
-rw-r--r--src/testlib/qtestlog.cpp53
-rw-r--r--src/tools/androiddeployqt/main.cpp26
-rw-r--r--src/tools/androidtestrunner/main.cpp155
-rw-r--r--src/tools/moc/moc.cpp7
-rw-r--r--src/tools/moc/moc.h3
-rw-r--r--src/widgets/accessible/simplewidgets.cpp28
-rw-r--r--src/widgets/accessible/simplewidgets_p.h4
-rw-r--r--src/widgets/itemviews/qheaderview.cpp4
-rw-r--r--src/widgets/kernel/qwidgetsvariant.cpp14
-rw-r--r--src/widgets/styles/qfusionstyle.cpp2
-rw-r--r--src/widgets/styles/qfusionstyle_p_p.h5
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp3
-rw-r--r--src/widgets/widgets/qmainwindowlayout.cpp8
-rw-r--r--src/widgets/widgets/qscrollbar.cpp2
-rw-r--r--tests/auto/cmake/test_qt_extract_metatypes/test_qt_extract_metatypes_project/testdata/qt6metatypetest_metatypesQ_OBJECTandQ_PROPERTY.json1
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp5
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp32
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp29
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp4
-rw-r--r--tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp34
-rw-r--r--tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp40
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp13
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp6
-rw-r--r--tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp38
-rw-r--r--tests/auto/corelib/platform/CMakeLists.txt4
-rw-r--r--tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle2
-rw-r--r--tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp7
-rw-r--r--tests/auto/corelib/text/qlocale/tst_qlocale.cpp16
-rw-r--r--tests/auto/corelib/text/qstring/tst_qstring.cpp3
-rw-r--r--tests/auto/corelib/text/qstringapisymmetry/tst_qstringapisymmetry.cpp15
-rw-r--r--tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp12
-rw-r--r--tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp89
-rw-r--r--tests/auto/gui/kernel/qwindow/BLACKLIST1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp6
-rw-r--r--tests/auto/gui/math3d/qmatrixnxn/tst_qmatrixnxn.cpp2
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp32
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp10
-rw-r--r--tests/auto/other/android/CMakeLists.txt8
-rw-r--r--tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp9
-rw-r--r--tests/auto/other/android/dynamic_feature/CMakeLists.txt33
-rw-r--r--tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt8
-rw-r--r--tests/auto/other/android/dynamic_feature/feature/qtlogo.pngbin0 -> 1214 bytes
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java175
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java92
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java26
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp227
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/storeloader.h65
-rw-r--r--tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp37
-rw-r--r--tests/auto/other/android/package_source_dir/CMakeLists.txt54
-rw-r--r--tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in54
-rw-r--r--tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp47
-rw-r--r--tests/auto/other/android/permissions/CMakeLists.txt23
-rw-r--r--tests/auto/other/android/permissions/tst_android_permissions.cpp80
-rw-r--r--tests/auto/testlib/selftests/CMakeLists.txt9
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.junitxml36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.lightxml36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.tap36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.teamcity18
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.txt36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.xml36
-rw-r--r--tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp2
-rw-r--r--tests/auto/tools/moc/CMakeLists.txt2
-rw-r--r--tests/auto/tools/moc/allmocs_baseline_in.json203
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist1
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro2
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp4
-rw-r--r--tests/auto/tools/qmake/tst_qmake.cpp18
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST1
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp16
-rw-r--r--tests/auto/widgets/kernel/qapplication/BLACKLIST3
-rw-r--r--tests/manual/rhi/rhiwidgetproto/examplewidget.cpp3
-rw-r--r--tests/manual/stereographicsview/mygraphicsview.cpp3
-rwxr-xr-xutil/locale_database/cldr2qlocalexml.py2
-rw-r--r--util/locale_database/localetools.py4
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>
** &nbsp; 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>
** &nbsp; 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
deleted file mode 100644
index 8d86a4827a7..00000000000
--- a/src/assets/icons/128x128/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-open.png b/src/assets/icons/128x128/document-open.png
deleted file mode 100644
index 2183dbbea64..00000000000
--- a/src/assets/icons/128x128/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-print.png b/src/assets/icons/128x128/document-print.png
deleted file mode 100644
index 9e7378aab2a..00000000000
--- a/src/assets/icons/128x128/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-save.png b/src/assets/icons/128x128/document-save.png
deleted file mode 100644
index e8b28406433..00000000000
--- a/src/assets/icons/128x128/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-copy.png b/src/assets/icons/128x128/edit-copy.png
deleted file mode 100644
index 7585f4baa0c..00000000000
--- a/src/assets/icons/128x128/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-cut.png b/src/assets/icons/128x128/edit-cut.png
deleted file mode 100644
index 51ede2fe37e..00000000000
--- a/src/assets/icons/128x128/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-delete.png b/src/assets/icons/128x128/edit-delete.png
deleted file mode 100644
index bdf785c8285..00000000000
--- a/src/assets/icons/128x128/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-paste.png b/src/assets/icons/128x128/edit-paste.png
deleted file mode 100644
index 690ffa172d9..00000000000
--- a/src/assets/icons/128x128/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-redo.png b/src/assets/icons/128x128/edit-redo.png
deleted file mode 100644
index f1c97f71c25..00000000000
--- a/src/assets/icons/128x128/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-undo.png b/src/assets/icons/128x128/edit-undo.png
deleted file mode 100644
index e728cbf6e03..00000000000
--- a/src/assets/icons/128x128/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-center.png b/src/assets/icons/128x128/format-justify-center.png
deleted file mode 100644
index 44ceb2af4d5..00000000000
--- a/src/assets/icons/128x128/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-fill.png b/src/assets/icons/128x128/format-justify-fill.png
deleted file mode 100644
index b99a8507046..00000000000
--- a/src/assets/icons/128x128/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-left.png b/src/assets/icons/128x128/format-justify-left.png
deleted file mode 100644
index 2b63887b495..00000000000
--- a/src/assets/icons/128x128/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-right.png b/src/assets/icons/128x128/format-justify-right.png
deleted file mode 100644
index 6c61889d595..00000000000
--- a/src/assets/icons/128x128/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-bold.png b/src/assets/icons/128x128/format-text-bold.png
deleted file mode 100644
index 96a5ca88a22..00000000000
--- a/src/assets/icons/128x128/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-italic.png b/src/assets/icons/128x128/format-text-italic.png
deleted file mode 100644
index 2bb71b4a4d3..00000000000
--- a/src/assets/icons/128x128/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-underline.png b/src/assets/icons/128x128/format-text-underline.png
deleted file mode 100644
index ecf6830c929..00000000000
--- a/src/assets/icons/128x128/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 32776b51a96..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 06e188b93b9..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 644e3c149af..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 16fa70493a2..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index b18bead117f..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index d9454cebf1c..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 4081cdb2ca7..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 3358426818d..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index e28b28542c6..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index fe10f57a398..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index d4ad74b0d07..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index bf0dd84bbb0..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index dde68c8514a..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 8a5e7518bdc..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 665d3ce37b5..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 4b6846a6b98..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 601f73216a3..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-new.png b/src/assets/icons/16x16/document-new.png
deleted file mode 100644
index 893e7e1aec4..00000000000
--- a/src/assets/icons/16x16/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-open.png b/src/assets/icons/16x16/document-open.png
deleted file mode 100644
index b07906f40bd..00000000000
--- a/src/assets/icons/16x16/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-print.png b/src/assets/icons/16x16/document-print.png
deleted file mode 100644
index 9341060076f..00000000000
--- a/src/assets/icons/16x16/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-save.png b/src/assets/icons/16x16/document-save.png
deleted file mode 100644
index 6238718191b..00000000000
--- a/src/assets/icons/16x16/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-copy.png b/src/assets/icons/16x16/edit-copy.png
deleted file mode 100644
index 585f5bfc8d8..00000000000
--- a/src/assets/icons/16x16/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-cut.png b/src/assets/icons/16x16/edit-cut.png
deleted file mode 100644
index 661ef1ad030..00000000000
--- a/src/assets/icons/16x16/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-delete.png b/src/assets/icons/16x16/edit-delete.png
deleted file mode 100644
index 7b5998df8a4..00000000000
--- a/src/assets/icons/16x16/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-paste.png b/src/assets/icons/16x16/edit-paste.png
deleted file mode 100644
index 6318a22caf3..00000000000
--- a/src/assets/icons/16x16/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-redo.png b/src/assets/icons/16x16/edit-redo.png
deleted file mode 100644
index 7eb10fe899c..00000000000
--- a/src/assets/icons/16x16/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-undo.png b/src/assets/icons/16x16/edit-undo.png
deleted file mode 100644
index 108712547cb..00000000000
--- a/src/assets/icons/16x16/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-center.png b/src/assets/icons/16x16/format-justify-center.png
deleted file mode 100644
index 6b0951fa5dd..00000000000
--- a/src/assets/icons/16x16/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-fill.png b/src/assets/icons/16x16/format-justify-fill.png
deleted file mode 100644
index 6e1c10d7c45..00000000000
--- a/src/assets/icons/16x16/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-left.png b/src/assets/icons/16x16/format-justify-left.png
deleted file mode 100644
index 9dfdc89b68a..00000000000
--- a/src/assets/icons/16x16/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-right.png b/src/assets/icons/16x16/format-justify-right.png
deleted file mode 100644
index 36a52081f18..00000000000
--- a/src/assets/icons/16x16/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-bold.png b/src/assets/icons/16x16/format-text-bold.png
deleted file mode 100644
index a079317a947..00000000000
--- a/src/assets/icons/16x16/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-italic.png b/src/assets/icons/16x16/format-text-italic.png
deleted file mode 100644
index 04202b2842f..00000000000
--- a/src/assets/icons/16x16/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-underline.png b/src/assets/icons/16x16/format-text-underline.png
deleted file mode 100644
index a80368212d8..00000000000
--- a/src/assets/icons/16x16/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 482ae52024e..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 9858b146f44..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 1672ec58971..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index f04de746731..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index bbb34cc4c22..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index d89ef6c0167..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 4c97ee24952..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 299fa776867..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 4f8849c7110..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index b3d366c53f6..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 80c3afd9a6e..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 33589ea25d0..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index ba028211355..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 8e15d0cb44f..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 754efdd9755..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 6db31a4f697..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 977cde9d974..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-new.png b/src/assets/icons/256x256/document-new.png
deleted file mode 100644
index 32776b51a96..00000000000
--- a/src/assets/icons/256x256/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-open.png b/src/assets/icons/256x256/document-open.png
deleted file mode 100644
index 06e188b93b9..00000000000
--- a/src/assets/icons/256x256/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-print.png b/src/assets/icons/256x256/document-print.png
deleted file mode 100644
index 644e3c149af..00000000000
--- a/src/assets/icons/256x256/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-save.png b/src/assets/icons/256x256/document-save.png
deleted file mode 100644
index 16fa70493a2..00000000000
--- a/src/assets/icons/256x256/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-copy.png b/src/assets/icons/256x256/edit-copy.png
deleted file mode 100644
index b18bead117f..00000000000
--- a/src/assets/icons/256x256/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-cut.png b/src/assets/icons/256x256/edit-cut.png
deleted file mode 100644
index d9454cebf1c..00000000000
--- a/src/assets/icons/256x256/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-delete.png b/src/assets/icons/256x256/edit-delete.png
deleted file mode 100644
index 4081cdb2ca7..00000000000
--- a/src/assets/icons/256x256/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-paste.png b/src/assets/icons/256x256/edit-paste.png
deleted file mode 100644
index 3358426818d..00000000000
--- a/src/assets/icons/256x256/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-redo.png b/src/assets/icons/256x256/edit-redo.png
deleted file mode 100644
index e28b28542c6..00000000000
--- a/src/assets/icons/256x256/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-undo.png b/src/assets/icons/256x256/edit-undo.png
deleted file mode 100644
index fe10f57a398..00000000000
--- a/src/assets/icons/256x256/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-center.png b/src/assets/icons/256x256/format-justify-center.png
deleted file mode 100644
index d4ad74b0d07..00000000000
--- a/src/assets/icons/256x256/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-fill.png b/src/assets/icons/256x256/format-justify-fill.png
deleted file mode 100644
index bf0dd84bbb0..00000000000
--- a/src/assets/icons/256x256/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-left.png b/src/assets/icons/256x256/format-justify-left.png
deleted file mode 100644
index dde68c8514a..00000000000
--- a/src/assets/icons/256x256/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-right.png b/src/assets/icons/256x256/format-justify-right.png
deleted file mode 100644
index 8a5e7518bdc..00000000000
--- a/src/assets/icons/256x256/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-bold.png b/src/assets/icons/256x256/format-text-bold.png
deleted file mode 100644
index 665d3ce37b5..00000000000
--- a/src/assets/icons/256x256/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-italic.png b/src/assets/icons/256x256/format-text-italic.png
deleted file mode 100644
index 4b6846a6b98..00000000000
--- a/src/assets/icons/256x256/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-underline.png b/src/assets/icons/256x256/format-text-underline.png
deleted file mode 100644
index 601f73216a3..00000000000
--- a/src/assets/icons/256x256/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index bfec6d0e6d1..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 630a05f622c..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index c8611c31c49..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 6f460959818..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 2f350041a05..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index e11cf6d2347..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index efe6b90bf59..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 32f54b39598..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 1f6e366535b..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 980ed370621..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index af7044ddee1..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index da14563bd68..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index c1025bf0102..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 3a07e06e0f3..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index b0f4cb09958..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 85f0cfc1d65..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 51ee0aa7783..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-new.png b/src/assets/icons/32x32/document-new.png
deleted file mode 100644
index 482ae52024e..00000000000
--- a/src/assets/icons/32x32/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-open.png b/src/assets/icons/32x32/document-open.png
deleted file mode 100644
index 9858b146f44..00000000000
--- a/src/assets/icons/32x32/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-print.png b/src/assets/icons/32x32/document-print.png
deleted file mode 100644
index 1672ec58971..00000000000
--- a/src/assets/icons/32x32/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-save.png b/src/assets/icons/32x32/document-save.png
deleted file mode 100644
index f04de746731..00000000000
--- a/src/assets/icons/32x32/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-copy.png b/src/assets/icons/32x32/edit-copy.png
deleted file mode 100644
index bbb34cc4c22..00000000000
--- a/src/assets/icons/32x32/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-cut.png b/src/assets/icons/32x32/edit-cut.png
deleted file mode 100644
index d89ef6c0167..00000000000
--- a/src/assets/icons/32x32/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-delete.png b/src/assets/icons/32x32/edit-delete.png
deleted file mode 100644
index 4c97ee24952..00000000000
--- a/src/assets/icons/32x32/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-paste.png b/src/assets/icons/32x32/edit-paste.png
deleted file mode 100644
index 299fa776867..00000000000
--- a/src/assets/icons/32x32/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-redo.png b/src/assets/icons/32x32/edit-redo.png
deleted file mode 100644
index 4f8849c7110..00000000000
--- a/src/assets/icons/32x32/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-undo.png b/src/assets/icons/32x32/edit-undo.png
deleted file mode 100644
index b3d366c53f6..00000000000
--- a/src/assets/icons/32x32/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-center.png b/src/assets/icons/32x32/format-justify-center.png
deleted file mode 100644
index 80c3afd9a6e..00000000000
--- a/src/assets/icons/32x32/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-fill.png b/src/assets/icons/32x32/format-justify-fill.png
deleted file mode 100644
index 33589ea25d0..00000000000
--- a/src/assets/icons/32x32/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-left.png b/src/assets/icons/32x32/format-justify-left.png
deleted file mode 100644
index ba028211355..00000000000
--- a/src/assets/icons/32x32/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-right.png b/src/assets/icons/32x32/format-justify-right.png
deleted file mode 100644
index 8e15d0cb44f..00000000000
--- a/src/assets/icons/32x32/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-bold.png b/src/assets/icons/32x32/format-text-bold.png
deleted file mode 100644
index 754efdd9755..00000000000
--- a/src/assets/icons/32x32/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-italic.png b/src/assets/icons/32x32/format-text-italic.png
deleted file mode 100644
index 6db31a4f697..00000000000
--- a/src/assets/icons/32x32/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-underline.png b/src/assets/icons/32x32/format-text-underline.png
deleted file mode 100644
index 977cde9d974..00000000000
--- a/src/assets/icons/32x32/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index c9245760612..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 68e75b549a0..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index b7843367393..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index f4cca4b3238..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 9690d6bb041..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 408b0ae19b0..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 58abfc1fa53..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index b8c288f6c70..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 89fcd33c300..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 6f7ad2cb402..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 9b2cc1ed160..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 1212e9f7613..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 8c0eca3037e..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index fb0ed702525..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 0e67ead0b8c..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index f746f8956f8..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 47d6fced026..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
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
- 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
- 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
new file mode 100644
index 00000000000..b63f1384b11
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/feature/qtlogo.png
Binary files differ
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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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&lt;=&gt;() 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()